我最近继承了一个基础设施,其中所有用户都经过 AWS ELB -> nginx 代理 -> AWS ELB -> Apache。我看到的问题是客户端的 IP 在 Apache 中显示两次,类似于以下行:
"x.x.x.x, x.x.x.x" - - [26/Oct/2016:18:59:10 +0000] "GET /....
nginx 对该虚拟主机的访问日志非常正常:
x.x.x.x - - [26/Oct/2016:18:59:10 +0000] "GET /
问题是我不太清楚如何调试丢失的位置。我猜想这要么是 nginx 发送的标头,要么是 Apache 中出现了一些奇怪的东西,尽管我怀疑是 nginx 传递的 X-Forwarded-For 标头。以下是受影响域的相关虚拟主机配置:
location / { if ($xxx-example-com-maintenance) { return 503; } if ($http_origin ~* (https?://xxx\.example\.com)) { add_header 'Access-Control-Allow-Origin' "$http_origin"; } proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass $upstream;
现在,Apache 的日志格式如下所示:
LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" SESSION-%{frontend}C %h" forwarded
后者是从以前的 Web 堆栈复制而来,工作得很好。有点停留在这里,因为从我的角度来看一切都很好。我确实发现nginx real_ip_header 和 X-Forwarded-For 似乎错误但是我运行的是 nginx 1.10。Apache 版本是 2.4.23。如果您能提供进一步排除故障的见解,我将不胜感激。提前致谢。
答案1
事实证明,X-Forwarded-For 标头的行为就是这样的,解决方案是使用 ELB 未使用的其他标头 - 在我的情况下是 X-Real-IP。我现在可以在日志中看到单个 IP。