Nginx基礎02:組態檔nginx.conf(Part1)

2023-02-23 12:00:45

我們使用Nginx主要是通過其組態檔nginx.conf來實現的。按照一定的規則,編寫特定的指令,可以幫助我們實現對Web服務的控制!所以,學習Nginx的用法,幾乎就是學習nginx.conf!

如何使用本篇文章

  • 本文作為一篇高度總結和羅列nginx.conf中所有的基礎設定項,循規蹈矩地按照文章的順序閱讀的方式不可取
  • 筆者建議所有讀者,先看目錄,掌握Nginx都有哪些基礎的設定塊,再想要了解那一個設定塊時,再詳細去看
  • 作為一篇字典類的文章,建議讀者善用瀏覽器的全文查詢功能,按Ctrl + F調出查詢功能,搜尋你感興趣的關鍵字,針對性地學習

內容導覽

nginx.conf的基本結構

  • 組態檔一共由三部分組成,分別為全域性塊、events塊和http塊。
  • 在http塊中,又包含http全域性塊、多個server塊。
  • 每個server塊中,可以包含server全域性塊和多個location塊。
  • 在同一設定塊中巢狀的設定塊,各個之間不存在次序關係。
  • 牢牢把握住這張圖,可以幫助初學者快速建立起對nginx.conf的初步印象

nginx.conf檔案在哪裡?

  • windows平臺下,該組態檔在其封包的conf目錄
  • CentOS7平臺,如果使用原始碼安裝,則組態檔也在安裝位置的conf目錄下;如果使用yum安裝,則組態檔在/etc/nginx/目錄
  • 全域性查詢nginx.conf檔案:find / -name nginx.conf

組態檔的語法規則:

  • 組態檔由指令與指令塊構成;
  • 每條指令以 ; 分號結尾,指令與引數間以空格符號分隔;
  • 指令塊以 {} 大括號將多條指令組織在一起
  • include 語句允許組合多個設定檔案以提升可維護性;
  • 使用 # 符號新增註釋,提高可讀性;
  • 使用 $ 符號使用變數
  • 部分指令的引數支援正則表示式;

全域性設定塊

設定一些影響Nginx伺服器整體執行的設定指令,這些指令的作用域是Nginx伺服器全域性。

user

user user [group];

  • user:指定可以執行Nginx的使用者
  • group:指定可以執行Nginx的使用者組(可選項)

如果user指令不設定或者設定為user nobody nobody,則預設所有使用者都可以啟動Nginx程序。

該屬性也可以在編譯的時候指定,語法如下`./configure --user=user --group=group`,如果兩個地方都進行了設定,最終生效的是組態檔中的設定。

worker_processes

master_process on|of (預設on)

  • 是否以master/worker方式進行工作,在實際的環境中 nginx是以一個master程序管理多個worker程序的方式執行的。
  • 關閉後nginx就不會fork出worker子程序來處理請求,而是用master程序自身來處理請求,即使用"worker_processes number"所指定程序數;

worker_processes 個數;

  • 指定工作程序的個數,預設是1個。
  • 具體可以根據伺服器cpu數量進行設定,比如cpu有4個,可以設定為4。
  • 如果不知道cpu的數量,可以設定為auto,nginx會自動判斷伺服器的cpu個數,並設定相應的程序數。

當worker_process設定為3時

其他

daemon on|off (預設值on)

  • 是否以守護行程(脫離Terminal在後臺執行)的方式執行nginx,關閉守護行程執行的方式可以讓我們方便偵錯nginx

pid PID檔案路徑(例如:logs/nginx.pid);

  • 用來設定Nginx當前master程序的程序號ID儲存的檔案路徑
  • 該屬性可以通過`./configure --pid-path=PATH`來指定

error_log 檔案路徑 [紀錄檔級別];

  • 記錄錯誤資訊的紀錄檔
  • 紀錄檔級別的值有:debug|info|notice|warn|error|crit|alert|emerg,翻譯過來為試|資訊|通知|警告|錯誤|臨界|警報|緊急
  • 建議大家設定的時候不要設定成info以下的等級,因為會帶來大量的磁碟I/O消耗,影響Nginx的效能。
  • 該屬性可以通過`./configure --error-log-path=PATH`來指定

