天天看點

nginx依靠逾時時間實作上遊負載web伺服器重新開機時不影響通路

nginx依靠逾時時間實作上遊負載web伺服器重新開機時不影響通路

本文未配置主從機叢集,主從多台叢集。

nginx.conf(或者外聯配置檔案)中,位于http{}之内,樣例如下:

upstream test  {
least_conn; #最小連接配接數,跳轉到激活連接配接數最少的伺服器上,也可以使用預設輪詢方案,或者ip_hash等固定指向的連接配接方案,cookie粘性方案。屆時按使用場景配置。
#ip_hash;
server 192.168.108.163 ; #ip或域名還可以加二級目錄名(即項目的目錄名稱)
server 192.168.108.164:80;
}

server {
listen          80;
server_name    www.test.com; #也可ip,後邊還可以加二級目錄名(即項目的目錄名稱)
index           index.jsp index.html index.htm; #這一項也可以放在location中。同理,proxy_set_header的項也可以放在location外邊
location / {
  proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
 
  proxy_pass http://test/; #後邊還可以加二級目錄名(即項目的目錄名稱)
  proxy_connect_timeout       3;
  proxy_read_timeout          3;
  #proxy_send_timeout          10;
 
  #proxy_cookie_path /testSession/ /; #若cookie出現問題,可用此配置,二級項目的cookie解決方法。
  #proxy_cookie_path /testSession /; #若cookie出現問題,可用此配置,二級項目的cookie解決方法。
  proxy_set_header   Host   $host;
  proxy_set_header   Referer $http_referer;
  proxy_set_header   Cookie $http_cookie;
  proxy_set_header   X-Real-IP  $remote_addr;
  proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size  100m; #大小自己定,機關k或m都可以
 }
}
           

----------------------------------------------分割線----------------------------------------------

配制方法為:調試負載中單台機的max_fails,fail_timeout,設定proxy_next_upstream error timeout http_500 http_502 http_504;(别忘了分号),調試proxy_read_timeout和proxy_connect_timeout時間,預設60,根據自己項目可能出現的等待時長設定小一點,例如10,20之類。

為了更新程式時,某些連接配接跳轉會導緻程式計算出問題(同一叢集下的新舊程式分别參與同一個使用者通路的操作,可能導緻結果錯誤),可配置成ip_hash。

注意,若更改nginx配置檔案,用 nginx -s reload 指令。

其原理為:利用proxy_read_timeout(response響應逾時時間,注意并非response内容全部傳回逾時時間,那是proxy_send_timeout)和proxy_connect_timeout(nginx與上有伺服器通訊握手的逾時時間),找到适合自己伺服器的逾時時長。當某重新開機的伺服器響應逾時時,依靠proxy_next_upstream(統計失敗的種類)和上遊伺服器的健康檢查(max_fails為0則不檢查直接跳轉其他伺服器),通路叢集同組的下一台伺服器。逾時時間需要考慮最長響應時間的業務,伺服器日常平均響應時長,可能的峰值時長,盡量讓使用者通路無感覺。

參數含義請細讀後文。

----------------------------------------------分割線----------------------------------------------

其中upstream中的server指令後面的參數部分

文法:server name [parameters]

parameters包含:

weight = NUMBER - 預設為1。設定伺服器權重。

max_fails = NUMBER - 預設為1,在一定時間内(這個時間在fail_timeout參數中設定)檢查這個伺服器是否可用時産生的最多失敗請求數,将其設定為0可以關閉檢查,檢查哪種錯誤,則在proxy_next_upstream或fastcgi_next_upstream(404錯誤不會使max_fails增加)中定義。

fail_timeout = TIME - 預設為10秒,在這個時間内産生了max_fails所設定大小的失敗嘗試連接配接請求後這個伺服器可能不可用,同樣它指定了伺服器不可用的時間(在下一次嘗試連接配接請求發起 之前),fail_timeout與前端響應時間沒有直接關系,不過可以使用proxy_connect_timeout和 proxy_read_timeout來控制。(如設定10秒,max_fails設定1,表示10秒内有超過1次失敗則該機暫時不可用。此後,再過10秒後才能再次開始失敗檢查。)

down - 标記伺服器處于離線狀态,通常和ip_hash一起使用。

backup - (0.6.7或更高)隻用于本伺服器,如果所有的非備份伺服器都當機或繁忙時通路該機。

關于max_fails 參數的了解:根據上面的解釋,max_fails預設為1,fail_timeout預設為10秒,也就是說,預設情況下後端伺服器在10秒鐘之内可以容許有一次的失 敗,如果超過1次則視為該伺服器有問題,将該伺服器标記為不可用。等待10秒後再 将請求發給該伺服器,以此類推進行後端伺服器的健康檢查。但如果我将max_fails設定為0, 則代表不對後端伺服器進行健康檢查,這樣一來fail_timeout參數也就沒什麼意義了。那若後端伺服器真的出現 問題怎麼辦呢?上文也說了,可以借助proxy_connect_timeout和proxy_read_timeout進行控制。

----------------------------------------------分割線----------------------------------------------

其中server下location中的相關配置

proxy_next_upstream

文法: proxy_next_upstream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off]

确定在何種情況下請求将轉發到下一個伺服器(目前叢集組内的下一台)。轉發請求隻發生在沒有資料傳遞到用戶端的過程中。同時,目前配置類型也會影響max_fails,隻有其配置的失敗類型才會進入max_fails計數器。

proxy_connect_timeout 預設60(s)

後端伺服器連接配接的逾時時間_發起握手等候響應逾時時間(web伺服器啟動後,nginx發起握手,伺服器回複,注意,此并非軟體響應的時間)

proxy_read_timeout 預設60(s)

連接配接成功後_等候後端伺服器響應時間_其實已經進入後端的排隊之中等候處理(也可以說是後端伺服器處理請求的時間。即response的響應時間,并非response全部傳回的時間)

proxy_send_timeout 預設60(s)

後端伺服器資料回傳時間_就是在規定時間之内後端伺服器必須傳完所有的資料的逾時時間

proxy_pass

文法 proxy_pass http://192.168……(或者域名,或者upstream的名字,後邊可以加二級目錄名,即項目的目錄名)

這個指令設定被代理伺服器的位址和被映射的URI

更多詳細配置請參考nginx官網。

參考文檔(參數用途測試)http://blog.sina.com.cn/s/blog_6b92dc3b0100n5al.html

繼續閱讀