Nginx 的健康檢查這塊筆者在網上看了不少文章,基本都是零零散散的,講各類實現方式,沒有一篇能完整的講當下的 Nginx 實現健康檢查的幾種方式,應該選哪種來使用,因而筆者想總結一篇。html
Nginx 服務端會按照設定的間隔時間主動向後端的 upstream_server 發出檢查請求來驗證後端的各個 upstream_server 的狀態。 若是獲得某個服務器失敗的返回超過必定次數,好比 3 次就會標記該服務器爲異常,就不會將請求轉發至該服務器。nginx
通常狀況下後端服務器須要爲這種健康檢查專門提供一個低消耗的接口。git
Nginx 在代理請求過程當中會自動的監測每一個後端服務器對請求的響應狀態,若是某個後端服務器對請求的響應狀態在短期內累計必定失敗次數時,Nginx 將會標記該服務器異常。就不會轉發流量給該服務器。 不過每間隔一段時間 Nginx 仍是會轉發少許的一些請求給該後端服務器來探測它的返回狀態。 以便識別該服務器是否恢復。github
後端服務器不須要專門提供健康檢查接口,不過這種方式會形成一些用戶請求的響應失敗,由於 Nginx 須要用一些少許的請求去試探後端的服務是否恢復正常。json
源碼地址:https://github.com/yaoweibin/nginx_upstream_check_module後端
這是我目前找到的讓原生 Nginx 經過添加開源模塊,免費實現主動健康檢查的惟一方法。 下面我會詳細介紹這種方式的安裝和配置過程api
https://www.nginx.com/products/nginx/bash
這種方法須要收費,可得到技術支持服務器
這種方式也免費,可行。
首先去下載該模塊的源碼包,放到要編譯 Nginx 的服務器上;
操做系統環境:Centos6.8 ,這裏默認已經安裝好了編譯所需的開發環境
yum install pcre pcre-devel openssl openssl-devel -y
- 這裏要認真看下,很關鍵:
這裏 Nginx 選擇:nginx-1.14.0.tar.gz ,nginx_upstream_check_module 源碼就下載最新的主線代碼包:nginx_upstream_check_module-master.zip 可是編譯前補丁要選對應 Nginx 版本的。 好比這裏 nginx-1.14.0 補丁要選擇 check_1.14.0+.patch ; 補丁文件就在 nginx_upstream_check_module 源碼包裏面。
#!/bin/bash tar xf nginx-1.14.0.tar.gz unzip nginx_upstream_check_module-master.zip cd nginx-1.14.0 # 打補丁,注意編譯前必定要有打補丁這步,否則添加的模塊編譯不生效 patch -p1 < /root/nginx_upstream_check_module-master/check_1.14.0+.patch ./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --add-module=/root/nginx_upstream_check_module-master make && make install
# nginx.conf user www www; worker_processes 4; worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; } http { # 指定一個 upstream 負載均衡組,名稱爲 evalue upstream evalue { # 定義組內的節點服務,若是不加 weight 參數,默認就是 Round Robin ,加上了 weight 參數就是加權輪詢 server 192.168.90.100:9999 weight=100; server 192.168.90.101:9999 weight=100; # interval=3000 檢查間隔 3 秒 , rise=3 連續成功3次認爲服務健康 , fall=5 連續失敗5次認爲服務不健康 , timeout=3000 健康檢查的超時時間爲 3 秒 , type=http 檢查類型 http check interval=3000 rise=3 fall=5 timeout=3000 type=http; # check_http_send 設定檢查的行爲:請求類型 url 請求協議 -> HEAD /api/v1/chivox/health HTTP/1.0 check_http_send "HEAD /api/v1/chivox/health HTTP/1.0\r\n\r\n"; # 設定認爲返回正常的響應狀態 check_http_expect_alive http_2xx http_3xx; #check_http_send "GET /test3.html HTTP/2.0\r\n\r\n"; } } server { listen 80; location / { proxy_pass http://evalue; keepalive_timeout 0; } # 配置健康檢查的狀態監控頁 # check_status [html|csv|json] # 也能夠在請求監控頁的時候帶上參數以輸出不一樣的格式,/status?format=html | /status?format=csv | /status?format=json location /status { check_status html; access_log off; } location ~ /.svn/ { deny all; } access_log /alidata/log/nginx/access/evalue.log json; }