PHP $ _SERVER ['SERVER_ADDR']变量始终返回127.0.0.1

时间:2010-07-08 11:02:00

标签: php linux lamp superglobals server-farm

我们有多个负载均衡的Web服务器运行相同的PHP webapp(LAMP),我想在每个服务器上运行稍微不同的代码(用于测试目的)。我希望使用$_SERVER['SERVER_ADDR']超级全局来做这样的事情:

if ($_SERVER['SERVER_ADDR'] == 'XXX.XXX.XXX.XXX') {
  echo "Do one thing";
} elseif ($_SERVER['SERVER_ADDR'] == 'YYY.YYY.YYY.YYY') {
  echo "Do something else";
}

不幸的是,这不起作用,因为两台计算机都将$_SERVER['SERVER_ADDR']设置为“ 127.0.0.1 ”。如何配置它们以便$_SERVER['SERVER_ADDR']设置为其公共IP地址?

我猜这个问题可能与/etc/hosts有关,所以对于参考,它目前看起来像这样:

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

更新...

糟糕!我忽略了在Web服务器前面考虑nginx反向代理。由于nginx conf中的以下行,这些Web服务器的所有流量都来自nginx:

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

6 个答案:

答案 0 :(得分:5)

当然,它就像

一样简单
$ip = getHostByName(php_uname('n')); 
echo $ip;

答案 1 :(得分:4)

这可能涉及更改负载均衡器连接到服务器的方式。我不知道这是什么软件。

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

$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);
}

答案 2 :(得分:2)

在/ etc / hosts中反转行

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

应该有效

答案 3 :(得分:0)

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

  1. 我可能会将每个服务器的IP地址硬编码到每个服务器上的配置文件中的PHP变量中。
  2. 我可能会使用Apache的反向代理添加转发模块mod_rpaf)。
  3. 我可能会更改每台服务器上的proxy_pass以转到XXX.XXX.XXX.XXX:8880YYY.YYY.YYY.YYY:8880而不是localhost

答案 4 :(得分:0)

你应该真的有som服务器特定的配置加载和内部服务器ID。 每个系统的行为都会有所不同并且需要ip地址,主机名肯定非常容易出错。通常在服务器上有很多应用程序,从一天到另一天,它可能不再工作,你将很难调试(例如some1 geths设置反向条目的好主意,所以邮件不再被垃圾邮件? )

答案 5 :(得分:0)

使用此更准确!

echo getHostByName($_SERVER[HTTP_HOST]);