我們使用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 | off(預設值);
- 開啟高效的檔案傳輸模式
- 等價於“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的平滑升級
- 主要思想:重新編譯一個指定了該模組的後的二進位制檔案,替換掉原來的二進位制檔案即可
- 具體步驟
- 檢視以前Nginx的編譯引數:nginx -V
- 備份以前安裝目錄中sbin下的二進位制檔案,防止安裝失敗後進行恢復:mv nginx nginx_old
- 進入資料包目錄:cd /home/ks/nginx-版本號
- 清空之前編譯的內容:make clean
- 指定安裝引數:./configure --with-http_gzip_static_module
- 遍歷:make
- 將objs目錄下的nginx二進位制執行檔案移動到nginx安裝目錄下的sbin目錄中:mv objs/nginx /usr/local/nginx/sbin
- 執行更新命令: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安裝過程
- 下載ngx_cache_purge模組對應的資源包:ngx_cache_purge-2.3.tar.gz
- 解壓縮:tar -zxf ngx_cache_purge-2.3.tar.gz
- 修改資料夾名稱,方便後期配置:mv ngx_cache_purge-2.3 purge
- 查詢Nginx的配置引數:nginx -V
- 進入Nginx的安裝目錄,使用./configure進行引數配置:./configure --add-module=/root/nginx/module/purge
- 編譯:make
- 備份以前的二進位制檔案:mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
- 將編譯後的objs中的nginx複製到nginx的sbin目錄下:cp objs/nginx /usr/local/nginx/sbin
- 使用make進行升級:make upgrade
- 在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的負載均衡
- 硬體:F5 BIG-IP、Radware等
- 軟體:LVS、Nginx、Hayproxy等
- 第七層負載均衡:在應用層,主要是基於虛擬的URL或主機IP的負載均衡
- 軟體:Nginx、Hayproxy等
- 四層負載均衡資料包是在底層就進行了分發,而七層負載均衡資料包則在最頂端進行分發,所以四層負載均衡的效率比七層負載均衡的要高。
- 四層負載均衡不識別域名,而七層負載均衡識別域名。
- 第二層負載均衡:在資料鏈路層基於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`的實現步驟:
- 將原有/usr/local/nginx/sbin/nginx進行備份
- 複製nginx之前的配置資訊
- 在nginx的安裝原始碼進行配置指定對應模組 ./configure --with-stream
- 透過make模板進行編譯
- 將objs下面的nginx移動到/usr/local/nginx/sbin下
- 在原始碼目錄下執行 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;
}
}
}