我们有多个负载平衡的 Web 服务器机器运行相同的 PHP Web 应用程序()并且我想在每个服务器上运行稍微不同的代码(用于测试目的)。我本来希望使用 $_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

更新...

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

location / {
    root                  /var/www/staging/current;
    proxy_pass            http://localhost:8880;
}
有帮助吗?

解决方案

当然很简单

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

其他提示

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

您可能最好根据机器之间变化的其他一些因素进行切换。一个不错的选择是主机名:

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

反转 /etc/hosts 中的行

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

应该管用

用这个更准确!

echo getHostByName($_SERVER[HTTP_HOST]);

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

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

你真的应该有一些服务器特定的配置被加载,里面有一个服务器ID。每个系统的行为都会有所不同,并且对于 IP 地址、主机名来说肯定非常容易出错。通常服务器上有很多应用程序,从一天到另一天,它可能不再工作,并且您将很难进行调试(例如,some1 geths 设置反向条目是个好主意,这样邮件就不会再收到垃圾邮件了吗? )

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top