【问题标题】: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 访问。

标签: php linux lamp superglobals server-farm


【解决方案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 个想法:

      1. 我可能会将每台服务器的 IP 地址硬编码到我们在每台服务器上的配置文件中的 PHP 变量中。
      2. 我可能会为 Apache 使用 反向代理添加转发模块 (mod_rpaf)。
      3. 我可能会将每台服务器上的proxy_pass 更改为XXX.XXX.XXX.XXX:8880YYY.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) - 但不幸的是没有运气。
          猜你喜欢
          • 2011-10-24
          • 2015-07-30
          • 2015-08-25
          • 2013-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多