1. 程式人生 > >nginx全部知識(讓你窮光蛋秒變負二代,Come on!)

nginx全部知識(讓你窮光蛋秒變負二代,Come on!)

其實吧,有時候很多東西在日常工作中不肯接觸,所以就會忘得特別的快,工作中剛有需要,嚇得我趕緊撿起來,檔案內容比較長,想有點進步,請耐心看

今天主要記錄下Nginx的這幾個方面:

  1. 《原理 》關於反向代理和正向代理和負載均衡
  2. 《瞭解》常用Web伺服器介紹
  3. 《瞭解》Nginx、Apache、Tomcat之間的區別以及聯絡
  4. 《瞭解》Nginx安裝部署
  5. 《重要》Nginx核心配置分析
  6. 《熟練》虛擬主機的配置
  7. 《熟練》Location匹配規則剖析Rewrite的使用
  8. 《熟練》關於Nginx日誌配置和及切割處理
  9. 《瞭解》快取配置及Gzip配置 10.《重要》負載均衡配置說明 11.《原理》《重要》Nginx的程序模型 12.《瞭解》Nginx+keepalived

《原理》關於反向代理和負載均衡

說到代理,很多人都會有疑問,為什麼會有代理,換句話說也就是代理的好處。 現在微信活的不要不要的,很多商人都會發展下線,邀請很多人加盟,這些人也就是所謂的代理(好處:人多力量大,賺錢更快),既然這樣,我們的伺服器代理又會有什麼好處呢?

  • 提高訪問效率
       你訪問的目標伺服器會存在代理伺服器中,這樣就能夠起到瀏覽器的快取作用,下次訪問效率更高
  • 突破訪問限制
       就比如你要訪問國外的谷歌或者一些其他翻牆的軟體
  • 更加安全
       可以給直接訪問的使用者隱藏自己的IP,也可以過濾一些不太友好的訪問
a)正向代理:

既然聊到了反向代理,我們就先了解正向代理。(那生活中的例子說事) 一個女生A喜歡梵蒂岡口紅,但是她並不知道那個廠C商購買,有一天啊,她發現了朋友圈中有一個做微商的B,然後他就直接去找B這個人。 (本來A是去找C的,但是找不到C,找到了B,B在這裡就擔任的是代理的角色)

b).反向代理:

拿我公司的情況說事吧(中國銀聯) 公司有三臺伺服器,然後比如說啊,我和同事需要訪問中國銀聯的時候,有四臺伺服器,誰也不能確定訪問的是那臺伺服器(上圖說話) 在這裡插入圖片描述

main:用於進行nginx全域性資訊的配置
events:用於nginx工作模式的配置
http:用於進行http協議資訊的一些配置
server:用於進行伺服器訪問資訊的配置
location:用於進行訪問路由的配置
upstream:用於進行負載均衡的配置

當你需要重啟nginx的時候,可以先執行./nginx -t (檢驗你的語法是否錯誤的)

在這裡插入圖片描述 正向代理和反向代理的區別: a).正向代理主要是針對客戶端的,反向代理主要是針對伺服器端的 b).反向代理能夠實現高併發,以減少伺服器的壓力 c).正向代理是夠對目標伺服器隱藏資訊,反向代理能夠隱藏客戶不知道訪問的是那臺伺服器(這樣說 有點不太合適感覺)

c).負載均衡

負載均衡是建立在反向代理基礎之上的,他最大的作用就是為了減輕伺服器的訪問壓力。

常見的方法都有:
weight(權重)

指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。如下所示,10.0.0.88的訪問比率要比10.0.0.77的訪問比率高一倍。

upstream linuxidc{ server 10.0.0.77 weight=5; server 10.0.0.88 weight=10; }

ip_hash(訪問ip)

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。

upstream favresin{ ip_hash; server 10.0.0.10:8080; server 10.0.0.11:8080; }

fair(第三方)

按後端伺服器的響應時間來分配請求,響應時間短的優先分配。與weight分配策略類似。

