问题描述
在尝试设置一个Nginx服务器,以实现在4个Php-fpm服务器之间进行负载均衡。他在Docker配置文件中配置了这些容器,并在问题中提供了对应的Github仓库链接。用户发现,尽管他的Php文件中有一行代码用于显示服务器的IP地址,但无论何时刷新页面,它总是显示Nginx服务器的IP地址,尽管代码是在另一个容器中解释执行。用户想要了解为什么会出现这种情况。
解决方案
请注意以下操作可能受到版本差异的影响,请在执行前做好备份。
用户遇到的问题是由于使用了$_SERVER['SERVER_ADDR']
获取服务器IP地址,这个变量实际上是由Nginx服务器提供的,所以无论在哪个容器内执行代码,它都会显示Nginx服务器的IP地址。如果想要获取处理请求的上游服务器的IP地址,可以尝试以下解决方案。
方案1
在Nginx配置中,将上游服务器的IP地址传递给Php-fpm容器,然后在Php文件中使用该IP地址。
- 打开Nginx配置文件,通常是
nginx.conf
或default.conf
。 - 在相应的
location
部分添加以下行,以将上游服务器的IP地址传递给Php-fpm容器:
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_param REMOTE_ADDR $remote_addr;
}
- 在Php文件中,使用
$_SERVER['REMOTE_ADDR']
获取上游服务器的IP地址。
方案2
使用Nginx的 ngx_http_upstream_module
模块来获取上游服务器的IP地址。
- 在Nginx配置文件中,定义一个上游块并设置后端服务器的地址:
upstream php_backend {
server php-fpm:9000;
}
- 在相应的
location
部分,使用proxy_set_header
指令将上游服务器的IP地址传递给Php-fpm容器:
location ~ \.php$ {
proxy_pass http://php_backend;
proxy_set_header X-Real-IP $remote_addr;
}
- 在Php文件中,使用
$_SERVER['HTTP_X_REAL_IP']
获取上游服务器的IP地址。
通过以上两种方案,你可以在Php文件中获取到上游服务器的IP地址,而不是Nginx服务器的IP地址,从而解决你遇到的问题。
方案3
如果需要更进一步的调试或解决问题,可以参考上述提供的StackOverflow回答。
总结
在使用 $_SERVER['SERVER_ADDR']
获取服务器IP地址时,实际上获取的是Nginx服务器的IP地址,而不是上游服务器的IP地址。要获取上游服务器的IP地址,可以通过在Nginx配置中传递该地址给Php-fpm容器,或者使用Nginx的 ngx_http_upstream_module
模块来获取。通过这些方法,你可以在Php文件中正确地获取到处理请求的上游服务器的IP地址。