使用 nginx 作为反向代理时,Apache 上的 REMOTE_ADDR 和 SERVER_ADDR 错误

使用 nginx 作为反向代理时,Apache 上的 REMOTE_ADDR 和 SERVER_ADDR 错误

我在 Mac OS X 上,在 VirtualBox 中运行 Ubuntu。Mac OS 可以在本地网络中通过 IP 192.168.0.100 访问,Ubuntu 是 192.168.0.123(它使用 VirtualBox 网络设置中的“桥接适配器”选项)。

在 Ubuntu 安装中,我让 nginx (端口 80) 作为 Apache 2.4 (端口 8081) 的反向代理。这工作正常,如果我在 Mac OS 中打开浏览器并指向 192.168.0.123,它会通过 nginx 打开 Apache 提供的文件。

问题是,即使我已经启用了 RPAF 模块,我还是得到了 Apache 上服务器和远程 IP 地址的意外值。

当从 Mac 中的浏览器访问时,我期望的值是:

SERVER_ADDR = 192.168.0.123 # Apache server IP, which is the Ubuntu IP
REMOTE_ADDR = 192.168.0.100 # The Mac OS X IP

但是,如果我将 nginx 设置为,proxy_pass 192.168.0.123:8081则会得到:

SERVER_ADDR = 192.168.0.123
REMOTE_ADDR = 198.168.0.123

设置proxy_pass 127.0.0.1:8081给了我正确的远程地址(191.168.0.100),但 127.0.0.1 作为服务器地址。

关于如何获得预期结果有什么想法吗?

编辑)我使用默认的 RPAF 设置:

<IfModule rpaf_module>
RPAF_Enable             On
RPAF_ProxyIPs           127.0.0.1
RPAF_SetHostName        On
RPAF_SetHTTPS           On
RPAF_SetPort            On
RPAF_ForbidIfNotProxy   Off
</IfModule>

nginx 中的这些设置:

proxy_set_header X-Real-IP  $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header  X-Server-Address  $server_addr;
proxy_set_header Host $host;

答案1

Apache 会将 IP 地址192.168.0.123视为源,并且需要添加指令RPAF_proxyips,这表明mod_rpaf它是一个已知的代理。

引自http://www.stderr.net/apache/rpaf/

当满足两个条件时,它会更改其他 Apache 模块可见的客户端远程地址。第一个条件是远程客户端实际上是 httpd.conf 中定义的代理。其次,如果有传入的 X-Forwarded-For 标头,并且代理在其已知代理列表中,它将从传入的 X-Forwarded-For 标头中获取最后一个 IP,并更改请求结构中客户端的远程地址。它还会获取传入的 X-Host 标头并相应地更新虚拟主机设置。对于 Apache2 mod_proxy,它会获取 X-Forwared-Host 标头并更新虚拟主机

相关内容