我在多个负载平衡代理后面设置了一个 nginx 实例,我正在使用real_ip
它来获取 remote_addr 中的客户端 IP 地址,以便由我的 Python 应用程序进行处理。
但是,在我的日志中,我想记录实际发出请求的代理服务器,但$remote_addr
现在已被覆盖,而且我找不到任何表明已制作副本的内容。
我怎样才能做到这一点?
我在多个负载平衡代理后面设置了一个 nginx 实例,我正在使用real_ip
它来获取 remote_addr 中的客户端 IP 地址,以便由我的 Python 应用程序进行处理。
但是,在我的日志中,我想记录实际发出请求的代理服务器,但$remote_addr
现在已被覆盖,而且我找不到任何表明已制作副本的内容。
我怎样才能做到这一点?
自您发布此问题后,您的设置可能已更改,但我遇到了同样的问题,并且终于有了可用的解决方案。我会把它贴在这里以防谷歌将其他人带到这个页面。
正如@Michael Hampton♦ 在他对我自己版本的这个问题的回答中指出的那样,nginx 已将变量添加到Real_IP 模块。它保留 的原始值,允许您使用/记录原始客户端的 IP 和将实际请求发送到 nginx 的服务器的 IP。截至 2015 年 11 月,这已添加到版本 1.9.7。
$realip_remote_addr
$remote_addr
如果您想在 nginx 端或应用程序内部登录,真的不知道吗?
对于 nginx 端,您可以
$http_x_forwarded_for
在 nginx log_format 定义中使用,如下所示:该模块本身似乎不支持该功能。但是,反向代理(主要使用 real_ip)可能会提供包含代理 IP 地址的 HTTP 标头字段。
不幸的是,您无法检查地址是否已被重写,因此未通过启用 real_ip 的代理连接的客户端可以伪造标头字段。
检查您代理的文档,也许您可以使用 HTTP 标头字段作为 IP 地址。