es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué este archivo de configuración de NGINX es inválido?

Tengo este archivo de configuración de NGINX:

events { }
http {
    server {
        listen 443 ssl;
        ssl_certificate /home/dietpi/certs/cert.pem;
        ssl_certificate_key /home/dietpi/certs/privkey.pem.key;
        location / {
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass         http://localhost:3001/;
            proxy_http_version 1.1;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection "upgrade";
        }
    }
}

Es un proxy inverso para un contenedor Docker. Realiza SSL por mí. Quería redirigir HTTP a HTTPS, así que intenté agregar esto:

events { }
http {
    server {
        listen 80 default_server;
        server _;
        return 301 https://$host$request_uri;
    }
    server {
        listen 443 ssl;
        ssl_certificate /home/dietpi/certs/cert.pem;
        ssl_certificate_key /home/dietpi/certs/privkey.pem.key;
        location / {
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass         http://localhost:3001/;
            proxy_http_version 1.1;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection "upgrade";
        }
    }
}

Pero ahora no funciona (sudo nginx -t falla).
Dice esto:

nginx: [emerg] la directiva "server" no está permitida aquí en /etc/nginx/nginx.conf:5
nginx: archivo de configuración /etc/nginx/nginx.conf prueba fallida

La mayoría de las personas que tienen este error suelen tener el bloque server no dentro de un bloque http, y colocarlo dentro de uno soluciona el problema. Pero… mi bloque server ya está dentro de un bloque http. Entonces, ¿cómo lo soluciono?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema está en el bloque del servidor que contiene la directiva return. La directiva return no debería estar dentro de un bloque server. Para solucionar este problema, mueve la directiva return dentro del bloque http, pero fuera de cualquier bloque server. El archivo de configuración actualizado debería verse así:

    events { }
    http {
        server {
            listen 443 ssl;
            ssl_certificate /home/dietpi/certs/cert.pem;
            ssl_certificate_key /home/dietpi/certs/privkey.pem.key;
            location / {
                proxy_set_header   X-Real-IP $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass         http://localhost:3001/;
                proxy_http_version 1.1;
                proxy_set_header   Upgrade $http_upgrade;
                proxy_set_header   Connection "upgrade";
            }
        }
        server {
            listen 80 default_server;
            server_name _;
            return 301 https://$host$request_uri;
        }
    }
    

    Ahora el archivo de configuración debería pasar el comando sudo nginx -t y deberías poder utilizar NGINX como un proxy inverso con SSL y redireccionamiento de HTTP a HTTPS.

Comments are closed.