PHP$(服务器[‘;服务器地址’;]变量始终返回127.0.0.1

PHP$(服务器[‘;服务器地址’;]变量始终返回127.0.0.1,php,linux,lamp,superglobals,server-farm,Php,Linux,Lamp,Superglobals,Server Farm,我们有多台负载平衡的web服务器机器运行相同的phpwebapp(),我希望在每台服务器上运行稍微不同的代码(出于测试目的)。我希望使用$\u服务器['SERVER\u ADDR']super-global来执行以下操作: if ($_SERVER['SERVER_ADDR'] == 'XXX.XXX.XXX.XXX') { echo "Do one thing"; } elseif ($_SERVER['SERVER_ADDR'] == 'YYY.YYY.YYY.YYY') { ech

我们有多台负载平衡的web服务器机器运行相同的phpwebapp(),我希望在每台服务器上运行稍微不同的代码(出于测试目的)。我希望使用
$\u服务器['SERVER\u ADDR']
super-global来执行以下操作:

if ($_SERVER['SERVER_ADDR'] == 'XXX.XXX.XXX.XXX') {
  echo "Do one thing";
} elseif ($_SERVER['SERVER_ADDR'] == 'YYY.YYY.YYY.YYY') {
  echo "Do something else";
}
127.0.0.1       localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6
XXX.XX.XX.XX    blahblah
不幸的是,这不起作用,因为两台计算机都将
$\u SERVER['SERVER\u ADDR']
设置为'127.0.0.1'。如何配置它们,以便将
$\u SERVER['SERVER\u ADDR']
设置为它们的公共IP地址

我猜这个问题可能与
/etc/hosts
有关,因此对于参考,目前的情况如下:

if ($_SERVER['SERVER_ADDR'] == 'XXX.XXX.XXX.XXX') {
  echo "Do one thing";
} elseif ($_SERVER['SERVER_ADDR'] == 'YYY.YYY.YYY.YYY') {
  echo "Do something else";
}
127.0.0.1       localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6
XXX.XX.XX.XX    blahblah
更新。。。 哎呀!我忽略了在Web服务器前面考虑反向代理。由于nginx conf中的以下行,这些web服务器的所有流量都来自nginx:

location / {
    root                  /var/www/staging/current;
    proxy_pass            http://localhost:8880;
}

反转/etc/hosts中的行

XXX.XX.XX.XX    blahblah
127.0.0.1       localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6

如果工作正常,可能需要更改负载平衡器与服务器的连接方式。我不知道这是什么软件

您最好根据机器之间发生变化的其他因素进行切换。一个很好的选择是主机名:

$host= php_uname('n');
switch($host) {
    case 'webserver1':
        ...do one thing...
        break;
    case 'webserver2':
        ...do another thing...
        break;
    default:
        die('No configuration for unknown host '.$host);
}

要解决我的问题,我有3个想法:

  • 我可能会将每个服务器的IP地址硬编码到每个服务器上的配置文件中的PHP变量中
  • 我可能会使用Apache()的反向代理添加转发模块
  • 我可能会将每个服务器上的
    代理\u密码更改为转到
    XXX.XXX.XXX:8880
    YYY.YYY.YYY:8880
    ,而不是
    localhost

  • 这当然很简单

    $ip = getHostByName(php_uname('n')); 
    echo $ip;
    

    实际上,您应该具有加载的特定于som服务器的配置以及其中的服务器id。
    每一个系统都会表现出不同的行为,对于ip地址,主机名无疑是非常容易出错的。通常,服务器上有许多应用程序,从一天到另一天,这些应用程序可能无法继续工作,您将很难进行调试(例如,有些人想出了一个好主意,设置一个反向条目,这样邮件就不会再被垃圾发了?

    使用此选项更准确

    echo getHostByName($_SERVER[HTTP_HOST]);
    

    这是通过还是通过访问?这是在我公开访问站点时发生的,即从负载平衡器的IP访问。我首先有
    127.0.0.1
    条目,它工作正常。。。也许这与Apache配置有关?我尝试了反转这些行(记得重新启动网络服务和Apache)-但不幸的是没有运气。我不知道这些PHP函数-感谢您让我了解它们。这只是另一个糟糕的解决方案,易受相同错误的影响。。。例如,在我的系统上,这段代码正好输出127.0.1.1