AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
如何使用弹性负载均衡在 Web 服务器日志中捕获客户端 IP 地址?
我在 Web 服务器上使用弹性负载均衡 (ELB),并在 Web 服务器访问日志中查看负载均衡器的 IP 地址。我想改为捕获客户端 IP 地址。
简短描述
您的 Web 服务器访问日志之所以捕获负载均衡器的 IP 地址,是因为负载均衡器会与您的实例建立连接。要在 Web 服务器访问日志中捕获客户端 IP 地址,请进行以下配置:
-
对于具有 HTTP/HTTPS 侦听器的应用程序负载均衡器和经典负载均衡器,添加 X-Forwarded-For HTTP header(X-Forwarded-For HTTP 标头)来捕获客户端 IP 地址。然后,您可以对 Web 服务器访问日志进行配置,以记录这些 IP 地址。
注意: 在某些情况下,X-FORWARDED-FOR 标头可能不存在或为空。应用程序负载均衡器、经典负载均衡器和网络负载均衡器发起的运行状况检查请求不包含 X-FORWARDED-FOR 标头。此外,具有 TCP/SSL 侦听器的网络负载均衡器和经典负载均衡器不会将 X-FORWARDED-FOR 标头附加到传入请求中。对于应用程序负载均衡器,选择附加 processing mode(处理模式),从而以一致的方式添加 X-FORWARDED-FOR 标头。
-
对于具有 TCP/SSL 侦听器的经典负载均衡器,请 configure proxy protocol support on the Classic Load Balancer(在经典负载均衡器和目标应用程序上配置代理协议支持)。
-
对于网络负载均衡器,通过实例 ID 注册目标,从而无需进行额外的 Web 服务器配置即可捕获客户端 IP 地址。有关说明,请参阅 Target group attributes(目标组属性)。
-
对于只能将 IP 地址注册为目标的网络负载均衡器,请在负载均衡器上激活代理协议版本 2。有关说明,请参阅 Proxy protocol(代理协议)。
解决方法
具有 HTTP/HTTPS 侦听器的应用程序负载均衡器和经典负载均衡器 (Apache)
要添加 X-Forwarded-For HTTP 标头并配置您的 Web 服务器访问日志,请完成以下步骤:
-
使用文本编辑器打开您的 Apache 配置文件。位置因您的配置而异,例如适用于 Amazon Linux 和 RHEL 的 /etc/httpd/conf/httpd.conf,或适用于 Ubuntu 的 /etc/apache2/apache2.conf。
-
在 LogFormat 部分中,添加 %{X-Forwarded-For}i,如以下示例所示:
... LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common ... -
保存您的更改。
-
重新加载 Apache 服务。根据您的系统,运行以下命令之一:
Sysvinit、基于 Debian 的系统(例如 Ubuntu)和 SUSE(例如 SLES11)
# /etc/init.d/apache2 reloadSysvinit、基于 RPM 的系统(例如 RHEL 6 和 Amazon Linux),SUSE 除外
# /etc/init.d/httpd reloadSystemd、基于 Debian 的系统(例如 Ubuntu)和 SUSE(例如 SLES12)
# systemctl reload apache2基于 RPM 的系统(例如 RHEL 7 和 Amazon Linux 2),SUSE 除外
# systemctl reload httpd -
打开您的 Apache Web 服务器访问日志。位置因您的配置而异。
-
验证客户端 IP 地址现在是否记录在 X-Forwarded-For 标头下。
具有 HTTP/HTTPS 侦听器的应用程序负载均衡器和经典负载均衡器 (NGINX)
要添加 X-Forwarded-For HTTP 标头并配置您的 Web 服务器访问日志,请完成以下步骤:
-
使用文本编辑器打开您的 NGINX 配置文件。位置通常是 /etc/nginx/nginx.conf。
-
在 LogFormat 部分中,添加 $http_x_forwarded_for,如以下示例所示:
http { ... log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; ... } -
保存您的更改。
-
重新加载 NGINX 服务。对于 Amazon Linux 2 或 RHEL,运行以下命令:
systemctl reload nginx**注意:**在其他系统上,重新加载 NGINX 服务的命令是不同的。重新加载 NGINX 的命令与上一部分中重新加载 Apache 服务的命令类似。
-
打开您的 NGINX Web 服务器访问日志。位置因您的配置而异。
-
验证客户端 IP 地址现在是否记录在 X-Forwarded-For 标头下。
具有 TCP/SSL 侦听器的经典负载均衡器 (Apache)
要配置代理协议支持,请完成以下步骤:
-
使用文本编辑器打开您的 Apache 配置文件。位置因您的配置而异,例如适用于 Amazon Linux 和 RHEL 的 /etc/httpd/conf/httpd.conf,或适用于 Ubuntu 的 /etc/apache2/apache2.conf。
-
确保您的 Apache 配置可加载模块 mod_remoteip(适用于 Apache 2.4.31 及更高版本)。有关详细信息,请参阅 Apache 网站上的 Apache Module mod_remoteip(Apache 模块 mod_remoteip)。该模块包含 RemoteIPProxyProtocol 指令。有关详细信息,请参阅 Apache 网站上的 RemoteIPProxyProtocol Directive(RemoteIPProxyProtocol 指令)。在配置文件中,检查是否有与以下内容类似的行:
Amazon Linux 或 RHEL
LoadModule remoteip_module modules/mod_remoteip.soUbuntu
LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so -
要确认 mod_remoteip 模块是否已加载,请运行以下命令:
$ sudo apachectl -t -D DUMP_MODULES | grep -i remoteip -
查看输出并验证输出中是否包含与以下内容类似的行:
remoteip_module (shared)**重要事项:**如果输出不包含此行,则说明您的配置中不包含或未加载该模块。在继续操作之前,请务必激活该模块。
-
要激活代理协议支持,请将以下行添加到您的 Apache 配置文件中:
RemoteIPProxyProtocol On -
编辑配置文件的 LogFormat 部分以捕获远程 IP 地址 (%a) 和远程端口 (%{remote}p:):
LogFormat "%h %p %a %{remote}p %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined -
保存您的更改。
-
重新加载 Apache 服务。根据您的系统,运行以下命令之一:
Sysvinit、基于 Debian 的系统(例如 Ubuntu)和 SUSE(例如 SLES11)
# /etc/init.d/apache2 reloadSysvinit、基于 RPM 的系统(例如 RHEL 6 和 Amazon Linux),SUSE 除外
# /etc/init.d/httpd reloadSystemd、基于 Debian 的系统(例如 Ubuntu)和 SUSE(例如 SLES12)
# systemctl reload apache2Systemd、基于 RPM 的系统(例如 RHEL 7 和 Amazon Linux 2),SUSE 除外
# systemctl reload httpd -
打开 Apache Web 服务器访问日志。位置因您的配置而异。
-
验证客户端 IP 地址现在是否记录在 Proxy Protocol 标头下。
-
在目标应用程序中激活对代理协议的支持。
具有 TCP/SSL 侦听器的经典负载均衡器 (NGINX)
要配置代理协议支持,请完成以下步骤:
-
使用文本编辑器打开 NGINX 配置文件。位置通常是 /etc/nginx/nginx.conf。
-
将 server 部分的 listen 行更新为 proxy_protocol。更新 http 部分的 log_format 行,以设置 proxy_protocol_addr:
http { ... log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$proxy_protocol_addr"'; access_log /var/log/nginx/access.log main; ... } server { ... listen 80 default_server proxy_protocol; ... } ... } -
保存您的更改。
-
重新加载 NGINX 服务。对于 Amazon Linux 2 或 RHEL,运行以下命令:
systemctl reload nginx**注意:**在其他系统上,重新加载 NGINX 服务的命令是不同的。重新加载 NGINX 的命令与上一部分中重新加载 Apache 服务的命令类似。
-
打开 NGINX Web 服务器访问日志。位置因您的配置而异。
-
验证客户端 IP 地址现在是否记录在 Proxy Protocol 标头下。
-
在目标应用程序中激活对代理协议的支持。