events塊

events塊的主要功能:

  • 設定Nginx伺服器與使用者網路連線
  • 這一部分的指令對Nginx伺服器的效能影響較大,在實際設定中應該根據實際情況靈活調整。

accept_mutex on | off;

  • 當某一時刻只有一個連線到來時,多個睡眠程序會被同時叫醒,但只有一個程序可獲得連線。如果每次喚醒的程序數目太多,會影響一部分系統效能。
  • 預設是開啟狀態,開啟後將會對多個Nginx程序接收連線進行序列化,防止多個程序對連線的爭搶

multi_accept on|off;

  • 設定是否允許同時接收多個網路連線
  • 如果multi_accept被禁止了,nginx一個工作程序只能同時接受一個新的連線

worker_connections 數位;

  • 設定允許每一個worker process(工作程序)的最大連線數,當每個工作程序接受的連線數超過這個值時將不再接收連線
  • 預設值為512
  • 當所有的工作程序都接收滿時,連線進入logback,logback滿後連線被拒絕

use 網路IO模型;

  • method可選擇的內容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport
  • 使用linux核心在6以上,就是為了能使用epoll,提高Nginx的效能

http塊

http塊主要定義與http服務相關的設定

http全域性

include mime.types;

  • 包含進HTTP的ContentType
  • 可以自定義一些ContentType,包含進來

default_type application/octet-stream;

  • 設定預設響應型別,如果不加此指令,預設值為text/plain
  • 此指令還可以在http塊、server塊或者location塊中進行設定

公有設定

add_header name value [always];

  • 功能:新增指定的響應頭和響應值。
  • 位置:http, server, location

keepalive

keepalive_timeout timeout [header_timeout]

  • 設定連線超時時間,Nginx與使用者建立對談連線後,超過多少時間後斷開
  • 為什麼要使用keepalive?
    • HTTP是一種無狀態協定,使用者端向伺服器端傳送一個TCP請求,伺服器端響應完畢後斷開連線。
    • 如果使用者端在短時間內向伺服器端傳送多個請求,對於每個請求都建立一個TCP連結,那麼將會產生TCP連線爆炸
    • Keepalive指定了在一段時間內都保持連線狀態,可以複用TCP鏈路
  • 例如:keepalive_timeout 120s 100s:下面設定的含義是,在伺服器端保持連線的時間設定為120 s,發給使用者端的應答報文頭部中Keep-Alive域的超時時間設定為100 s。
  • 位置:http, server, location

keepalive_requests number;

  • 設定一個keep-alive連線使用的次數
  • 預設是100
  • 位置:http, server, location

resolver_timeout time;

  • 解析超時時間
  • 預設值:30s
  • 使用欄位:http, server, location
  • 例子:resolver_timeout 5s;

靜態資源優化設定

sendfile on | o(預設值);

  • 開啟高效的檔案傳輸模式
  • 等價於「0拷貝思想」
  • 位置:http, server, location

sendfile_max_chunk 資料量大小size(單位kb);

  • 設定sendfile最巨量資料量
  • size值如果大於0,Nginx程序的每個worker process每次呼叫sendfile()傳輸的資料量最大不能超過這個值(這裡是128k,所以每次不能超過128k);如果設定為0,則無限制。預設值為0。

tcp_nopush on|off(預設值);

  • 該指令必須在sendfile開啟的狀態下才會生效,主要是用來提升網路包的傳輸'效率'
  • 主要思想:要傳送的資料先放在緩衝區(no push),等緩衝區滿了再發
  • 位置:http, server, location

