Переменная PHP $ _SERVER ['SERVER_ADDR'] всегда возвращает 127.0.0.1 - PullRequest
3 голосов
/ 08 июля 2010

У нас есть несколько машин веб-сервера с балансировкой нагрузки, на которых запущено одно и то же веб-приложение PHP ( 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

Обновление ...

Упс !Я забыл рассмотреть обратный прокси nginx перед веб-серверами.Весь трафик на эти веб-серверы поступает из nginx из-за следующей строки в conf nginx:

location / {
    root                  /var/www/staging/current;
    proxy_pass            http://localhost:8880;
}

Ответы [ 6 ]

5 голосов
/ 09 июля 2010

Конечно, это так же просто, как

$ip = getHostByName(php_uname('n')); 
echo $ip;
4 голосов
/ 08 июля 2010

Вероятно, потребуется изменить способ подключения балансировщика нагрузки к серверу. Я не знаю, что это за программное обеспечение.

Возможно, вам лучше переключаться, основываясь на каком-то другом факторе, который меняется между машинами. Хорошей ставкой будет имя хоста:

$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);
}
2 голосов
/ 08 июля 2010

обратные строки в / etc / hosts

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

должны работать

0 голосов
/ 20 января 2018

Используйте это более точно!

echo getHostByName($_SERVER[HTTP_HOST]);
0 голосов
/ 28 августа 2010

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

0 голосов
/ 09 июля 2010

Чтобы исправить мою проблему, у меня есть 3 идеи:

  1. Я мог бы жестко закодировать IP-адрес каждого сервера в переменную PHP в файле конфигурации, который имеется на каждом сервере.
  2. Я мог бы использовать модуль переадресации обратного прокси-сервера для Apache ( mod_rpaf ).
  3. Я мог бы изменить proxy_pass на каждом сервере, чтобы перейти на XXX.XXX.XXX.XXX:8880 и YYY.YYY.YYY.YYY:8880 вместо localhost?
...