为什么在不同容器中运行时,php-fpm显示nginx的IP地址?

105次阅读
没有评论

问题描述

在尝试设置一个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地址。

  1. 打开Nginx配置文件,通常是 nginx.confdefault.conf
  2. 在相应的 location 部分添加以下行,以将上游服务器的IP地址传递给Php-fpm容器:
location ~ \.php$ {
    fastcgi_pass php-fpm:9000;
    fastcgi_param REMOTE_ADDR $remote_addr;
}
  1. 在Php文件中,使用 $_SERVER['REMOTE_ADDR'] 获取上游服务器的IP地址。

方案2

使用Nginx的 ngx_http_upstream_module 模块来获取上游服务器的IP地址。

  1. 在Nginx配置文件中,定义一个上游块并设置后端服务器的地址:
upstream php_backend {
    server php-fpm:9000;
}
  1. 在相应的 location 部分,使用 proxy_set_header 指令将上游服务器的IP地址传递给Php-fpm容器:
location ~ \.php$ {
    proxy_pass http://php_backend;
    proxy_set_header X-Real-IP $remote_addr;
}
  1. 在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地址。

正文完