tcp_nodelay on(預設值)|off;

  • 該指令必須在keep-alive連線開啟的情況下才生效,來提高網路包傳輸的'實時性'
  • 主要思想:一有資料就傳送,沒有任何延時(no delay)
  • 位置:http, server, location

  • "tcp_nopush"和」tcp_nodelay「看起來是"互斥的",那麼為什麼要將這兩個值都開啟,這個大家需要知道的是在5.9以後的版本中兩者是可以相容
  • 三個指令都開啟的好處是,sendfile可以開啟高效的檔案傳輸模式,tcp_nopush開啟可以確保在傳送到使用者端之前封包已經充分「填滿」, 這大大減少了網路開銷,並加快了檔案傳送的速度。
  • 然後,當它到達最後一個可能因為沒有「填滿」而暫停的封包時,Nginx會忽略tcp_nopush引數, 然後,tcp_nodelay強制通訊端傳送資料。
  • 由此可知,tcp_nopush可以與tcp_nodelay一起設定,它比單獨設定tcp_nodelay具有更強的效能。

最佳實踐:在http共有設定引數中全部開啟

  • sendfile on;
  • tcp_nopush on;
  • tcp_nodelay on;

靜態資源的壓縮

功能:將Nginx服務中的靜態資源進行壓縮,再傳送給Client(例如Chrome),減少網路傳輸量,提高傳輸速率和效率

基於ngx_http_gzip_module模組(已自動安裝)的靜態資源壓縮

gzip on|off(預設);

  • 開啟或者關閉gzip功能
  • 以下的gzip相關指令,只有gzip為on,才有效果

gzip_types mime-type ...;

  • 指定對那種型別的檔案進行壓縮
  • 多個型別之間使用空格隔開,可以使用萬用字元(*:表示全部型別)
  • 預設值:gzip_types text/html;
  • 例如:
http{
	gzip on; #開啟
	gzip_types application/javascript; #指定對JS檔案進行壓縮
}

gzip_comp_level level;

  • 設定Gzip壓縮程度,級別從1-9。數位越低,壓縮程度越低,壓縮效率越高
  • 預設值:gzip_comp_level 1;

gzip_vary on|off(預設值);

  • 用於設定使用Gzip進行壓縮傳送是否攜帶「Vary:Accept-Encoding」頭域的響應頭部。
  • 主要是告訴接收方,所傳送的資料經過了Gzip壓縮處理

gzip_buffers number size;

  • 指定處理請求壓縮的緩衝區數量和大小。
  • 預設值:gzip_buffers 32 4k | 16 8k;
  • number:指定Nginx伺服器向系統申請快取空間個數,size指的是每個快取空間的大小。
  • 主要實現的是申請number個每個大小為size的記憶體空間。這個值的設定一般會和伺服器的作業系統有關,所以建議此項不設定,使用預設值即可。

gzip_disable regex ...;

  • 針對不同種類使用者端發起的請求,可以選擇性地開啟和關閉Gzip功能。
  • 用來排除一些明顯不支援Gzip的瀏覽器,例如排除IE:gzip_disable "MSIE [1-6]\.";

gzip_http_version 1.0|1.1(預設值);

  • 設定gzip支援的HTTP協定版本

gzip_min_length length;

  • 要傳送的資料量超過了length,才會開啟Gzip壓縮功能
  • 預設值:gzip_min_length 20; #單位KB

gzip_proxied  off(預設值) | expired | no-cache | no-store | private | no_last_modified | no_etag | auth|any;

  • 設定是否對伺服器端返回的結果進行Gzip壓縮
  • off - 關閉Nginx伺服器對後臺伺服器返回結果的Gzip壓縮
  • expired - 啟用壓縮,如果header頭中包含 "Expires" 頭資訊
  • no-cache - 啟用壓縮,如果header頭中包含 "Cache-Control:no-cache" 頭資訊
  • no-store - 啟用壓縮,如果header頭中包含 "Cache-Control:no-store" 頭資訊
  • private - 啟用壓縮,如果header頭中包含 "Cache-Control:private" 頭資訊
  • no_last_modified - 啟用壓縮,如果header頭中不包含 "Last-Modified" 頭資訊
  • no_etag - 啟用壓縮 ,如果header頭中不包含 "ETag" 頭資訊
  • auth - 啟用壓縮 , 如果header頭中包含 "Authorization" 頭資訊
  • any - 無條件啟用壓縮

