PHP $_SERVER['SERVER_ADDR'] 变量总是返回 127.0.0.1
Posted
技术标签:
【中文标题】PHP $_SERVER[\'SERVER_ADDR\'] 变量总是返回 127.0.0.1【英文标题】:PHP $_SERVER[‘SERVER_ADDR’] variable always returns 127.0.0.1PHP $_SERVER['SERVER_ADDR'] 变量总是返回 127.0.0.1 【发布时间】:2011-03-13 06:50:55 【问题描述】:我们有多个负载平衡的网络服务器机器运行相同的 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;
【问题讨论】:
是通过localhost访问还是通过blahbl.ah访问? 当我公开访问该站点时会发生这种情况,即从负载均衡器的 IP 访问。 【参考方案1】:使用这个更准确!
echo getHostByName($_SERVER[HTTP_HOST]);
【讨论】:
【参考方案2】:您确实应该拥有加载的特定于服务器的配置和内部的服务器 ID。 每个系统的行为都会有所不同,并且会使用 ip 地址,主机名肯定很容易出错。通常服务器上有很多应用程序,从一天到另一天,它可能不再工作,您将很难调试(例如,some1 geths 设置反向条目的好主意,这样邮件就不会再收到垃圾邮件了? )
【讨论】:
【参考方案3】:当然就这么简单
$ip = getHostByName(php_uname('n'));
echo $ip;
【讨论】:
我不知道这些 PHP 函数 - 感谢您让我知道它们。 只是另一个容易受到相同错误影响的糟糕解决方案......例如在我的系统上,这正是代码输出 127.0.1.1【参考方案4】:为了解决我的问题,我有 3 个想法:
-
我可能会将每台服务器的 IP 地址硬编码到我们在每台服务器上的配置文件中的 PHP 变量中。
我可能会为 Apache 使用 反向代理添加转发模块 (mod_rpaf)。
我可能会将每台服务器上的
proxy_pass
更改为XXX.XXX.XXX.XXX:8880
和YYY.YYY.YYY.YYY:8880
而不是localhost
?
【讨论】:
【参考方案5】:这可能涉及更改负载平衡器连接到服务器的方式。我不知道这是什么软件。
根据机器之间变化的其他因素进行切换可能会更好。一个不错的选择是主机名:
$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);
【讨论】:
【参考方案6】:/etc/hosts 中的反向行
XXX.XX.XX.XX blahblah
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
应该有效
【讨论】:
我首先有127.0.0.1
条目,它工作正常...也许这与Apache 配置有关?
我尝试反转这些行(记得重新启动网络服务和 Apache) - 但不幸的是没有运气。以上是关于PHP $_SERVER['SERVER_ADDR'] 变量总是返回 127.0.0.1的主要内容,如果未能解决你的问题,请参考以下文章