我最近使用 Apache 和 NGINX 反向代理切换到 VestaCP。很快我注意到所有传入流量都被记录为服务器 IP 地址。这是 Apache 只能看到 NGINX 代理服务器的 IP 地址,是我自己的服务器 IP。
使用
phpinfo()
我可以验证客户端 IP 是否已在 HTTP_X_FORWARDED_FOR
和 HTTP_X_REAL_IP
中正确转发,但未正确添加到 REMOTE_ADDR
。
我已经尝试通过在 NGINX 配置文件中添加以下内容来确保 IP 正确地从 NGINX 转发到 Apache:
fastcgi_param REMOTE_ADDR $http_x_real_ip;
和
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这绝对是正确的方向,因为我可以看到值
$_SERVER['HTTP_X_REAL_IP']
显示了正确的 IP 地址。
然而,这似乎对$_SERVER['REMOTE_ADDR']
没有任何作用。
我还遇到了一些其他模糊的建议,例如手动设置IP地址,但这从未起到任何作用:
set_real_ip_from 192.168.122.1;
我不能简单地使用
$_SERVER['HTTP_X_REAL_IP']
,因为我使用的框架是通过硬编码来使用 $_SERVER['REMOTE_ADDR']
。
为了让它发挥作用,我做了以下工作:
我使用以下命令安装了 Apache
remoteip
模块:
sudo a2enmod remoteip && systemctl restart apache2
在
/etc/nginx/nginx.conf
中,我确保在http {}
块中添加以下行
proxy_set_header X-Client-IP $remote_addr;
然后我根据
Apache 文档将以下代码块添加到我的
/home/admin/conf/web/sitename.apache2.conf
<IfModule mod_remoteip.c>
RemoteIPHeader X-Client-IP
</IfModule>
确保 NGINX(步骤 2)和 Apache(步骤 3)都使用完全相同的变量名称
X-Client-IP
似乎已经成功了。
现在它使用转发的客户端 IP 地址正确填充了
REMOTE_ADDR
。