我想使用執行 Apache 或 NGINX 的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,作為 Elastic Load Balancing (ELB) 的後端伺服器。我想知道提供最佳效能的設定。
解決方法
為了獲得最佳效能,請分析後端應用程式的回應時間和用戶端的要求。
用戶端標頭逾時
如果後端伺服器關閉連線且沒有通知負載平衡器,則在使用 Application Load Balancer 時,您可能會收到 HTTP 502 錯誤。若是使用 Classic Load Balancer,您會收到 HTTP 504 錯誤。
ㄖ握要防止閒置連線,請將應用程式逾時設定為高於閒置逾時的值。若要為 Apache 設定應用程式逾時,請參閱 Apache 網站上的 TimeOut 指令。對於 NGINX,請參閱 NGINX 網站上的 client_header_timeout。
keepalive
若要減少 CPU 使用率並提高回應時間,請開啟 keepalive 功能。當您開啟 keepalive 時,負載平衡器不會為每個 HTTP 請求建立新的 TCP 連線。
若要為 Apache 啟用 Keepalive,請參閱 Apache 網站上的 KeepAlive 指令。若要在 NGINX 中啟用 keepalive,請將 keepalive_disable 設定為 none (無)。如需詳細資訊,請參閱 NGINX 網站上的 keepalive_disable。
當您開啟 keepalive 選項時,請選擇比負載平衡器閒置逾時更長的 keepalive 逾時時間。若要在 Apache 中設定逾時,請參閱 Apache 網站上的 KeepAliveTimeout 指令。對於 NGINX,請參閱 NGINX 網站上的 keepalive_timeout。
讀取逾時
設定適合應用程式回應時間的讀取逾時。負載平衡器必須保持連線開啟夠長的時間,以接收請求的標頭和內文。
**注意:**確保負載平衡器閒置逾時值低於後端逾時值。
若要在 Apache 中設定請求讀取逾時,請參閱 RequestReadTimeout 指令。若要在 NGINX 中設定用戶端標頭逾時,請參閱 NGINX 網站上的 client_header_timeout。如需 NGINX 中的用戶端主體逾時,請參閱 NGINX 網站上的 client_body_timeout。
Keepalive 請求的最大數量
開啟 keepalive 時,將單一 TCP 連線服務的請求數設定為 100 或以上。若要在 Apache 中設定請求數量,請參閱 Apache 網站上的 MaxKeepAliveRequests 指令。對於 NGINX,請參閱 NGINX 網站上的 keepalive_requests。
AcceptFilter
預設情況下,AcceptFilter 處於開啟狀態。AcceptFilter 指示 Apache 對連線使用 TCP_DEFER_ACCEPT 選項,這可能導致 TCP 通訊端保持在半開狀態。當 TCP 通訊端保持半開狀態時,負載平衡器會假設連線已建立,但後端執行個體並未完全建立連線。半開連線在低容量負載平衡器中更為常見,其中連線在使用前處於閒置狀態。
若要在 Apache 中設定 AcceptFilter,請參閱 Apache 網站上的 AcceptFilter 指令。對於 NGINX,請參閱 NGINX 網站上的 listen。
記錄
若要啟用 %{X-Forwarded-For}i 選項,以便 Apache 在其日誌中為每個請求顯示 ELB x-forwarded-for 標頭,請執行下列命令:
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" combined
ELB x-forwarded-for 標頭包含原始用戶端的 IP 位址。%D 選項會將完成每個請求所需的時間新增至存取日誌。
Apache MPM
Apache 事件多工處理模組 (MPM) 可能會過早關閉來自負載平衡器的連線,導致 Application Load Balancer 出現 HTTP 502 錯誤。若是使用 Classic Load Balancer,您會收到 HTTP 504 錯誤。
最佳做法是使用工作者 MPM。
**注意:**更新組態之後,請重新啟動 Apache 或 NGINX。
相關資訊
為 Classic Load Balancer 註冊執行個體
設定 Classic Load Balancer