Die PHP-Variable $_SERVER[‘SERVER_ADDR’] gibt immer 127.0.0.1 zurück
-
13-09-2020 - |
Frage
Wir haben mehrere Webserver mit Lastausgleich, auf denen dieselbe PHP-Webanwendung ausgeführt wird (LAMPE) und ich möchte auf jedem Server leicht unterschiedlichen Code ausführen (zu Testzwecken).Ich hatte gehofft, das zu nutzen $_SERVER['SERVER_ADDR']
super global, um so etwas zu tun:
if ($_SERVER['SERVER_ADDR'] == 'XXX.XXX.XXX.XXX') {
echo "Do one thing";
} elseif ($_SERVER['SERVER_ADDR'] == 'YYY.YYY.YYY.YYY') {
echo "Do something else";
}
Dies funktioniert leider nicht, da beide Maschinen eingestellt sind $_SERVER['SERVER_ADDR']
Zu '127.0.0.1'.Wie kann ich sie so konfigurieren? $_SERVER['SERVER_ADDR']
ist auf ihre öffentliche IP-Adresse eingestellt?
Ich vermute, das Problem könnte etwas damit zu tun haben /etc/hosts
Zur Veranschaulichung sieht es derzeit also so aus:
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
XXX.XX.XX.XX blahblah
Aktualisieren...
Hoppla!Ich habe es versäumt, darüber nachzudenken Nginx Reverse-Proxy vor den Webservern.Der gesamte Datenverkehr zu diesen Webservern kommt von Nginx aufgrund der folgenden Zeile in der Nginx-Konfiguration:
location / {
root /var/www/staging/current;
proxy_pass http://localhost:8880;
}
Lösung
Sicherlich ist es so einfach wie
$ip = getHostByName(php_uname('n'));
echo $ip;
Andere Tipps
Dazu müsste wahrscheinlich geändert werden, wie der Load-Balancer eine Verbindung zum Server herstellt.Ich weiß nicht, um welche Software es sich handelt.
Möglicherweise ist der Wechsel aufgrund eines anderen Faktors, der sich zwischen den Maschinen ändert, besser dran.Eine gute Wahl wäre der Hostname:
$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);
}
Zeilen in /etc/hosts umkehren
XXX.XX.XX.XX blahblah
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
sollte arbeiten
Verwenden Sie dies genauer!
echo getHostByName($_SERVER[HTTP_HOST]);
Um mein Problem zu beheben, habe ich drei Ideen:
- Ich könnte die IP-Adresse jedes Servers fest in eine PHP-Variable in einer Konfigurationsdatei codieren, die wir auf jedem Server haben.
- Ich könnte das verwenden Reverse-Proxy fügt Forward-Modul für Apache hinzu (mod_rpaf).
- Ich könnte das ändern
proxy_pass
auf jedem Server, zu dem man gehen sollXXX.XXX.XXX.XXX:8880
UndYYY.YYY.YYY.YYY:8880
stattlocalhost
?
Sie sollten wirklich eine serverspezifische Konfiguration haben, die geladen wird, und eine Server-ID enthalten.Jedes System verhält sich anders und die Suche nach IP-Adressen und Hostnamen ist definitiv sehr fehleranfällig.Normalerweise befinden sich viele Anwendungen auf dem Server und von einem Tag auf den anderen kann es sein, dass es nicht mehr funktioniert und Sie Probleme beim Debuggen haben (z. B. hat jemand die nette Idee, einen Rückwärtseintrag einzurichten, damit E-Mails nicht mehr als Spam landen?) )