綜合範例

gzip on;  			  #開啟gzip功能
gzip_types *;		  #壓縮原始檔型別,根據具體的存取資源型別設定
gzip_comp_level 6;	  #gzip壓縮級別
gzip_min_length 1024; #進行壓縮響應頁面的最小長度,content-length
gzip_buffers 4 16K;	  #快取空間大小
gzip_http_version 1.1; #指定壓縮響應所需要的最低HTTP請求版本
gzip_vary  on;		  #往頭資訊中新增壓縮標識
gzip_disable "MSIE [1-6]\."; #對IE6以下的版本都不進行壓縮
gzip_proxied  off; #nginx作為反向代理壓縮伺服器端返回資料的條件

這個設定可能再多處都要使用,我們將其抽取為獨立的組態檔,方便在多處進行「include」

Step1:vim %nginx所在目錄%/config/my_config/gzip_config.conf

Step2:在Nginx主設定目錄匯入該檔案:vim %nginx所在目錄%/config/nginx.conf

Gzip和sendfile共存問題

背景

  • 在開啟sendfile以後,在讀取磁碟上的靜態資原始檔的時候,可以減少拷貝的次數,可以不經過使用者程序將靜態檔案通過網路裝置傳送出去,但是Gzip要想對資源壓縮,是需要經過使用者程序進行操作的。
  • 如何解決兩個設定的共存問題。
  • 解決方案
    • 可以使用ngx_http_gzip_static_module模組的gzip_static指令來解決。
    • 開啟了gzip_static後,檢查與存取資源同名的.gz檔案時,response中以gzip相關的header返回.gz檔案的內容

安裝ngx_http_gzip_static_module

  • 預設安裝是沒有安裝ngx_http_gzip_static_module的,所以我們需要指定該模組重新安裝。
  • 操縱步驟類似於Nginx的平滑升級
  • 主要思想:重新編譯一個指定了該模組的後的二進位制檔案,替換掉原來的二進位制檔案即可
  • 具體步驟
    1. 檢視以前Nginx的編譯引數:nginx -V
    2. 備份以前安裝目錄中sbin下的二進位制檔案,防止安裝失敗後進行恢復:mv nginx nginx_old
    3. 進入封包目錄:cd /home/ks/nginx-版本號
    4. 清空之前編譯的內容:make clean
    5. 指定安裝引數:./configure --with-http_gzip_static_module
    6. 遍歷:make
    7. 將objs目錄下的nginx二進位制執行檔案移動到nginx安裝目錄下的sbin目錄中:mv objs/nginx /usr/local/nginx/sbin
    8. 執行更新命令:make upgrade #注意當前所在目錄是在Nginx封包目錄下

語法:gzip_static on | off(預設值) | always;

位置:http、server、location

測試

  • 直接存取`http://192.168.200.133/jquery.js`

  • 使用gzip命令進行壓縮:gzip jquery.js
  • 再次存取`http://192.168.200.133/jquery.js`

快取

Nginx的web快取服務主要是使用`ngx_http_proxy_module`模組相關指令集來完成

proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];

  • 設定快取檔案的存放路徑
  • 位置:http
  • 引數釋義
    • path:快取路徑,例如:/usr/local/proxy_cache
    • levels:指定該快取空間對應的目錄,最多可以設定3層
      • levels=1:2 快取空間有兩層目錄,第一次是1個字母,第二次是2個字母
      • 舉例說明:
        • itheima[key]通過MD5加密以後的值為 43c8233266edce38c2c9af0694e2107d
        • levels=1:2 最終的儲存路徑為/usr/local/proxy_cache/d/07
        • levels=2:1:2 最終的儲存路徑為/usr/local/proxy_cache/7d/0/21
        • levels=2:2:2 最終的儲存路徑為??/usr/local/proxy_cache/7d/10/e2
      • keys_zone:為這個快取區設定名稱和指定大小。例如:keys_zone=itcast:200m 快取區的名稱是itcast, 大小為200M, 1M大概能儲存8000個keys
      • inactive:指定快取的資料多次時間未被存取就將被刪除。例如:inactive=1d #快取資料在1天內沒有被存取就會被刪除
      • max_size: 設定最大快取空間,如果快取空間存滿,預設會覆蓋快取時間最長的資源。例如:max_size=20g
    • 綜合範例
