Tengo un servidor nginx que se ejecuta en el puerto 8080 que se encuentra detrás de un Balanceador de carga de aplicaciones de AWS. Tengo el siguiente bloque de ubicación en nginx.conf ,
location / { limit_except GET { deny all; } root /root/of/project/; index index.html; try_files $uri $uri/ /index.html; }Cuando ejecuto el servidor localmente, puedo presionar /alguna/ruta/ y /alguna/ruta y obtener la misma respuesta, es decir, la barra inclinada final no afecta nada. Esperaría el mismo comportamiento cuando implemente la aplicación.
Configuré AWS ALB con un agente de escucha HTTP en el puerto 80 que redirige todo el tráfico al agente de escucha HTTPS en el puerto 443. El agente de escucha HTTPS simplemente reenvía al grupo de destino donde se encuentra el servidor nginx. Esas son las únicas dos reglas de equilibrador de carga que tengo, nada más.
Después de implementar la aplicación, cuando accedo a una URL con una barra inclinada al final (por ejemplo, https://example.com/about/ ), todo está bien. Se carga como se esperaba. Sin redirecciones ni nada. Puedo ver la solicitud en los registros de nginx.
Sin embargo, si accedo a una URL sin una barra inclinada, por ejemplo
El ALB redirige a
http://ejemplo.com:8080/acerca de/
y luego nunca carga. Nunca veo ningún registro en el servidor nginx para esa solicitud, lo que significa que nunca pasó del ALB al grupo de destino. La solicitud expira después de unos minutos.
Parece que ALB podría estar intentando reenviar la solicitud al grupo de destino, ya que 8080 es el puerto en el que se ejecuta el servidor nginx, pero no estoy seguro de por qué la solicitud nunca llega. No parece que la barra diagonal final deba afectar si la solicitud se reenvía o no, pero no estoy seguro.
Pensé que tal vez podría configurar una regla que redirija una ruta sin una barra inclinada final a la misma ruta con una barra inclinada final en el nivel ALB, pero las reglas del balanceador de carga solo tienen comodines, no expresiones regulares. Entonces, eso es un callejón sin salida. Sin embargo, no estoy seguro de que eso solucione el problema, ya que el problema parece estar en el nivel ALB, no en el nivel de la aplicación.
¿Alguien tiene alguna idea de lo que está pasando?
Tuve este problema ayer, solo tengo un oyente ALB en 443 y nginx está abierto en 80, creo que lo arreglé con "absolute_redirect off;" en la configuración de nginx. Mi archivo conf completo:
server { listen 80; absolute_redirect off; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ $uri/index.html =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }Una mejor configuración sería simplemente hacer la terminación SSL en su ALB y luego crear un agente de escucha HTTP con una regla de reenvío que tenga su grupo objetivo como destino. Esto tiene múltiples beneficios en términos de gestión simplificada de los certificados, rendimiento, etc.
Lea aquí sobre la configuración de escucha HTTP
Mejor, Stefan