Pregunta

Tenemos varias máquinas de servidor web con equilibrio de carga que ejecutan la misma aplicación web PHP (LÁMPARA) y me gustaría ejecutar un código ligeramente diferente en cada servidor (para fines de prueba).Esperaba usar el $_SERVER['SERVER_ADDR'] súper global para hacer algo como esto:

if ($_SERVER['SERVER_ADDR'] == 'XXX.XXX.XXX.XXX') {
  echo "Do one thing";
} elseif ($_SERVER['SERVER_ADDR'] == 'YYY.YYY.YYY.YYY') {
  echo "Do something else";
}

Desafortunadamente, esto no funciona porque ambas máquinas están configurando $_SERVER['SERVER_ADDR'] a '127.0.0.1'.¿Cómo puedo configurarlos para que $_SERVER['SERVER_ADDR'] está configurado en su dirección IP pública?

Supongo que el problema puede tener algo que ver con /etc/hosts entonces, como referencia, actualmente se ve así:

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

Actualizar...

Ups!Me olvidé de considerar el nginx Proxy inverso frente a los servidores web.Todo el tráfico a esos servidores web llega desde nginx debido a la siguiente línea en la configuración de nginx:

location / {
    root                  /var/www/staging/current;
    proxy_pass            http://localhost:8880;
}
¿Fue útil?

Solución

Seguro que es tan sencillo como

$ip = getHostByName(php_uname('n')); 
echo $ip;

Otros consejos

Probablemente implicaría cambiar la forma en que el equilibrador de carga se conecta al servidor.No sé qué software es este.

Quizás sea mejor cambiar según algún otro factor que cambie entre las máquinas.Una buena apuesta sería el nombre de 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);
}

filas inversas en /etc/hosts

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

Deberia trabajar

¡Usa esto más preciso!

echo getHostByName($_SERVER[HTTP_HOST]);

Para solucionar mi problema, tengo 3 ideas:

  1. Podría codificar la dirección IP de cada servidor en una variable PHP en un archivo de configuración que tenemos en cada servidor.
  2. Podría usar el proxy inverso agregar módulo de reenvío para Apache (mod_rpaf).
  3. podría cambiar el proxy_pass en cada servidor al que ir XXX.XXX.XXX.XXX:8880 y YYY.YYY.YYY.YYY:8880 en vez de localhost?

Realmente deberías tener alguna configuración específica del servidor que se cargue y una identificación del servidor dentro.Cada sistema se comportará de manera diferente y, al elegir direcciones IP, el nombre de host definitivamente es muy vulnerable a errores.Por lo general, hay muchas aplicaciones en el servidor y, de un día para otro, es posible que ya no funcione y le resulte difícil depurar (por ejemplo, ¿alguien tiene la buena idea de configurar una entrada inversa para que los correos no reciban más spam? )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top