我想使用运行 Apache 或 NGINX 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例作为弹性负载均衡 (ELB) 的后端服务器。我想了解能提供最佳性能的设置。
为获得最佳性能,请分析后端应用程序的响应时间和客户端的需求。
如果后端服务器关闭连接但未通知负载均衡器,则对于应用程序负载均衡器,您可能会收到 HTTP 502 错误。对于经典负载均衡器,您会收到 HTTP 504 错误。
为防止空闲连接,请将您的应用程序超时值设置为高于空闲超时值。要为 Apache 配置应用程序超时,请参阅 Apache 网站上的 TimeOut directive(TimeOut 指令)。对于 NGINX,请参阅 NGINX 网站上的 client_header_timeout。
要降低 CPU 使用率并缩短响应时间,请启用 keepalive。启用 keepalive 时,负载均衡器不会为每个 HTTP 请求建立新的 TCP 连接。
要为 Apache 启用 keepalive,请参阅 Apache 网站上的 KeepAlive directive(KeepAlive 指令)。要在 NGINX 中启用 keepalive,请将 keepalive_disable 设置为 none。有关详细信息,请参阅 NGINX 网站上的 keepalive_disable。
启用 keepalive 选项时,请将 keepalive 超时时间设置为长于负载均衡器的空闲超时时间。要在 Apache 中配置超时,请参阅 Apache 网站上的 KeepAliveTimeout directive(KeepAliveTimeout 指令)。对于 NGINX,请参阅 NGINX 网站上的 keepalive_timeout。
根据应用程序响应时间设置合适的读取超时时间。负载均衡器必须保持连接打开足够长的时间,以便接收请求的标头和正文。
**注意:**请确保负载均衡器空闲超时值低于后端超时值。
要在 Apache 中设置请求读取超时,请参阅 RequestReadTimeout directive(RequestReadTimeout 指令)。要在 NGINX 中设置客户端标头超时,请参阅 NGINX 网站上的 client_header_timeout。要在 NGINX 中设置客户端正文超时,请参阅 NGINX 网站上的 client_body_timeout。
当启用 keepalive 时,请将单个 TCP 连接处理的请求数量设置为 100 或更高。要在 Apache 中设置请求数量,请参阅 Apache 网站上的 MaxKeepAliveRequests directive(MaxKeepAliveRequests 指令)。对于 NGINX,请参阅 NGINX 网站上的 keepalive_requests。
默认情况下,AcceptFilter 处于启用状态。AcceptFilter 会告知 Apache 对连接使用 TCP_DEFER_ACCEPT 选项,这可能会导致 TCP 套接字处于半开状态。当 TCP 套接字保持半开状态时,负载均衡器会认为连接已建立,但后端实例并未完全建立连接。半开连接在低流量的负载均衡器中更为常见,在这些负载均衡器中,连接在使用前会处于空闲状态。
要在 Apache 中配置 AcceptFilter,请参阅 Apache 网站上的 AcceptFilter directive(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) 可能会过早关闭来自负载均衡器的连接,从而导致应用程序负载均衡器返回 HTTP 502 错误。对于经典负载均衡器,您会收到 HTTP 504 错误。
最佳做法是改用 Worker MPM。
**注意:**更新配置后,请重启 Apache 或 NGINX。
经典负载均衡器的已注册实例
配置您的经典负载均衡器