upstream favresin{ server 10.0.0.10:8080; server 10.0.0.11:8080; fair; }

url_hash(第三方)

按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。

注意:在upstream中加入hash語句,server語句中不能寫入weight等其他的引數,hash_method是使用的hash演算法。

upstream resinserver{ server 10.0.0.10:7777; server 10.0.0.11:8888; hash $request_uri; hash_method crc32; }

upstream還可以為每個裝置設定狀態值,這些狀態值的含義分別如下:

down 表示單前的server暫時不參與負載.

weight 預設為1.weight越大,負載的權重就越大。

max_fails :允許請求失敗的次數預設為1.當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤.

fail_timeout : max_fails次失敗後,暫停的時間。

backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

upstream bakend{ #定義負載均衡裝置的Ip及裝置狀態 ip_hash; server 10.0.0.11:9090 down; server 10.0.0.11:8080 weight=2; server 10.0.0.11:6060; server 10.0.0.11:7070 backup; }

二.常見的Web伺服器 對於我來說常見的有tomcat,nginx,Apache,Jetty等等其他的(weblogic,jboss,沒有用過) 他們之間的區別以及聯絡又是什麼呢?

我總結為如下: tomcat作為的是作為的是servlet容器,而nginx和Apache作為的是http server

比對下nginx和apache之間的區別以及聯絡:

Nginx

  1. 輕量級,採用 C 進行編寫,同樣的 web 服務,會佔用更少的記憶體及資源
  2. 抗併發,nginx 以 epoll and kqueue 作為開發模型,處理請求是非同步非阻塞的,負載能力比 apache 高很多,而 apache 則是阻塞型的。在高併發下 nginx 能保持低資源低消耗高效能 ,而 apache 在 PHP 處理慢或者前端壓力很大的情況下,很容易出現程序數飆升,從而拒絕服務的現象。
  3. nginx 處理靜態檔案好,靜態處理效能比 apache 高三倍以上
  4. nginx 的設計高度模組化,編寫模組相對簡單
  5. nginx 配置簡潔,正則配置讓很多事情變得簡單,而且改完配置能使用 -t 測試配置有沒有問題,apache 配置複雜 ,重啟的時候發現配置出錯了,會很崩潰
  6. nginx 作為負載均衡伺服器,支援 7 層負載均衡
  7. nginx 本身就是一個反向代理伺服器,而且可以作為非常優秀的郵件代理伺服器
  8. 啟動特別容易, 並且幾乎可以做到 7*24 不間斷執行,即使執行數個月也不需要重新啟動,還能夠不間斷服務的情況下進行軟體版本的升級
  9. 社群活躍,各種高效能模組出品迅速

Apache

  1. apache 的 rewrite 比 nginx 強大,在 rewrite 頻繁的情況下,用 apache
  2. apache 發展到現在,模組超多,基本想到的都可以找到
  3. apache 更為成熟,少 bug ,nginx 的 bug 相對較多
  4. apache 超穩定
  5. apache 對 PHP 支援比較簡單,nginx 需要配合其他後端用
  6. apache 在處理動態請求有優勢,nginx 在這方面是雞肋,一般動態請求要 apache 去做,nginx 適合靜態和反向。
  7. apache 仍然是目前的主流,擁有豐富的特性,成熟的技術和開發社群

三.Nginx下載以及配置

我們從官網下載穩定版本的nginx,http://nginx.org/,當前的穩定版本是nginx-1.12.2,我們下載nginx-1.12.2.tar.gz,並上傳到linux伺服器上面。

然後解壓nginx原始碼包

tar -xvzf nginx-1.12.2.tar.gz

解壓後進入nginx目錄,

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module

–prefix指定安裝目錄/usr/local/nginx,–with-http_stub_status_module:支援nginx狀態查詢, –with-http_ssl_module:支援https,–with-XXX表示啟用某個功能模組,–without-XXX則表示禁用某個功能模組。

然後編譯安裝

make
make install

完成安裝後進入/usr/local/nginx/sbin目錄,啟動nginx

[rootUAT-OW-WEB-02 sbin sbin]# ./nginx -c

以下幾條命令是常用的 停止nginx

./nginx -s stop

重啟nginx

./nginx -s reopen

檢查nginx.conf配置檔案的正確性

./nginx -t

重新載入配置檔案

./nginx -s reload

檢視nginx命令

ps -ef | grep nginx

Nginx虛擬配置:

注意:首先需要C:\Windows\System32\drivers\etc配置下host 在這裡插入圖片描述 虛擬主機配置最主要的兩種方法: a)基於域名(我們目前使用的方法) 在這裡插入圖片描述 b).基於埠

