¿Cómo resolver errores 502 Bad Gateway con Elastic Load Balancer y EC2 / Nginx para solicitudes HTTPS?

15

Me encuentro con problemas de '502 Bad Gateway' para solicitudes HTTPS cuando uso AWS Elastic Load Balancer (tipo de aplicación) frente a instancias EC2 que ejecutan Nginx. Nginx actúa como un proxy inverso en cada instancia para un servidor de camarera que ofrece una aplicación Python (marco Pyramid). Estoy tratando de usar la terminación TLS en el ELB para que las instancias EC2 solo se ocupen de HTTP. Aquí está la configuración aproximada:

Solicitud HTTPS del cliente> ELB (escuchando en 443, reenviando a 80 en backend)> Nginx escuchando en el puerto 80 (en instancia Ec2)> reenviado a waitress / Pyramid (en la misma instancia ec2)

Cuando hago solicitudes en HTTPS, obtengo el error 502. Sin embargo, cuando hago solicitudes HTTP regulares, obtengo una respuesta como se esperaba (la misma configuración que la anterior, excepto que ELB está escuchando en el puerto 80).

Alguna información adicional: las comprobaciones de estado de ELB están funcionando. Todos los grupos de VPC / seguridad están configurados correctamente (creo). Estoy usando un certificado de AWS en ELB usando la configuración / tutorial estándar en AWS. Hice SSH en la instancia de Ec2 y en el registro de acceso de Nginx parece que la solicitud HTTPS todavía está encriptada. ¿O algún problema de codificación?

Se parece a esto

Y aquí está nginx.conf en la instancia EC2:

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    access_log /etc/nginx/access.log;  
    sendfile        on;

    # Configuration containing list of application servers
    upstream app_servers {

        server 127.0.0.1:6543;
    }   

    server {
        listen       80;
        server_name  [MY-EC2-SERVER-NAME];


        # Proxy connections to the application servers
        # app_servers
        location / {

            proxy_pass         http://app_servers;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;

        }
    }
}
30

Ok, lo descubrí (soy un tonto). Tenía dos oyentes configurados en ELB, uno para 80 y otro para 443, lo cual era correcto. El oyente de 80 se configuró correctamente para reenviar al puerto 80 de backend (Nginx) a través de HTTP como se esperaba. El oyente 443 se configuró INCORRECTAMENTE para enviar al puerto 80 en el backend a través de HTTPS. Actualicé el oyente 443 para usar la misma regla que el oyente 80 (es decir, escuche en 443 pero envíe al backend 80 a través de HTTP) y funcionó. No les haga caso a todos.

2
  • 6
    ¡Gracias! Esto es muy confuso: necesitamos configurar el grupo objetivo para que escuche 443 usando HTTP . Tudmotu 16 de mayo de 2018 a las 21:50
  • Doh! Terminación SSL en el balanceador de carga. Me tomó mucho más tiempo del que debería resolver esto ¡Gracias! ficuscr 18 de agosto a las 2:09