PHP $_SERVER[‘SERVER_ADDR’] variable renvoie toujours 127.0.0.1
-
13-09-2020 - |
Question
Nous avons plusieurs à charge équilibrée serveur web machines exécutant le même PHP webapp (LAMPE) et je voudrais exécuter du code légèrement différent sur chaque serveur (pour des fins de test).J'espérais que l'utilisation de la $_SERVER['SERVER_ADDR']
super mondial de faire quelque chose comme ceci:
if ($_SERVER['SERVER_ADDR'] == 'XXX.XXX.XXX.XXX') {
echo "Do one thing";
} elseif ($_SERVER['SERVER_ADDR'] == 'YYY.YYY.YYY.YYY') {
echo "Do something else";
}
Malheureusement, cela ne fonctionne pas parce que les deux machines sont de réglage $_SERVER['SERVER_ADDR']
à '127.0.0.1'.Comment puis-je configurer de sorte que $_SERVER['SERVER_ADDR']
est mis à leur adresse IP publique?
Je suppose que le problème peut être quelque chose à faire avec /etc/hosts
donc, pour refererence actuellement, il ressemble à ceci:
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
XXX.XX.XX.XX blahblah
Mise à jour...
Oups!J'ai négligé de considérer l' nginx reverse proxy devant les serveurs web.Tout le trafic vers ces serveurs web arrive de nginx en raison de la ligne suivante dans la conf nginx:
location / {
root /var/www/staging/current;
proxy_pass http://localhost:8880;
}
La solution
Sûrement, c'est aussi simple que
$ip = getHostByName(php_uname('n'));
echo $ip;
Autres conseils
Il faudrait probablement changer votre façon de l'équilibreur de charge se connecte au serveur.Je ne sais pas quel logiciel il s'agit.
Vous pourriez être mieux de commutation basé sur un autre facteur qui change entre les machines.Un bon pari serait le nom de l'hôte:
$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);
}
inverser les lignes dans /etc/hosts
XXX.XX.XX.XX blahblah
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
devrait fonctionner
L'utilisation de ce plus précise!
echo getHostByName($_SERVER[HTTP_HOST]);
Pour résoudre mon problème, j'ai 3 idées:
- Je pourrais coder en dur l'adresse IP de chaque serveur dans une variable PHP dans un fichier de configuration que nous avons sur chaque serveur.
- Je pourrais utiliser la reverse proxy ajouter de l'avant du module pour Apache (mod_rpaf).
- Je suis susceptible de changer la
proxy_pass
sur chaque serveur pour aller àXXX.XXX.XXX.XXX:8880
etYYY.YYY.YYY.YYY:8880
plutôt que delocalhost
?
vous devriez vraiment avoir som serveur de configuration spécifique qui est chargé et un id de serveur à l'intérieur.chaque système va se comporter différemment et les adresses ip, nom d'hôte est vraiment très erreur vulnérables.généralement, il existe de nombreuses applications sur le serveur et d'un jour à l'autre, il ne pourrait pas travailler plus longtemps et vous aurez un moment difficile de débogage (par exemple some1 geths la belle idée de mettre en place un reverse entrée de sorte mails ne pas se faire spammer plus?)