Nginx 與 HAProxy 後面的乘客導致 503 錯誤
在過去的一個月裡,我被迫學習了很多關於伺服器配置、集成、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和埠替換為
x
es。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”參數,則表示後端負載後的動態限制。然後,伺服器將始終至少接受連接,從不超過 ,並且當後端的並發連接少於兩個值時,限制將在兩個值之間的斜坡上。這使得在正常負載期間限制伺服器上的負載成為可能,但在重要負載期間進一步推動而不會使伺服器在異常負載期間過載。
我強烈建議通讀整個文件,因為那裡有很多很好的資訊。