關於location和rewrite語法:

a)關於location

location ~* /js/.*/\.js
以 = 開頭,表示精確匹配;如只匹配根目錄結尾的請求,後面不能帶任何字串。
以^~ 開頭,表示uri以某個常規字串開頭,不是正則匹配
以~ 開頭,表示區分大小寫的正則匹配;
以~* 開頭,表示不區分大小寫的正則匹配
以/ 開頭,通用匹配, 如果沒有其它匹配,任何請求都會匹配到
關於Location 後邊加"/“和不加”/"的區別

首先是location進行的是模糊匹配 比如要訪問的是localhost:8080/abc/def下邊的目錄 a).不加“/”的時候,還以訪問defg,/defgh,/defghi 等等 b).加"/"的時候,只能訪問的的是abc/def/anything路徑

location匹配原則:

在這裡插入圖片描述

關於rewrite匹配規則:

rewrite功能就是使用nginx提供的全域性變數或自己設定的變數,結合正則表示式和標誌位實現url重寫以及重定向。

《瞭解》關於Nginx日誌配置和及切割處理

主要兩種方式:

log_format: access_log: 日誌級別:debug|info|notice|warn|error|crit|alert|emerg

《瞭解》快取配置及Gzip配置

這兩個配置都是為了提高訪問效率的,GZip主要是針對一些比較大的圖片進行壓縮。

# 開啟gzip
gzip on;
# 啟用gzip壓縮的最小檔案,小於設定值的檔案將不會壓縮
gzip_min_length 1k;
# gzip 壓縮級別,1-10,數字越大壓縮的越好,也越佔用CPU時間,後面會有詳細說明
gzip_comp_level 2;
# 進行壓縮的檔案型別。javascript有多種形式。其中的值可以在 mime.types 檔案中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml;
# 是否在http header中新增Vary: Accept-Encoding,建議開啟
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";

# 開啟快取
location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ { 
    access_log   off; 
    expires      30d;
}
注意點:
  1. 圖片、mp3這樣的二進位制檔案,沒必要做壓縮處理,因為這類檔案壓縮比很小,壓縮過程會耗費CPU資源
  2. 太小的檔案沒必要壓縮,因為壓縮以後會增加一些頭資訊,反而導致檔案變大
  3. Nginx預設只對text/html進行壓縮 ,如果要對html之外的內容進行壓縮傳輸,我們需要手動來配置

《重要》負載均衡配置說明

貼一段程式碼:至於什麼作用我就不一一說明了

