nginx 带有 real_ip - 记录客户端 remote_addr 和代理地址

nginx 带有 real_ip - 记录客户端 remote_addr 和代理地址

我在多个负载平衡代理后面设置了一个 nginx 实例,并且我使用real_ip它来获取 remote_addr 中的客户端 IP 地址,以供我的 Python 应用程序处理。

然而,在我的记录中,我想记录实际发出请求的代理服务器,但$remote_addr现在已被覆盖,并且我找不到任何表明已制作其副本的内容。

我怎样才能实现这个目标?

答案1

自从你发布这个问题以来,你的设置可能已经发生了变化,但我遇到了同样的问题,现在终于有一个解决方案了。我会在这里发布它,以防 Google 把其他人带到这个页面。

正如 @Michael Hampton♦ 在他的回答我自己的版本这个问题,nginx 已经将变量添加$realip_remote_addrReal_IP模块。它保存 的原始值$remote_addr,允许您使用/记录原始客户端的 IP 和向 nginx 发送实际请求的服务器的 IP。截至 2015 年 11 月,此功能已添加到 1.9.7 版。

答案2

您不太明白是否要在 nginx 端或应用程序内部进行记录?

对于 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"';

答案3

模块本身似乎不支持这一点。但是,反向代理(real_ip 最常用于此)可能会提供包含代理 IP 地址的 HTTP 标头字段。

不幸的是,您无法检查地址是否已被重写,因此未通过启用 real_ip 的代理连接的客户端可以伪造标头字段。

检查您的代理的文档,也许您可​​以使用 HTTP 标头字段来获取 IP 地址。

相关内容