http { #次設定在http塊中
	proxy_cache_path /usr/local/proxy_cache keys_zone=itcast:200m  levels=1:2:1 inactive=1d max_size=20g;
}

proxy_cache zone_name | off(預設);

  • 用來開啟或關閉代理快取,如果是開啟則需要指定快取區的名稱
  • zone_name:快取區的名字
  • 位置:http、server、location

proxy_cache_key key;

  • 該指令用來設定web快取的key值,Nginx會根據key值MD5雜湊存快取
  • 預設值:proxy_cache_key $scheme$proxy_host$request_uri;
  • 位置:http、server、location

proxy_cache_valid [code ...] time;

  • 該指令用來對不同返回狀態碼的URL設定不同的快取時間
  • 位置:http、server、location
  • 例如
    • proxy_cache_valid 200 302 10m; #響應為200和302的URL設定10分鐘快取
    • proxy_cache_valid 404 1m; #響應為404的URL設定1分鐘快取
    • proxy_cache_valid any 1m; #對所有響應狀態碼的URL都設定1分鐘快取

proxy_cache_min_uses number;

  • 該指令用來設定資源被存取多少次後被快取
  • 預設值:proxy_cache_min_uses 1;
  • 位置:http、server、location

proxy_cache_methods GET|HEAD|POST;

  • 該指令使用者設定快取哪些HTTP方法
  • 預設值:proxy_cache_methods GET HEAD; #預設快取HTTP的GET和HEAD方法,不快取POST方法。
  • 位置:http、server、location

ResponseHeader中的快取

expires [modified] time | epoch | max | off(預設值);

  • 功能:控制快取
  • 引數
    • time:如果為整數或0,則表明指定有效期,Cache-Control的值為max-age=time;如果是負數,則表明即時失效,Cache-Control則為no-cache
    • epoch:指定Expires的值為'1 January,1970,00:00:01 GMT'(1970-01-01 00:00:00),Cache-Control的值no-cache
    • max:指定Expires的值為'31 December2037 23:59:59GMT' (2037-12-31 23:59:59) ,Cache-Control的值為10年
    • off:預設不快取。
  • 位置:http, server, location

Cache-Control:告訴所有的快取機制是否可以快取及哪種型別。

取值列舉

  • must-revalidate:可快取但必須再向源伺服器進行確認
  • no-cache:快取前必須確認其有效性
  • no-store:不快取請求或響應的任何內容
  • no-transform:代理不可更改媒體型別
  • public:可向任意方提供響應的快取
  • private:僅向特定使用者返回響應
  • proxy-revalidate:要求中間快取伺服器對快取的響應有效性再進行確認
  • max-age=<秒>:響應最大Age值
  • s-maxage=<秒>:公共快取伺服器響應的最大Age值

通過add_header指控制Response Header中的資料。例子:設定響應頭中Cache-Control為public:add_header Cache-Control public;

清除快取

方式一:刪除對應的快取目錄

方式二:使用第三方擴充套件模組(ngx_cache_purge,需要安裝)

 

ngx_cache_purge安裝過程

  1. 下載ngx_cache_purge模組對應的資源包:ngx_cache_purge-2.3.tar.gz
  2. 解壓縮:tar -zxf ngx_cache_purge-2.3.tar.gz
  3. 修改資料夾名稱,方便後期設定:mv ngx_cache_purge-2.3 purge
  4. 查詢Nginx的設定引數:nginx -V
  5. 進入Nginx的安裝目錄,使用./configure進行引數設定:./configure --add-module=/root/nginx/module/purge
  6. 編譯:make
  7. 備份以前的二進位制檔案:mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
  8. 將編譯後的objs中的nginx拷貝到nginx的sbin目錄下:cp objs/nginx /usr/local/nginx/sbin
  9. 使用make進行升級:make upgrade
  10. 在nginx組態檔中進行如下設定
