摘要:異常與默認值為默認值為秒。實驗請求里頭的會發起一個,請求請求一次對逐個請求,都失敗,則的返回,對返回的取決于腳本再請求一次該下面的都掛的情況下出現中健康檢查機制深入分析容錯機制原創胡志廣線上的一次分析
異常
max_fails與fail_timeoutupstream server temporarily disabled while connecting to upstream
no live upstreams while connecting to upstream
max_fails默認值為1,fail_timeout默認值為10秒。
nginx可以通過設置max_fails(最大嘗試失敗次數)和fail_timeout(失效時間,在到達最大嘗試失敗次數后,在fail_timeout的時間范圍內節點被置為失效,除非所有節點都失效,否則該時間內,節點不進行恢復)對節點失敗的嘗試次數和失效時間進行設置,當超過最大嘗試次數或失效時間未超過配置失效時間,則nginx會對節點狀會置為失效狀態,nginx不對該后端進行連接,直到超過失效時間或者所有節點都失效后,該節點重新置為有效,重新探測.
upstream backend { server backend1.example.com weight=5; server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; server backup1.example.com backup; }fail的標準
比如
connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: , request: "POST /demo HTTP/1.1", subrequest: "/capture/getstatus", upstream: "http://192.168.99.100:8080/api/demo/
比如
upstream timed out (110: Connection timed out) while reading response header from upstream
探測機制Nginx 默認判斷失敗節點狀態以connect refuse和time out狀態為準,不以HTTP錯誤狀態進行判斷失敗,因為HTTP只要能返回狀態說明該節點還可以正常連接,所以nginx判斷其還是存活狀態;除非添加了proxy_next_upstream指令設置對404、502、503、504、500和time out等錯誤進行轉到備機處理,在next_upstream過程中,會對fails進行累加,如果備用機處理還是錯誤則直接返回錯誤信息(但404不進行記錄到錯誤數,如果不配置錯誤狀態也不對其進行錯誤狀態記錄),綜述,nginx記錄錯誤數量只記錄timeout 、connect refuse、502、500、503、504這6種狀態,timeout和connect refuse是永遠被記錄錯誤狀態,而502、500、503、504只有在配置proxy_next_upstream后nginx才會記錄這4種HTTP錯誤到fails中,當fails大于等于max_fails時,則該節點失效.
實驗log如果探測所有節點均失效,備機也為失效時,那么nginx會對所有節點恢復為有效,重新嘗試探測有效節點,如果探測到有效節點則返回正確節點內容,如果還是全部錯誤,那么繼續探測下去,當沒有正確信息時,節點失效時默認返回狀態為502,但是下次訪問節點時會繼續探測正確節點,直到找到正確的為止。
upstream test_server{ server 192.168.99.100:80801; server 192.168.99.100:80802; server 192.168.99.100:80803; } ##for capture location /api/test/demo{ proxy_pass http://test_server/api/demo; } location /api/demo{ default_type application/json; content_by_lua_file conf/lua/demo.lua; }
lua
local cjson = require "cjson.safe" testres = ngx.location.capture("/api/test/demo",{ method= ngx.HTTP_POST, body = "arg1=xxxx&arg2=xxxxx" }) ngx.log(ngx.ERR,"status"..testres.status) local testbody = cjson.decode(testres.body) ngx.log(ngx.ERR,testbody==nil)
請求192.168.99.100:8080/api/demo,里頭的lua會發起一個capture,請求/api/test/demo
請求一次
2017/02/09 14:48:57 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80801/api/demo", host: "192.168.99.100:8080" 2017/02/09 14:48:57 [warn] 5#5: *1 upstream server temporarily disabled while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80801/api/demo", host: "192.168.99.100:8080" 2017/02/09 14:48:57 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80802/api/demo", host: "192.168.99.100:8080" 2017/02/09 14:48:57 [warn] 5#5: *1 upstream server temporarily disabled while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80802/api/demo", host: "192.168.99.100:8080" 2017/02/09 14:48:57 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80803/api/demo", host: "192.168.99.100:8080" 2017/02/09 14:48:57 [warn] 5#5: *1 upstream server temporarily disabled while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80803/api/demo", host: "192.168.99.100:8080" 2017/02/09 14:48:57 [error] 5#5: *1 [lua] demo.lua:44: status502 while sending to client, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", host: "192.168.99.100:8080"
對upstream逐個請求,都失敗,則capture的subrequest返回502,對client返回的status code取決于lua腳本
再請求一次
2017/02/09 15:09:34 [error] 6#6: *11 no live upstreams while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://test_server/api/demo", host: "192.168.99.100:8080"
doc該upstream下面的server都掛的情況下出現no live upstreams while connecting to upstream
ngx_http_upstream_module
nginx中健康檢查(health_check)機制深入分析
nginx upstream 容錯機制 原創-胡志廣
線上nginx的一次“no live upstreams while connecting to upstream ”分析
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39466.html
摘要:是由淘寶網發起的服務器項目。回源監控是內容分發網絡的簡稱,其分發的內容來自用戶源站,負責回源的模塊是最重要組成部分之一,使跨越單機的限制,完成網絡數據的接收處理和轉發。這部分主要介紹的一些調試技巧和回源資源監控的內容,以及相應的實例分享。 摘要: Tengine是由淘寶網發起的Web服務器項目。它在Nginx的基礎上,針對大訪問量網站的需求,提供更強大的流量負載均衡能力、全站HTTPS...
摘要:本身是不支持的,如果需要使用這種調度算法,必須下載的模塊。表示當前的暫時不參與負載。允許請求失敗的次數,默認為。當超過最大次數時,返回模塊定義的錯誤。 nginx 的 upstream 模塊 負載均衡分配策略 普通輪詢(默認) 每個請求按時間順序逐一分配到不同的后端服務器,如果后端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。 upstream backend { serv...
摘要:這個指令屬于模塊的,指定后端返回什么樣的異常響應時,使用另一個是專門提供負載均衡器內節點的健康檢查的外部模塊,由淘寶的姚偉斌大神開發,通過它可以用來檢測后端的健康狀態。 關于nginx的安裝和基本配置請參考nginx,本文在原基礎上完成以下幾個功能: 結合proxy和upstream模塊實現nginx負載均衡 結合nginx_upstream_check_module模塊實現后端服...
閱讀 3043·2021-11-25 09:43
閱讀 1626·2021-11-24 11:15
閱讀 2359·2021-11-22 15:25
閱讀 3501·2021-11-11 16:55
閱讀 3240·2021-11-04 16:10
閱讀 2773·2021-09-14 18:02
閱讀 1685·2021-09-10 10:50
閱讀 1070·2019-08-29 15:39