2 votos

Nginx proxy_set_header x-forwarded-proto aparentemente no está funcionando

Dado que soy un principiante en la proxy de nginx, tengo una pregunta.

La idea principal es:
¿Dónde establece nginx los valores predeterminados para $_SERVER["HTTP_X_FORWARDED_HOST"],
$_SERVER["HTTP_X_FORWARDED_SERVER"] y
$_SERVER["HTTP_X_FORWARDED_FOR"]?

Más información:
Este es un entorno de desarrollo.
Tengo una entrada de vhost en mi proxy de nginx:

server {
    listen 192.168.1.17:443 ssl;
    server_name foo.bar.com;

    ssl_certificate /etc/nginx/ssl/boerse.de.crt;
    ssl_certificate_key /etc/nginx/ssl/boerse.de.key;

    location / {
        proxy_pass http://foo_cluster/;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

foo_cluster solo reenvía a un servidor:

upstream foo_cluster {
    ip_hash;
    server 192.168.5.33:80 fail_timeout=30s;
    server 192.168.5.34:80 fail_timeout=30s down;
}

En mi servidor web de Apache en 192.168.5.33 tengo otro vhost:

    ServerName foo.bar.com
    ServerAdmin webmaster@bar.com
    DocumentRoot /var/www/foo-bar-com

            Options Indexes FollowSymLinks MultiViews
            AllowOverride ALL
            Order allow,deny
            allow from all

    LogLevel warn
    ErrorLog /var/log/apache2/foo.bar.com_error.log
    CustomLog /var/log/apache2/foo.bar.com_access.log combined

    ServerSignature On
    SetEnv ApplicationConfigFiles "/var/ApplicationConfigFiles/"

    php_value include_path ".:/var/www/baz/global/php/base:/var/www/foo-bar-com/vendor/library/:/var/www/foo-bar-com/vendor/models/model/:"
    php_value auto_prepend_file /var/www/foo-bar-com/class/functions/prepend.php
    php_value auto_append_file /var/www/foo-bar-com/class/functions/append.php

En mi archivo de hosts en mi máquina local he agregado el servidor:

...
192.168.1.17 foo.bar.com
...

En mi prepend.php solo muestro el superglobal $_SERVER y luego lo detengo:

`

Bien. Ahora, con todo eso configurado, abro el sitio web en mi navegador en https://foo.bar.com

Aquí tienes un extracto del código fuente de salida:

array(32) {
    ...
    ["HTTP_HOST"]=>
    string(11) "foo.bar.com"
    ["HTTP_X_FORWARDED_HOST"]=>
    string(11) "foo.bar.com"
    ["HTTP_X_FORWARDED_SERVER"]=>
    string(11) "foo.bar.com"
    ["HTTP_X_FORWARDED_FOR"]=>
    string(13) "192.168.2.131"
    ["HTTP_CONNECTION"]=>
    string(5) "close"
    ...

Como me falta X-Forwarded-Proto esperado, comento todas las proxy_set_header en el archivo vhost de nginx (y vuelvo a cargar el servicio):

server {
    listen 192.168.1.17:443 ssl;
    server_name foo.bar.com;

    ssl_certificate /etc/nginx/ssl/boerse.de.crt;
    ssl_certificate_key /etc/nginx/ssl/boerse.de.key;

    location / {
        proxy_pass http://foo_cluster/;

        #proxy_set_header Host $host;
        #proxy_set_header X-Forwarded-Host $host;
        #proxy_set_header X-Forwarded-Server $host;
        #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Aún así, la salida del resultado sigue siendo la misma.

He buscado en Google por qué esto podría ser el caso todo el día.
La documentación de nginx para proxy_set_header dice:

Esta directiva permite redefinir y agregar algunas líneas de encabezado de solicitud que se transferirán al servidor proxy.

Me pregunto por qué dice exactamente "redefinir". No he encontrado respuesta alguna sobre qué está predefinido aquí para ser redefinido a través de proxy_set_header.

He buscado proxy_set_header en /etc/nginx/nginx.conf, de hecho, recorrí todo el directorio /etc/nginx con

grep -ri x-forwarded-host *

Solo se encontraron resultados en sites-available y sites-enabled.

Busqué lo mismo en el servidor web de Apache sin resultados útiles (pensé que podrían estar configurados en código php pero estaba equivocado).

Dudo si mi archivo vhost de nginx es incluso el que se está utilizando.

Gracias por tu tiempo.

Tldr:
¿Dónde establece un proxy de nginx los valores predeterminados para $_SERVER["HTTP_X_FORWARDED_HOST"],
$_SERVER["HTTP_X_FORWARDED_SERVER"] y
$_SERVER["HTTP_X_FORWARDED_FOR"]?

`

0voto

Beatlevic Puntos 225

Resulta que mi método preferido para recargar la configuración de nginx está roto:

/etc/init.d/nginx reload

Simplemente no recargó la configuración.

Sin embargo, después de reiniciar el proxy, funcionó como se esperaba.

También recargar a través del binario directamente también funciona:

nginx -s reload

No entiendo por qué sería así, así que voy a hacer otra pregunta al respecto.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X