嚴格來說,nginx是沒有針對負載均衡后端節點的健康檢查的,但是可以通過proxy_next_upstream來間接實現,但這個還是會把請求轉發給故障服務器的,然后再轉發給別的服務器,這樣就浪費了一次轉發。
nginx_upstream_check_module為淘寶技術團隊開發的nginx模快,用來檢測后方server的健康狀態,如果后端服務器不可用,則所以的請求不轉發到這台服務器。
1. 安裝nginx_upstream_check_module
- 地址:https://github.com/yaoweibin/nginx_upstream_check_module, 下載完畢后解壓
-
進入nginx源碼目錄,進行打該模塊的補丁(這一步千萬不能遺漏)
patch -p1 < ../nginx_upstream_check_module-master/check_1.5.12+.patch
-
然后通過./configure --add-module來增加模塊
./configure –add-module=../ nginx_upstream_check_module-master/ 注意:如果之前安裝過nginx,需要將之前的configure參數保留
-
make
-
make之后的操作需要注意
如果nginx第一次安裝,直接執行make install即可
make install
如果單純添加模塊,不需要install,而是執行以下操作,將打過補丁的nginx二進制文件覆蓋/usr/local/nginx/sbin/目錄中的文件即可
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak cp /nginx源碼目錄/objs/nginx /usr/local/nginx/sbin/
2. 配置nginx upstream參數
-
增加建議配置,后端有8181兩個節點
location /{ proxy_pass http://cluster; } upstream cluster { server 127.0.0.1:8181; server 127.0.0.1:8182; #http健康檢查相關配置 check interval=3000 rise=2 fall=3 timeout=3000 type=http; #/health/status為后端健康檢查接口 check_http_send "HEAD /health/status HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; }
interval: 向后端發送的健康檢查包的間隔,單位為毫秒
rsie: 如果連續成功次數達到rise_count,服務器就被認為是up
fall: 如果連續失敗次數達到fall_count,服務器就被認為是down
timeout: 后端健康請求的超時時間,單位為毫秒
type: 健康檢查包的類型,支持tcp、ssl_hello、http、mysql、ajp -
如果想查看后端服務器實時的健康狀態,可以在對應server中增加以下location配置
location /nstatus { check_status; access_log off; #allow SOME.IP.ADD.RESS; #deny all; }
3. 查看健康檢查狀態
-
通過http://localhost:8080/nstatus 查看,如下圖所示,剛開始后端兩個節點都處於停止狀態,status為down

server number為后端服務器數量,generation為nginx reload的次數
-
此時,啟動其中一台8181,查看nginx的error.log日志,出現如下日志,說明8181這台應用已經處於可檢查狀態
2018/09/07 14:07:48 [error] 85860#0: enable check peer: 127.0.0.1:8181
-
刷新nstatus頁面,如下圖所示,發現8181這台狀態變為了up,表示已連接成功

-
啟動8182,與8181過程相同,最終頁面狀態變為如下,此時兩台狀態均為up: