Nginx

Nginx 與 HAProxy 後面的乘客導致 503 錯誤

  • September 15, 2011

在過去的一個月裡,我被迫學習了很多關於伺服器配置、集成、AWS 等的東西。我從來沒有學過這些東西。

我的應用程序一切正常並執行良好(主要感謝http://github.com/wr0ngway/rubber gem 和#rubberec2 IRC 頻道的幫助)。但是,我遇到了一個神秘的(對我而言)問題。

我在 HAProxy 後面執行 Nginx + Passenger。到目前為止,只使用了一台 Nginx + Passenger 主機,因此 HAProxy 還沒有真正做太多,但我們將來會添加更多的應用伺服器。

問題

我遇到了偶爾的 503 錯誤,這些錯誤在一天中的某些時候變得煩人(在更高的負載期間?)。這些錯誤發生在靜態資產和路由 url 上。我已經確定是 HAProxy 拋出了它們,因為頁面及其標題與 /etc/haproxy/errors/503.http 中的相同。

我認為 nginx 不在乎它收到多少請求,它可以處理所有請求,因為它有自己的隊列,並且乘客可以正確分配東西。那麼為什麼 HAProxy 聲稱沒有可用的伺服器來處理某些請求呢?

我的 HAProxy 配置

global
 log 127.0.0.1 local0 warning
 maxconn 1024

defaults
 log global
 mode http
 retries 3
 balance roundrobin
 option abortonclose
 option redispatch
 option httplog
 contimeout 4000
 clitimeout 150000
 srvtimeout 30000

listen passenger_proxy x.x.x.x:x
 option forwardfor
 server web01 web01:xxxx maxconn 20 check

注意:IP和埠替換為xes。

PS我不擅長這些東西,邊走邊學。

更新

我曾經siege對伺服器進行基準測試,發現在執行大約 58 個並發會話時可以重現 503。這種情況下成功率只有54%。

更新 2

我發現"-" 400 0 "-" "-" "-"每次收到 503 時都會輸出 nginx 訪問日誌。

更新 3

每個人都說,當 cookie 太大時,nginx 會給出“400 Bad Request”錯誤。但是設置large_client_header_buffers指令並沒有為我解決它。

更新 4

siege在伺服器上執行,直接在其偵聽埠上針對 nginx,現在 nginx 開始返回 499 錯誤,其模式與以前返回 503 的模式相同。Siege 一直告訴我,發生這種情況時連接會超時。看來我越來越近了。

更新 5

我注意到 nginx 正在我係統上的兩個地方登錄,並且每次 siege 顯示“連接超時”時都會返回此消息的錯誤日誌:

file=ext/nginx/HelperAgent.cpp:574 time=2011-09-15 07:43:22.196 ]: Couldn't forward the HTTP response back to the HTTP client: It seems the user clicked on the 'Stop' button in his browser.

從 HAProxy配置指南中,您需要增加maxconn伺服器聲明中的參數。

當伺服器指定了“maxconn”參數時,這意味著它的並發連接數永遠不會增加。此外,如果它具有“minconn”參數,則表示後端負載後的動態限制。然後,伺服器將始終至少接受連接,從不超過 ,並且當後端的並發連接少於兩個值時,限制將在兩個值之間的斜坡上。這使得在正常負載期間限制伺服器上的負載成為可能,但在重要負載期間進一步推動而不會使伺服器在異常負載期間過載。

我強烈建議通讀整個文件,因為那裡有很多很好的資訊。

引用自:https://serverfault.com/questions/311534