¿Cómo hacer que Elastic Beanstalk el servidor proxy respaldado por nginx redireccione automáticamente de HTTP a HTTPS?

Tengo un sitio con motor Node.js que estoy ejecutando en Amazon Elastic Beanstalk.

Mi aplicación Node.js escucha en el puerto 8080, y estoy usando la configuración del equilibrador de carga elástico nginx con mi aplicación EB, escuchando en el puerto 80 y 443 para HTTP y HTTPS.

Sin embargo, solo quiero aceptar el tráfico en mi aplicación que ha llegado a través de HTTPS.

Podría arreglar algo en la aplicación para tratar con esto, pero estoy interesado en una forma de hacer que el equilibrador de carga redirija todas las solicitudes HTTP a mi sitio a través de HTTPS.

Después de varios comienzos falsos con ideas del soporte pagado de Amazon, al final terminaron. La forma de hacer que esto funcione es configurar su entorno para que responda tanto al puerto 80 como al 443. Luego, cree una carpeta en su carpeta principal de la aplicación Node.js llamada .ebextensions , y coloque un archivo llamado 00_nginx_https_rw.config allí, con este texto como el contenido:

 files: "/tmp/45_nginx_https_rw.sh": owner: root group: root mode: "000644" content: | #! /bin/bash CONFIGURED=`grep -c "return 301 https" /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf` if [ $CONFIGURED = 0 ] then sed -i '/listen 8080;/a \ if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }\n' /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf logger -t nginx_rw "https rewrite rules added" exit 0 else logger -t nginx_rw "https rewrite rules already set" exit 0 fi container_commands: 00_appdeploy_rewrite_hook: command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/appdeploy/enact 01_configdeploy_rewrite_hook: command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact 02_rewrite_hook_perms: command: chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh 03_rewrite_hook_ownership: command: chown root:users /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh 

El equipo de soporte de Amazon explicó: Esta configuración crea un enlace de despliegue que agregará las reglas de reescritura a /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf.

(Anteriormente me habían ofrecido .config’s que copiaba archivos separados en /etc/nginx/conf.d, pero esos no tenían ningún efecto, o peor, parecían sobrescribir o tener prioridad sobre la configuración predeterminada de nginx, por algún motivo).

Si alguna vez desea deshacer esto, es decir, para eliminar los ganchos, necesita eliminar esta extensión de ebextension y emitir un comando para eliminar los archivos que crea. Puede hacerlo manualmente o mediante comandos ebextensions que instaló temporalmente:

 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh 

No he intentado esto, pero presumiblemente algo así funcionaría para eliminarlos y deshacer este cambio:

 container_commands: 00_undochange: command: rm /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh 01_undochange: command: rm /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh 

Espero que esto pueda ayudar a alguien más en el futuro.

La respuesta aceptada ya no funcionó para mí. El puerto predeterminado era diferente. También la ubicación del archivo de configuración ha cambiado. Estoy configurando una aplicación Ruby On Rails con Puma.

Hablé con el soporte pago, lo descubrimos simplemente ejecutando los comandos manualmente en la instancia en ejecución. Entonces pude descifrar la siguiente solución. Simplemente iniciando sesión y reiniciando nginx las cosas funcionaron.

 files: "/tmp/45_nginx_https_rw.sh": owner: root group: root mode: "000644" content: | #! /bin/bash CONFIGURED=`grep -c "return 301 https" /opt/elasticbeanstalk/support/conf/webapp_healthd.conf` if [ $CONFIGURED = 0 ] then sed -i '/listen 80;/a \ if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }\n' /opt/elasticbeanstalk/support/conf/webapp_healthd.conf logger -t nginx_rw "https rewrite rules added" exit 0 else logger -t nginx_rw "https rewrite rules already set" exit 0 fi container_commands: 00_appdeploy_rewrite_hook: command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/appdeploy/enact 01_configdeploy_rewrite_hook: command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact 02_rewrite_hook_perms: command: chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh 03_rewrite_hook_ownership: command: chown root:users /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh 

Observe cómo cambié el número de puerto y la ubicación del archivo de configuración.

Puede manejar la redirección a través de su aplicación Node.js.

Amazon envía el encabezado X-Forwarded-Proto que es igual a http cuando el cliente se ha conectado de forma insegura.

El siguiente middleware debe insertarse justo después de inicializar Express y antes de definir sus rutas para redirigir automáticamente al cliente al punto final HTTPS correspondiente:

 // Redirect to HTTPS app.use(function (req, res, next) { // Insecure request? if (req.get('x-forwarded-proto') == 'http') { // Redirect to https:// return res.redirect('https://' + req.get('host') + req.url); } next(); }); 

Pude hacer que funcionara con una solución ligeramente más simple.

Tenga en cuenta que se trata de una instancia SINGLE desplegada de judías elásticas, no cargadas balenced.

Esta fue mi ebextension, agregué.

 files: "/etc/nginx/conf.d/000_my_config.conf": mode: "000755" owner: root owner: root content: | server { listen 8080; return 301 https://$host$request_uri; } 

Estoy ejecutando el entorno ‘Ruby2 Puma’ en AWS Elastic Beanstalk que puede tener una configuración ligeramente diferente a la anterior. En mi entorno, necesitaba usar ‘escuchar 80’ en lugar de ‘escuchar 8080’.

sslredirect.config según la respuesta de elloworld111 :

 files: "/etc/nginx/conf.d/000_my_config.conf": mode: "000755" owner: root owner: root content: | server { listen 80; return 301 https://$host$request_uri; } 

Estoy trabajando con Elastic Beanstalk y Docker, así que he tomado una ruta ligeramente diferente para que todo funcione, pero muy inspirado por la respuesta aceptada. Este script inyecta la configuración requerida en /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf. (Si alguien tiene una solución más elegante me encantaría verla)

Esta secuencia de comandos también permite que Beanstalk Healthcheck llegue al punto final de mi chequeo de salud (en mi caso, api / healthcheck). Es mejor permitir que LoadBalancer acceda a la aplicación, en lugar de finalizar en Nginx.

 files: "/tmp/45_nginx_https_rw.sh": owner: root group: root mode: "000755" content: | #! /bin/bash CONFIGURED=`grep -c "return 301 https" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf` if [ $CONFIGURED = 0 ] then sed -i "/access.log;/a \ \ \ \ \ \ \ \ location /api/health-check { proxy_pass http://docker; }" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf sed -i "/proxy_add_x_forwarded_for;/a \ \ \ \ \ \ \ \ \ \ \ \ if (\$http_x_forwarded_proto != 'https') { return 301 https://\$host\$request_uri; }" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf logger -t nginx_rw "https rewrite rules added" exit 0 else logger -t nginx_rw "https rewrite rules already set" exit 0 fi container_commands: 00_run_script: command: /tmp/45_nginx_https_rw.sh 

Pude hacer que esto funcionara de una manera diferente. Cambié mi balanceador de carga para reenviar el tráfico del puerto 80 al puerto 8082, y cambié las reglas del firewall (entrantes en la instancia, salientes en el firewall) para permitir eso. Y luego agregué este archivo en .ebextensions:

 files: "/etc/nginx/conf.d/50-atd-hotel-http-redirect.conf": mode: "000644" owner: root group: root content: | server { listen 8082; return 301 --WHATEVER DESTINATION YOU WANT--; }