#######注意:每個結束的地方都必須有分號#######
#user administrator administrators;  #配置使用者或者組,預設為nobody nobody。
#worker_processes 2;  #允許生成的程序數,預設為1
#pid /nginx/pid/nginx.pid;   #指定nginx程序執行檔案存放地址
error_log log/error.log debug;  #制定日誌路徑,級別。這個設定可以放入全域性塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #設定網路連線序列化,防止驚群現象發生,預設為on
    multi_accept on;  #設定一個程序是否同時接受多個網路連線,預設為off
    #use epoll;      #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大連線數,預設為512
}
http {
    include       mime.types;   #副檔名與檔案型別對映表
    default_type  application/octet-stream; #預設檔案型別,預設為text/plain
    #access_log off; #取消服務日誌    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
    access_log log/access.log myFormat;  #combined為日誌格式的預設值
    sendfile on;   #允許sendfile方式傳輸檔案,預設為off,可以在http塊,server塊,location塊。
    sendfile_max_chunk 100k;  #每個程序每次呼叫傳輸數量不能大於設定的值,預設為0,即不設上限。
    keepalive_timeout 65;  #連線超時時間,預設為75s,可以在http,server,location塊。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #熱備
    }
    error_page 404 https://www.baidu.com; #錯誤頁
    server {
        keepalive_requests 120; #單連線請求上限次數。
        listen       4545;   #監聽埠
        server_name  127.0.0.1;   #監聽地址       
        location  ~*^.+$ {       #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫。
           #root path;  #根目錄
           #index vv.txt;  #設定預設頁
           proxy_pass  http://mysvr;  #請求轉向mysvr 定義的伺服器列表
           deny 127.0.0.1;  #拒絕的ip
           allow 172.18.5.54; #允許的ip           
        } 
    }
}

《原理》《重要》Nginx的程序模型

master程序:

充當整個程序組與使用者的互動介面,同時對程序進行監護。它不需要處理網路事件,不負責業務的執行,只會通過管理work程序來實現重啟服務、平滑升級、更換日誌檔案、配置檔案實時生效等功能。主要是用來管理worker程序

  1. 接收來自外界的訊號 (前面提到的 kill -HUP 訊號等) 我們要控制nginx,只需要通過kill向master程序傳送訊號就行了。比如kill -HUP pid,則是告訴nginx,從容地重啟nginx,我們一般用這個訊號來重啟nginx,或重新載入配置,因為是從容地重啟,因此服務是不中斷的。master程序在接收到HUP訊號後是怎麼做的呢?首先master程序在接到訊號後,會先重新載入配置檔案,然後再啟動新的worker程序,並向所有老的worker程序傳送訊號,告訴他們可以光榮退休了。新的worker在啟動後,就開始接收新的請求,而老的worker在收到來自master的訊號後,就不再接收新的請求,並且在當前程序中的所有未處理完的請求處理完成後,再退出
  2. 向各個worker程序傳送訊號
  3. 監控worker程序的執行狀態
  4. 當worker程序退出後(異常情況下),會自動重新啟動新的worker程序

worker程序:

woker程序主要用來處理網路事件,各個woker程序之間是對等且相互獨立的,它們同等競爭來自客戶端的請求,一個請求只可能在一個woker程序中處理,woker程序個數一般設定為機器CPU核數。 在這裡插入圖片描述

《瞭解》Nginx+keepalived

global_defs {
    notification_email {
        [email protected]
    }
    notification_email_from [email protected]
    smtp_server smtp.hysec.com
    smtp_connection_timeout 30
    router_id nginx_master        # 設定nginx master的id,在一個網路應該是唯一的
}
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh"    #最後手動執行下此指令碼,以確保此指令碼能夠正常執行
    interval 2                          #(檢測指令碼執行的間隔,單位是秒)
    weight 2
}
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,MASTER為主,BACKUP為備
    interface eth0            # 當前進行vrrp通訊的網路介面卡(當前centos的網絡卡)
    virtual_router_id 66        # 虛擬路由編號,主從要一直
    priority 100            # 優先順序,數值越大,獲取處理請求的優先順序越高
    advert_int 1            # 檢查間隔,預設為1s(vrrp組播週期秒數)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
    chk_http_port            #(呼叫檢測指令碼)
    }
    virtual_ipaddress {
        192.168.0.200            # 定義虛擬ip(VIP),可多設,每行一個
    }
}

幸運也好,努力也罷,默默無聞又怎樣,這都是我們每個人不同的抉擇。 經歷過好幾天的加班,給總結出來的,雖然眼睛卻是很累,但是慢慢的,我想我會堅持慢慢來寫的,就算是自己的學習成果罷了,好好加油。

文章來源網路,版權歸作者本人所有,如侵犯到原作者權益,請與我們聯絡刪除或授權事宜如果有誤,請聯絡作者更改,謝謝,本人微信:void666666