原因?為什麼會使用nginx_heath 這個模塊,主要是如nginx+tomcat部署的時,tomcat掛了之後nginx->upstream 輪詢是可以踢掉掛掉的tomcat服務的,如果部署的機器掛了之後nginx輪詢是不能踢掉的,如果服務再去請求,就會出現請求超時!
1、ngx_http_proxy_module 模塊和ngx_http_upstream_module模塊(自帶)
官網地址:http://nginx.org/cn/docs/http/ngx_http_proxy_module.html#proxy_next_upstream
2、nginx_upstream_check_module模塊
官網網址:https://github.com/yaoweibin/nginx_upstream_check_module
3、ngx_http_healthcheck_module模塊
官網網址:http://wiki.nginx.org/NginxHttpHealthcheckModule
目前主要使用的是第二種解決方式:
1.添加nginx_heath模塊
首先需要添加【nginx_upstream_check_module】模塊:http://pan.baidu.com/s/1caLNUe
./nginx -V
查看已經添加的nginx模塊如:--prefix=/opt/nginx-new --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-pcre
進入nginx源碼中為nginx打補丁:patch -p0 < ../nginx_upstream_check_module-master/check_1.5.12+.patch,這個需要合適的版本,不然會出現打補丁失敗,如果提示沒有patch命令的話,請先安裝yum -y install patch
追加nginx_upstream_check_module模塊:--prefix=/opt/nginx-new --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-pcre --add-module=/home/software/nginx_upstream_check_module-master
然後make
2.配置upstream加入健康檢查
upstream name{
server 10.144.48.157:8205;
server 119.29.204.12:8889;
check interval=3000 rise=2 fall=3 timeout=3000 type=tcp;
}
上面配置的意思是,對name這個負載均衡條目中的所有節點,每個3秒檢測一次,請求2次正常則標記 realserver狀態為up,如果檢測 5 次都失敗,則標記 realserver的狀態為down,超時時間為1秒。
指定參數的意思:
- interval:向後端發送的健康檢查包的間隔。
- fall(fall_count): 如果連續失敗次數達到fall_count,服務器就被認為是down。
- rise(rise_count): 如果連續成功次數達到rise_count,服務器就被認為是up。
- timeout: 後端健康請求的超時時間。
- default_down: 設定初始時服務器的狀態,如果是true,就說明默認是down的,如果是false,就是up的。默認值是true,也就是一開始服務器認為是不可用,要等健康檢查包達到一定成功次數以後才會被認為是健康的。
- type:健康檢查包的類型,現在支持以下多種類型
- tcp:簡單的tcp連接,如果連接成功,就說明後端正常。
- ssl_hello:發送一個初始的SSL hello包並接受服務器的SSL hello包。
- http:發送HTTP請求,通過後端的回復包的狀態來判斷後端是否存活。
- mysql: 向mysql服務器連接,通過接收服務器的greeting包來判斷後端是否存活。
- ajp:向後端發送AJP協議的Cping包,通過接收Cpong包來判斷後端是否存活。
- port: 指定後端服務器的檢查端口。你可以指定不同於真實服務的後端服務器的端口,比如後端提供的是443端口的應用,你可以去檢查80端口的狀態來判斷後端健康狀況。默認是0,表示跟後端server提供真實服務的端口一樣。該選項出現於Tengine-1.4.0。
3.配置web頁面
location /nstatus {
check_status;
access_log off;
}
如圖:
如果有down掉的如圖
另外還支持參數請求?status=up,顯示出up狀態的upstream。