Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
如何在 ELB 后面的 Web 服务器日志中捕获客户端 IP 地址?
我正在对我的 Web 服务器使用弹性负载均衡器 (ELB),我可以在 Web 服务器访问日志中看到负载均衡器的 IP 地址。如何改为捕获客户端 IP 地址?
简短描述
您的 Web 服务器访问日志之所以捕获负载均衡器的 IP 地址,是因为负载均衡器会与您的实例建立连接。要在 Web 服务器访问日志中捕获客户端的 IP 地址,请进行以下配置:
- 对于具有 HTTP/HTTPS 侦听器的 Application Load Balancer 和 Classic Load Balancer,使用 X-Forwarded-For HTTP 标头来捕获客户端 IP 地址。然后,您可以将 Web 服务器访问日志配置为记录这些 IP 地址。
- 对于具有 TCP/SSL 侦听器的经典负载均衡器,需要在经典负载均衡器和目标应用程序上激活代理协议支持。确保在负载均衡器和应用程序上配置代理协议支持。
- 对于 Network Load Balancer,请按实例 ID 注册目标,以捕获客户端 IP 地址,而无需额外的 Web 服务器配置。有关说明,请参阅目标组属性而不是以下解决方法。
- 对于网络负载均衡器,如果您只能将 IP 地址注册为目标,请在负载均衡器上激活代理协议版本 2。有关说明,请参阅启用代理协议而不是以下解决方法。
解决方法
具有 HTTP/HTTPS 侦听器的 Application Load Balancer 和 Classic Load Balancer (Apache)
1. 使用文本编辑器打开 Apache 配置文件。位置因配置而异,例如,Amazon Linux 和 RHEL 上的位置是 /etc/httpd/conf/httpd.conf,或者 Ubuntu 上的位置是 /etc/apache2/apache2.conf。
2. 在 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 ...
3. 保存所做更改。
4. 重新加载 Apache 服务。
对于 Sysvinit、基于 Debian 的系统(如 Ubuntu)和 SUSE(如 SLES11),请运行以下命令:
# /etc/init.d/apache2 reload
对于 Sysvinit、基于 RPM 的系统(如 RHEL 6 和 Amazon Linux),不包括 SUSE,请运行以下内容:
# /etc/init.d/httpd reload
对于 Systemd、基于 Debian 的系统(如 Ubuntu)和 SUSE(如 SLES12),请运行以下命令:
# systemctl reload apache2
对于 Systemd、基于 RPM 的系统(如 RHEL 7 和 Amazon Linux 2),不包括 SUSE,请运行以下命令:
# systemctl reload httpd
5. 打开您的 Apache Web 服务器访问日志。位置因配置而异。
6. 验证客户端 IP 地址现在是否记录在 X-Forwarded-For 标头下。
具有 HTTP/HTTPS 侦听器的 Application Load Balancer 和 Classic Load Balancer (NGINX)
1. 使用文本编辑器打开 NGINX 配置文件。该位置通常是 /etc/nginx/nginx.conf。
2. 在 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; ... }
3. 保存所做更改。
4. 重新加载 NGINX 服务。
例如,在 Amazon Linux 2 或 RHEL 上,运行以下命令:
systemctl reload nginx
**注意:**用于重新加载 NGINX 服务的命令在其他系统上各不相同。用于重新加载 NGINX 的命令类似于上一节中用于重新加载 Apache 服务的命令。
5. 打开您的 NGINX Web 服务器访问日志。位置因配置而异。
6. 验证客户端 IP 地址现在是否记录在 X-Forwarded-For 标头下。
具有 TCP/SSL 侦听器的 Classic Load Balancer (Apache)
1. 使用文本编辑器打开 Apache 配置文件。位置因配置而异,例如 Amazon Linux 和 RHEL 上的位置是 /etc/httpd/conf/httpd.conf,Ubuntu 上的位置是 /etc/apache2/apache2.conf。
2. 确保您的 Apache 配置加载模块 mod_remoteip(适用于 Apache 2.4.31 及更高版本)。该模块包括 RemoteIPProxyProtocol 指令。在配置文件中,检查与以下内容类似的行:
Amazon Linux 或 RHEL:
LoadModule remoteip_module modules/mod_remoteip.so
Ubuntu:
LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so
3. 确认 mod_remoteip 模块加载:
$ sudo apachectl -t -D DUMP_MODULES | grep -i remoteip
4. 检查输出并验证输出是否包含类似于以下内容的行:
remoteip_module (shared)
**重要提示:**如果输出中不包含此行,则说明您的配置中不包含或未加载该模块。在继续之前,请确保激活该模块。
5. 将下面一行添加到 Apache 配置文件中以激活代理协议支持:
RemoteIPProxyProtocol On
6. 编辑配置文件的 LogFormat 部分以捕获远程 IP 地址 (%a) 和远程端口 (%{remote}p:),类似于以下内容:
LogFormat "%h %p %a %{remote}p %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
7. 保存所做更改。
8. 重新加载 Apache 服务。
对于 Sysvinit、基于 Debian 的系统(如 Ubuntu)和 SUSE(如 SLES11),请运行以下命令:
# /etc/init.d/apache2 reload
对于 Sysvinit、基于 RPM 的系统(如 RHEL 6 和 Amazon Linux),不包括 SUSE,请运行以下内容:
# /etc/init.d/httpd reload
对于 Systemd、基于 Debian 的系统(如 Ubuntu)和 SUSE(如 SLES12),请运行以下命令:
# systemctl reload apache2
对于 Systemd、基于 RPM 的系统(如 RHEL 7 和 Amazon Linux 2),不包括 SUSE,请运行以下命令:
# systemctl reload httpd
9. 打开 Apache Web 服务器访问日志。位置因配置而异。
10. 验证客户端 IP 地址现在是否记录在 Proxy Protocol 标头下。
11. 在目标应用程序中激活对代理协议的支持。
具有 TCP/SSL 侦听器的经典负载均衡器 (NGINX)
1. 使用文本编辑器打开 NGINX 配置文件。该位置通常是 /etc/nginx/nginx.conf。
2. 将 server(服务器)部分的 listen(侦听)行更改为*NOTE: THIS IS PLACEHOLDER CONTENT THAT WILL BE REPLACED AFTER EDITING*(*注意:这是占位符内容,将在编辑后被替换*)
###Long Sentences XX ###Wrong/Misspelled Service Name ###Link broken or incorrect title link ###Sensitive Terms Terms ###Changes **WAS:** **IS:** **REASON:** **WAS:** **IS:** **REASON:** **WAS:** **IS:** **REASON:** **WAS:** **IS:** **REASON:** 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; ... } ... }
3. 保存所做更改。
4. 重新加载 NGINX 服务。
例如,在 Amazon Linux 2 或 RHEL 上,运行以下命令:
systemctl reload nginx
**注意:**用于重新加载 NGINX 服务的命令在其他系统上各不相同。用于重新加载 NGINX 的命令类似于上一节中用于重新加载 Apache 服务的命令。
5. 打开 NGINX Web 服务器访问日志。位置因配置而异。
6. 验证客户端 IP 地址现在是否记录在 Proxy Protocol 标头下。
7. 在目标应用程序中激活对代理协议的支持。
- 语言
- 中文 (简体)
