Переменная PHP $_SERVER[’SERVER_ADDR’] всегда возвращает 127.0.0.1

StackOverflow https://stackoverflow.com/questions/3202872

Вопрос

У нас есть несколько веб-серверов с балансировкой нагрузки, на которых работает одно и то же веб-приложение PHP (ЛАМПА), и мне бы хотелось запускать на каждом сервере немного разный код (в целях тестирования).Я надеялся использовать $_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 обратный прокси-сервер перед веб-серверами.Весь трафик на эти веб-серверы поступает от nginx благодаря следующей строке в конфигурации 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:8880 и YYY.YYY.YYY.YYY:8880 скорее, чем localhost?

у вас действительно должна быть загружаемая конфигурация конкретного сервера и идентификатор сервера внутри.каждая система будет вести себя по-разному, и при использовании IP-адресов имя хоста определенно очень уязвимо к ошибкам.обычно на сервере много приложений, и изо дня в день они могут перестать работать, и вам будет трудно отладить (например, кому-то пришла в голову хорошая идея настроить обратную запись, чтобы письма больше не рассылались спамом? )

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top