server{
	location ~/purge(/.*) {
		proxy_cache_purge itcast itheima;
	}
}

不快取

proxy_no_cache string ...;

  • 該指令是用來定義不將資料進行快取的條件
  • 位置:http、server、location
  • 設定範例:proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;

proxy_cache_bypass string ...;

  • 該指令是用來設定不從快取中獲取資料的條件。
  • 位置:http、server、location
  • 設定範例:proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;

 

$cookie_nocache指的是當前請求的cookie中鍵的名稱為nocache對應的值

$arg_nocache和$arg_comment:指的是當前請求的引數中屬性名為nocache和comment對應的屬性值

 

範例:設定不快取的資源

server{
	listen	8080;
	server_name localhost;
	location / {
		if ($request_uri ~ /.*\.js$){
           set $nocache 1;
        }
		proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
        proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
	}
}

log

access_log on/off;

  • 開啟或關閉紀錄檔記錄功能
  • 位置:http, server, location

access_log path[format[buffer=size]]

  • 指定access_log紀錄檔的檔案格式
  • 預設值:access_log logs/access.log combined;

log_format name [escape=default\|json\|none] string....;

  • 指定紀錄檔的輸出格式
  • 預設值:log_format combined "...";

gzip on | off;

開啟關閉壓縮紀錄檔檔案

負載均衡

實現方式

  • 使用者手動選擇:在網站主頁上面提供不同線路、不同伺服器連結方式,讓使用者來選擇自己存取的具體伺服器,來實現負載均衡。

  • DNS輪詢方式:採用簡單輪詢方法

每次存取,都需要情況DNS快取(ipconfig/flushdns),才能看到效果

  • 第四層負載均衡:在OSI七層模型中的傳輸層,主要是基於IP+PORT的負載均衡
  1. 硬體:F5 BIG-IP、Radware等
  2. 軟體:LVS、Nginx、Hayproxy等
  • 第七層負載均衡:在應用層,主要是基於虛擬的URL或主機IP的負載均衡
    1. 軟體:Nginx、Hayproxy等
    2. 四層負載均衡封包是在底層就進行了分發,而七層負載均衡封包則在最頂端進行分發,所以四層負載均衡的效率比七層負載均衡的要高。
    3. 四層負載均衡不識別域名,而七層負載均衡識別域名。
  • 第二層負載均衡:在資料鏈路層基於mac地址來實現負載均衡
  • 第三層負載均衡:在網路層一般採用虛擬IP地址的方式實現負載均衡
  • 最佳實踐:四層負載(LVS)+七層負載(Nginx)

第七層負載均衡

upstream 取個名字 {
   server 服務的域名或者IP地址 [paramerters]
   server 服務的域名或者IP地址 [paramerters] …  #可以設定多個服務
}
  • 定義一組用於負載均衡的伺服器
  • 它們可以是監聽不同埠的伺服器,並且也可以是同時監聽TCP和Unix socket的伺服器。伺服器可以指定不同的權重,預設為1。
  • 位置:http

paramerters-控制負載服務的狀態

  • down:當前的server暫時不參與負載均衡。該狀態一般會對需要停機維護的伺服器進行設定。

  • backup:預留的備份伺服器。當主伺服器不可用時,將用來傳遞請求。

  • max_fails=number:設定允許請求代理伺服器失敗的次數,預設為1。
  • fail_timeout=time:設定經過max_fails失敗後,服務暫停的時間,預設是10秒。

  • max_conns:限制最大的接收連線數

第七層的均衡策略

負載均衡策略

  • 輪詢:預設方式
  • weight:權重方式
  • ip_hash:依據ip分配方式
  • least_conn:依據最少連線方式
  • url_hash:依據URL分配方式
  • fair:依據響應時間方式

 

