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

vkc1a9a2  于 2023-01-01  发布在  PHP
关注(0)|答案(7)|浏览(289)

我们有多台负载平衡的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;
}
i1icjdpr

i1icjdpr1#

当然这很简单

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

mqxuamgl2#

这可能涉及到改变负载均衡器连接到服务器的方式。我不知道这是什么软件。
最好根据机器之间的其他变化因素进行切换,最好是主机名:

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

falq053o3#

反转/etc/hosts中的行

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

应该可以

lx0bsm1f

lx0bsm1f4#

用这个更准确!

echo getHostByName($_SERVER[HTTP_HOST]);
ctehm74n

ctehm74n5#

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

5cnsuln7

5cnsuln76#

你真的应该有som服务器特定的配置,得到加载和一个服务器id内。每个系统将表现不同,并去为ip地址,主机名是definantly非常错误易受攻击.通常有许多应用程序在服务器和从一天到另一个它可能不再工作,你将有一个困难的时间调试(例如,有人得到了一个好主意,设置一个反向条目,使邮件不会得到垃圾邮件了?)

iszxjhcz

iszxjhcz7#

在Apache 2.4和更高版本$_SERVER ['SERVER_ADDR']中,如果您从本地主机调用服务器,它将返回类似于::1的内容,而不是127.0.0.1
要解决这个问题,请转到Apache conf文件并更改

Listen 80

Listen 0.0.0.0:80

最后,请确保您的服务器不在反向代理的后面

相关问题