1. 程式人生 > >nginx的重試機制 proxy_next_upstream

nginx的重試機制 proxy_next_upstream

現在對外服務的網站,很少只使用一個服務節點,而是部署多臺伺服器,上層通過一定機制保證容錯和負載均衡。

nginx就是常用的一種HTTP和反向代理伺服器,支援容錯和負載均衡。

nginx的重試機制就是容錯的一種。

在nginx的配置檔案中,proxy_next_upstream項定義了什麼情況下進行重試,官網文件中給出的說明如下:

[plain]  view plain  copy
  1. Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;  
  2. Default:    proxy_next_upstream error timeout;  
  3. Context:    http, server, location  
預設情況下,當請求伺服器發生錯誤或超時時,會嘗試到下一臺伺服器。

還有一個引數影響了重試的次數:proxy_next_upstream_tries,官方文件中給出的說明如下:

[plain] 
view plain
 copy
  1. Syntax: proxy_next_upstream_tries number;  
  2. Default:    proxy_next_upstream_tries 0;  
  3. Context:    http, server, location  
  4. This directive appeared in version 1.7.5.  
該配置決定了最多重試多少次,0表示不限制。

不瞭解這個機制,在日常開發web服務的時候,就可能會踩坑。

比如有這麼一個場景:一個用於匯入資料的web頁面,上傳一個excel,通過讀取、處理excel,向資料庫中插入資料,處理時間較長(如1分鐘),且為同步操作(即處理完成後才返回結果)。暫且不論這種方式的好壞,若nginx配置的響應等待時間(proxy_read_timeout)為30秒,就會觸發超時重試,將請求又打到另一臺。如果處理中沒有考慮到重複資料的場景,就會發生資料多次重複插入!(當然,這種場景,內網可以通過機器名訪問該伺服器進行操作,就可以繞過nginx了,不過外網就沒辦法了。)


參考連結: Nginx重試引發Http請求重複執行 

  https://blog.csdn.net/jackpk/article/details/54632468

 

參考連結: Nginx重試引發Http請求重複執行 

  https://blog.csdn.net/jackpk/article/details/54632468

 

參考連結: Nginx重試引發Http請求重複執行 

  https://blog.csdn.net/jackpk/article/details/54632468