Nginx stream 配置代理(Nginx TCP/UDP 負(fù)載均衡)
前奏
我們都知道 nginx 是一款優(yōu)秀的反向代理服務(wù),用過 nginx 的也應(yīng)該都知道 upstream,upstream 節(jié)點一般置于 http 節(jié)點大括號中,常規(guī)在 upstream 中配置需要被負(fù)載均衡的服務(wù)器列表。
比較多的使用做如下示意:
#user nobody nobody。 #worker_processes 2; #pid /nginx/pid/nginx.pid; error_log log/error.log debug; events { …… } http { …… upstream testserver { server 192.168.1.5:8080; server 192.168.1.6:8080; …… } server { …… location / { …… proxy_pass http://testserver; } } }
從結(jié)構(gòu)可以看出,這種用的比較多的配置,主要是應(yīng)對 http 反向代理的。
但是如果我們想對后端服務(wù)的 TCP 進(jìn)行代理,nginx 支持嗎?比如 mysql、redis 等,答案是肯定的,其實 nginx 也是支持對 TCP/UDP 進(jìn)行負(fù)載均衡的,下面要說到的就是 nginx 的 stream 模塊,通過配置 stream 可以實現(xiàn)這樣的需求,這里還是更多的推薦主要將 nginx 用于 http 反向代理。
正篇
Nginx 的 TCP/UDP 負(fù)載均衡是應(yīng)用 Stream 代理模塊(ngx_stream_proxy_module)和 Stream 上游模塊(ngx_stream_upstream_module)實現(xiàn)的。Nginx 的 TCP 負(fù)載均衡與 LVS 都是四層負(fù)載均衡的應(yīng)用,所不同的是,LVS 是被置于 Linux 內(nèi)核中的,而 Nginx 是運行于用戶層的,基于 Nginx 的 TCP 負(fù)載可以實現(xiàn)更靈活的用戶訪問管理和控制。
基本概念科普完了,下面來看一下具體的配置示例:
worker_processes 4; worker_rlimit_nofile 40000; events { worker_connections 8192; } stream { upstream my_servers { least_conn; # 5s內(nèi)出現(xiàn)3次錯誤,該服務(wù)器將被熔斷5s server <IP_SERVER_1>:3306 max_fails=3 fail_timeout=5s; server <IP_SERVER_2>:3306 max_fails=3 fail_timeout=5s; server <IP_SERVER_3>:3306 max_fails=3 fail_timeout=5s; } server { listen 3306; proxy_connect_timeout 5s; # 與被代理服務(wù)器建立連接的超時時間為5s proxy_timeout 10s; # 獲取被代理服務(wù)器的響應(yīng)最大超時時間為10s proxy_next_upstream on; # 當(dāng)被代理的服務(wù)器返回錯誤或超時時,將未返回響應(yīng)的客戶端連接請求傳遞給upstream中的下一個服務(wù)器 proxy_next_upstream_tries 3; # 轉(zhuǎn)發(fā)嘗試請求最多3次 proxy_next_upstream_timeout 10s; # 總嘗試超時時間為10s proxy_socket_keepalive on; # 開啟SO_KEEPALIVE選項進(jìn)行心跳檢測 proxy_pass my_servers; } }
更多說明
- Nginx 的 TCP/UDP 負(fù)載均衡在連接分配時也支持被動健康檢測模式,如果與后端服務(wù)器建立連接失敗,并在 fail_timeout 參數(shù)的時間內(nèi)連續(xù)超過 max_fails 參數(shù)設(shè)置的次數(shù),Nginx 就會將該服務(wù)器置為不可用狀態(tài),并且在 fail_timeout 參數(shù)的時間內(nèi)不再給該服務(wù)器分配連接。當(dāng) fail_timeout 參數(shù)的時間結(jié)束時將嘗試分配連接檢測該服務(wù)器是否恢復(fù),如果可以建立連接,則判定為恢復(fù)。
- 參數(shù) max_fails 是指 10s 內(nèi) Nginx 分配給當(dāng)前服務(wù)器的連接失敗次數(shù)累加值,每 10s 會重置為 0;
- 參數(shù) fail_timeout 既是失敗計數(shù)的最大時間,又是服務(wù)器被置為失敗狀態(tài)的熔斷時間,超過這個時間將再次被分配連接;
- 參數(shù) proxy_connect_timeout 或 proxy_timeout 為超時狀態(tài)時,都會觸發(fā) proxy_next_upstream 機(jī)制;
- 參數(shù) proxy_next_upstream 是 Nginx 下提高連接成功率的機(jī)制,當(dāng)被代理服務(wù)器返回錯誤或超時時,將嘗試轉(zhuǎn)發(fā)給下一個可用的被代理服務(wù)器;
- 參數(shù) proxy_next_upstream_tries 的指令值次數(shù)包括第一次轉(zhuǎn)發(fā)請求的次數(shù)。
- TCP 連接在接收到關(guān)閉連接通知前將一直保持連接,當(dāng) Nginx 與被代理服務(wù)器的兩個連續(xù)成功的讀或?qū)懖僮鞯淖畲箝g隔時間超過 proxy_timeout 指令配置的時間時,連接將會被關(guān)閉。在 TCP 長連接的場景中,應(yīng)適當(dāng)調(diào)整 proxy_timeout 的設(shè)置,同時關(guān)注系統(tǒng)內(nèi)核 SO_KEEPALIVE 選項的配置,可以防止過早地斷開連接。
注:如果你配置 steam 模塊無效,請檢查一下你使用的版本是否支持 stream,如果未內(nèi)置該模塊,你需要在編譯的時候指定參數(shù) --with-stream 進(jìn)行編譯使其支持stream代理。
到此這篇關(guān)于Nginx stream 配置代理(Nginx TCP/UDP 負(fù)載均衡)的文章就介紹到這了,更多相關(guān)Nginx stream 配置代理 內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。