Переменная PHP $_SERVER[’SERVER_ADDR’] всегда возвращает 127.0.0.1
-
13-09-2020 - |
Вопрос
У нас есть несколько веб-серверов с балансировкой нагрузки, на которых работает одно и то же веб-приложение 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 идеи:
- Я мог бы жестко запрограммировать IP-адрес каждого сервера в переменной PHP в файле конфигурации, который есть на каждом сервере.
- Я мог бы использовать обратный прокси-сервер добавить модуль пересылки для Apache (mod_rpaf).
- Я мог бы изменить
proxy_pass
на каждом сервере, чтобы перейти кXXX.XXX.XXX.XXX:8880
иYYY.YYY.YYY.YYY:8880
скорее, чемlocalhost
?
у вас действительно должна быть загружаемая конфигурация конкретного сервера и идентификатор сервера внутри.каждая система будет вести себя по-разному, и при использовании IP-адресов имя хоста определенно очень уязвимо к ошибкам.обычно на сервере много приложений, и изо дня в день они могут перестать работать, и вам будет трудно отладить (например, кому-то пришла в голову хорошая идея настроить обратную запись, чтобы письма больше не рассылались спамом? )