我有一个在多个负载平衡代理后面设置的nginx实例,我正在使用real_ip
获取remote_addr中的客户端IP地址,以供我的Python应用程序处理。
然而,在我的日志中,我想logging实际发出请求的代理服务器,但$remote_addr
现在已被覆盖,而且我找不到任何说明它的副本。
我将如何能够做到这一点?
自发布此问题以来,您的设置可能已经发生了变化,但是我遇到了同样的问题,最终有一个可用的解决scheme。 如果Google将其他人带到此页面,我会在这里发布。
正如@Michael Hampton♦在他对这个问题的回答中指出的那样,nginx已经将variables$realip_remote_addr
添加到了Real_IP模块中 。 它保存$remote_addr
的原始值,允许您使用/logging发起客户端的IP和发送实际请求到nginx的服务器的IP。 截至2015年11月,该版本已被添加到版本1.9.7。
模块本身接缝不支持。 但是,反向代理(主要使用real_ip)可能会提供包含代理IP地址的HTTP头字段。
不幸的是,你不能检查地址是否被重写,所以没有通过启用real_ip的代理连接的客户端可以伪造头字段。
检查你的代理的文档,也许你可以使用HTTP头字段的IP地址。
不要真的得到,如果你想在nginx侧或在你的应用程序>login
对于nginx端,你可以在nginx的log_format定义中使用$ http_x_forwarded_for,如下所示:
log_format main '$remote_addr - $remote_user [$time_local] [$msec] [$request_time] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';