我想使用執行 Apache 或 NGINX 的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體作為 Elastic Load Balancing (ELB) 的後端伺服器。但是,我不知道要使用什麼設定才能獲得最佳效能。
解決方法
負載平衡器的最佳設定取決於您的使用案例。為了獲得最佳效能,請分析後端應用程式的回應時間和用戶端的需求。
如果後端應用程式正在執行 Apache 或 NGINX,請檢閱下列參數:
用戶端標頭逾時 (Apache 中的 Timeout;NGINX 中的 client_header_timeout):
將應用程式逾時設定為高於負載平衡器閒置逾時值的值。執行此操作可確保負載平衡器正確關閉閒置連線。如果後端伺服器在未向負載平衡器發出適當通知的情況下終止連線,則您可能會收到 504 錯誤訊息。
Keep-alive (Apache 中的 KeepAlive;NGINX 中的 keepalive_disable):
開啟 keep-alive 以減少 CPU 使用率,並縮短回應時間。開啟 keep-alive 後,負載平衡器不需要為每個 HTTP 請求建立新的 TCP 連線。
Keep-alive 逾時 (Apache 中的 KeepAliveTimeout;NGINX 中的 keepalive_timeout):
開啟 keep-alive 選項後,請選擇比負載平衡器閒置逾時更長的 keep-alive 逾時。
讀取逾時 (Apache 中的 RequestReadTimeout;client_header_timeout,以及 NGINX 中的 client_body_timeout):
設定適合應用程式回應時間的讀取逾時。執行此操作可確保您的負載平衡器保持連線開啟的時間足以接收請求的標頭和內文。
**警告:**確保負載平衡器閒置逾時值低於後端逾時。
keep-alive 請求的最大數量 (Apache 中的 MaxKeepAliveRequests;NGINX 中的 keepalive_requests):
此選項設定 keep-alive 狀態開啟時,單一 TCP 連線服務的請求數量。為了妥善使用資源,請將 keep-alive 請求的最大數量設定為 100 或更高。
AcceptFilter (Apache 中的 AcceptFilter;NGINX 中的 accept_filter):
依預設,AcceptFilter 為開啟狀態,並指示 Apache 對連線使用 TCP\ _DEFER\ _ACCEPT 選項。此設定可能會導致 TCP 通訊端處於「半開啟」狀態。在此狀態下,負載平衡器會假設連線已建立,但後端執行個體並未建立連線。半開啟連線在低容量負載平衡器中較為常見,其中連線在使用前會有時間老化。
記錄:開啟 %{X-Forwarded-For}i 選項,如此一來,Apache 就會在每個請求的日誌中顯示 ELB x-forwarded-for 標頭。此標頭包含原始用戶端的 IP 地址。%D 選項會將完成每個請求所需的時間新增至存取日誌:
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" combined
Apache: Apache MPM 事件模組可以提前關閉來自負載平衡器的連線。提前關閉連線會為 Application Load Balancer 產生 HTTP 502 錯誤,以及為 Classic Load Balancer 產生 HTTP 504 錯誤。最佳實務是使用 MPM 工作模組來減少此行為。
**注意:**更新組態之後,請重新啟動 Apache 或 NGINX。
相關資訊
為 Classic Load Balancer 註冊執行個體
設定 Classic Load Balancer