A variável $_SERVER['SERVER_ADDR'] do PHP sempre retorna 127.0.0.1
-
13-09-2020 - |
Pergunta
Temos várias máquinas de servidores web com balanceamento de carga executando o mesmo webapp PHP (LÂMPADA) e gostaria de executar um código ligeiramente diferente em cada servidor (para fins de teste).Eu esperava usar o $_SERVER['SERVER_ADDR']
super global para fazer algo assim:
if ($_SERVER['SERVER_ADDR'] == 'XXX.XXX.XXX.XXX') {
echo "Do one thing";
} elseif ($_SERVER['SERVER_ADDR'] == 'YYY.YYY.YYY.YYY') {
echo "Do something else";
}
Infelizmente, isso não funciona porque ambas as máquinas estão configurando $_SERVER['SERVER_ADDR']
para '127.0.0.1'.Como posso configurá-los para que $_SERVER['SERVER_ADDR']
está definido para seu endereço IP público?
Eu estou supondo que o problema pode ter algo a ver com /etc/hosts
então, para referência, atualmente se parece com isto:
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
XXX.XX.XX.XX blahblah
Atualizar...
Ops!Deixei de considerar o nginx proxy reverso na frente dos servidores web.Todo o tráfego para esses servidores web chega do nginx devido à seguinte linha na configuração do nginx:
location / {
root /var/www/staging/current;
proxy_pass http://localhost:8880;
}
Solução
Certamente é tão simples quanto
$ip = getHostByName(php_uname('n'));
echo $ip;
Outras dicas
Provavelmente envolveria alterar a forma como o balanceador de carga se conecta ao servidor.Não sei que software é esse.
Talvez seja melhor mudar com base em algum outro fator que muda entre as máquinas.Uma boa aposta seria o nome do host:
$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);
}
linhas invertidas em /etc/hosts
XXX.XX.XX.XX blahblah
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
Deveria trabalhar
Use isso com mais precisão!
echo getHostByName($_SERVER[HTTP_HOST]);
Para corrigir meu problema, tenho três ideias:
- Eu poderia codificar o endereço IP de cada servidor em uma variável PHP em um arquivo de configuração que temos em cada servidor.
- Eu poderia usar o proxy reverso adiciona módulo de encaminhamento para Apache (mod_rpaf).
- Eu poderia mudar o
proxy_pass
em cada servidor para irXXX.XXX.XXX.XXX:8880
eYYY.YYY.YYY.YYY:8880
em vez delocalhost
?
você realmente deve ter alguma configuração específica do servidor que seja carregada e um ID do servidor dentro.cada sistema se comportará de maneira diferente e, ao buscar endereços IP, o nome do host é definitivamente muito vulnerável a erros.normalmente existem muitos aplicativos no servidor e de um dia para outro ele pode não funcionar mais e você terá dificuldade em depurar (por exemplo, alguém teve a boa ideia de configurar uma entrada reversa para que os e-mails não recebam mais spam? )