Nginx后端節(jié)點健康檢查實踐
一、先說結(jié)論:為什么要做健康檢查?
想象一下,你是一個前臺接待員(Nginx),后面有三個辦公室(后端服務(wù)器)處理業(yè)務(wù)。
如果有間辦公室著火了,你還在不停地往那間辦公室派人,結(jié)果人又跑回來告訴你去不了,這不就浪費了時間嗎?
健康檢查的目的就是:及時發(fā)現(xiàn)哪間辦公室出問題了,暫時別往那里派人,等修好了再恢復(fù)。
二、Nginx自帶的“基礎(chǔ)版”健康檢查
1. 默認配置是什么樣?
Nginx最基礎(chǔ)的配置長這樣:
- nginx
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}但其實默認背后隱藏著這些參數(shù):
- nginx
upstream myapp1 {
server srv1.example.com weight=1 max_fails=1 fail_timeout=10;
server srv2.example.com weight=1 max_fails=1 fail_timeout=10;
server srv3.example.com weight=1 max_fails=1 fail_timeout=10;
}2. 自帶健康檢查怎么工作?
有兩個關(guān)鍵機制:
① 故障轉(zhuǎn)移(proxy_next_upstream)
當Nginx發(fā)現(xiàn)后端服務(wù)器連接不上、超時或者返回502、503等錯誤時
它會自動把這個請求轉(zhuǎn)發(fā)給另一臺正常的服務(wù)器
默認情況下,連接錯誤和超時都會觸發(fā)轉(zhuǎn)移
② 健康檢查(max_fails + fail_timeout)
max_fails=1:允許1次失敗fail_timeout=10:在10秒內(nèi)如果失敗次數(shù)達到1次,就認為這個服務(wù)器掛了接下來10秒內(nèi),Nginx不會再往這臺服務(wù)器發(fā)請求
10秒后,會再嘗試一下,如果好了就恢復(fù)
3. 自帶模塊有什么問題?
舉個生活中的例子:
你派一個人去A辦公室,等了60秒(超時時間)才確認沒人,然后才轉(zhuǎn)去B辦公室
這個過程浪費了60秒
而且每10秒(fail_timeout)才會嘗試恢復(fù)A辦公室,不夠智能
總結(jié)缺點:
- 反應(yīng)慢:要等超時時間到了才知道出問題
- 浪費請求:總會先試一下有問題的服務(wù)器,失敗后才轉(zhuǎn)移
- 不夠靈活:只能檢查連接,不能檢查業(yè)務(wù)是否正常
三、淘寶的“進階版”健康檢查
1. 這是什么?
淘寶團隊開發(fā)了一個專門的模塊:nginx_upstream_check_module,可以更智能地做健康檢查。
在Tengine(淘寶的Nginx版本)里自帶這個功能,普通Nginx需要打補丁安裝。
2. 配置示例
- nginx
upstream cluster {
server 192.168.0.1:80;
server 192.168.0.2:80;
# 重點在這里:主動健康檢查
check interval=5000 rise=1 fall=3 timeout=4000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}3. 參數(shù)都是什么意思?
- interval=5000:每5秒檢查一次
- rise=1:連續(xù)成功1次,就認為服務(wù)器好了
- fall=3:連續(xù)失敗3次,才認為服務(wù)器真掛了
- timeout=4000:等待響應(yīng)的超時時間(4秒)
- type=http:用HTTP協(xié)議檢查(不只是檢查TCP連接)
- check_http_send:發(fā)送什么請求去檢查(一般用HEAD減少數(shù)據(jù)量)
- check_http_expect_alive:什么響應(yīng)碼算正常(默認2xx和3xx)
4. 進階版好在哪?
還是那個例子:
- 你不只是派人去敲門,而是隔5秒就打個電話問問"你還好嗎?"
- 如果連續(xù)3次沒人接,才認定真的出問題了
- 一旦有人接了一次,馬上恢復(fù)服務(wù)
優(yōu)勢:
- 主動檢查:不用等用戶請求來才發(fā)現(xiàn)問題
- 反應(yīng)快:毫秒級的檢查間隔
- 可定制:可以檢查具體某個頁面,甚至發(fā)送自定義請求
- 監(jiān)控頁面:可以查看所有后端節(jié)點的健康狀態(tài)
四、還可以直接使用Tengine
如果不想打補丁,可以直接安裝淘寶的Tengine:
- nginx
./configure --prefix=/usr/local/tengine --add-module=/path/to/ngx_http_upstream_check_module
配置是一樣的,而且更穩(wěn)定。
五、總結(jié)對比
| 對比項 | Nginx原生 | 淘寶check模塊 |
|---|---|---|
| 檢查方式 | 被動(靠用戶請求觸發(fā)) | 主動(定時檢查) |
| 發(fā)現(xiàn)問題的速度 | 慢(等超時) | 快(幾秒內(nèi)) |
| 是否浪費請求 | 會先發(fā)給壞節(jié)點 | 完全避開壞節(jié)點 |
| 檢查內(nèi)容 | 只能檢查連接 | 可檢查具體頁面 |
| 監(jiān)控界面 | 無 | 有(/status頁面) |
| 配置靈活度 | 一般 | 高 |
一句話總結(jié):
- 小項目、對可用性要求不高:用Nginx自帶的就夠了
- 正式環(huán)境、要求高可用:建議用淘寶的check模塊或直接上Tengine
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
shell腳本定時統(tǒng)計Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫
這篇文章主要介紹了shell腳本定時統(tǒng)計Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫的實現(xiàn)方法 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-09-09
Nginx強制跳轉(zhuǎn)Https(Http訪問跳轉(zhuǎn)Https)
這篇文章主要為大家介紹了Http訪問強制跳轉(zhuǎn)到Https的幾種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
Nginx?403?forbidden錯誤的原因以及解決方法
yum安裝nginx,安裝一切正常,但是訪問時報403 forbidden,下面這篇文章主要給大家介紹了關(guān)于Nginx?403?forbidden錯誤的原因以及解決方法,需要的朋友可以參考下2022-08-08