weight:權重方式

  • weight=number
  • number預設為1,權重資料越大,被分配到請求的機率越大;
  • 該權重值,主要是針對實際工作環境中不同的後端伺服器硬體設定進行調整的,所有此策略比較適合伺服器的硬體設定差別比較大的情況。

ip_hash:依據ip分配方式

  • 當對後端的多臺動態應用伺服器做負載均衡時,ip_hash指令能夠將某個使用者端IP的請求通過雜湊演演算法定位到同一臺後端伺服器上。
  • 這樣,當來自某一個IP的使用者在後端Web伺服器A上登入後,在存取該站點的其他URL,能保證其存取的還是後端web伺服器A。
  • 注意:這樣無法保證100%負載均衡,因為可能所有IP都hash到了一臺伺服器上。此外,服務的權重將失效。

least_conn:依據最少連線方式

  • 最少連線,把請求轉發給連線數較少的後端伺服器。
  • 輪詢演演算法是把請求平均的轉發給各個後端,使它們的負載大致相同;但是,有些請求佔用的時間很長,會導致其所在的後端負載較高。這種情況下,least_conn這種方式就可以達到更好的負載均衡效果。
  • 此策略適合請求處理時間長短不一造成伺服器過載的情況。

url_hash:依據URL分配方式

按存取url的hash結果來分配請求,使每個url定向到同一個後端伺服器

 

fair:依據響應時間方式

  • 第三方模組提供的負載策略
  • 可以根據頁面大小、載入時間長短智慧的進行負載均衡。
  • 模組地址:https://github.com/gnosek/nginx-upstream-fair,採取類似於Nginx升級的方式載入該模組到Nginx

第四層負載均衡

Nginx在1.9之後,增加了一個stream模組,用來實現四層協定的轉發、代理、負載均衡等。stream模組的用法跟http的用法類似,允許我們設定一組TCP或者UDP等協定的監聽,然後通過proxy_pass來轉發我們的請求,通過upstream新增多個後端服務,實現負載均衡。

 

四層協定負載均衡的實現,一般都會用到LVS、HAProxy、F5等,要麼很貴要麼設定很麻煩,而Nginx的設定相對來說更簡單,更能快速完成工作。

 

新增stream模組的支援

  • Nginx預設是沒有編譯這個模組的,需要使用到stream模組,那麼需要在編譯的時候加上`--with-stream`。
  • 完成新增`--with-stream`的實現步驟:
    1. 將原有/usr/local/nginx/sbin/nginx進行備份
    2. 拷貝nginx之前的設定資訊
    3. 在nginx的安裝原始碼進行設定指定對應模組 ./configure --with-stream
    4. 通過make模板進行編譯
    5. 將objs下面的nginx移動到/usr/local/nginx/sbin下
    6. 在原始碼目錄下執行 make upgrade進行升級,這個可以實現不停機新增新模組的功能
stream 取個名字 {
    server 服務的域名或者IP地址 [paramerters]
    server 服務的域名或者IP地址 [paramerters] …  #可以設定多個服務
}
  • 定義一組用於負載均衡的伺服器
  • 它們可以是監聽不同埠的伺服器,並且也可以是同時監聽TCP和Unix socket的伺服器。伺服器可以指定不同的權重,預設為1。
  • 位置:與http同級

 

範例

worker_processes  1;

events {
    worker_connections  1024;
}

stream {
        upstream redisbackend {
                server 192.168.200.146:6379;
                server 192.168.200.146:6378;
        }
        upstream tomcatbackend {
        		server 192.168.200.146:8080;
        }
        server {
                listen  81;
                proxy_pass redisbackend;
        }
        server {
        		listen	82;
        		proxy_pass tomcatbackend;
        }
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    keepalive_timeout  65;

    
    server {
        listen       80;
        server_name  hackyle.com;
                
        location / {
            default_type text/html;
            return 200 "<h1>I am hackyle.com</h1>";
        }   
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}