Comment faire pour redirect automatiquement le serveur proxy Elastic Beanstalk avec nginx de HTTP vers HTTPS?

J’ai un site propulsé par Node.js que j’utilise sur Amazon Elastic Beanstalk.

Mon application Node.js écoute sur le port 8080 et j’utilise la configuration de l’équilibreur de charge élastique nginx avec mon application EB, en écoutant sur les ports 80 et 443 pour HTTP et HTTPS.

Cependant, je souhaite uniquement accepter le trafic de mon application via HTTPS.

Je pourrais construire quelque chose dans l’application pour gérer cela, mais je suis intéressé par un moyen d’obtenir que l’équilibreur de charge redirige toutes les requêtes HTTP vers mon site via HTTPS.

Après plusieurs faux départs avec des idées d’Amazon, ils ont fini par arriver. La façon dont cela fonctionne est que vous configurez votre environnement pour répondre à la fois aux ports 80 et 443. Créez ensuite un dossier dans votre dossier d’application principal Node.js appelé .ebextensions , et vous placez un fichier nommé 00_nginx_https_rw.config , avec ce texte comme contenu:

 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 

L’équipe d’assistance d’Amazon a expliqué: Cette configuration crée un crochet de déploiement qui appenda les règles de réécriture à /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf.

(Auparavant, ils m’avaient offert des fichiers .config qui copiaient des fichiers séparés dans /etc/nginx/conf.d, mais ceux-ci n’avaient aucun effet, ou pire, semblaient remplacer ou prendre le pas sur la configuration par défaut de nginx, pour une raison quelconque.)

Si jamais vous voulez annuler cela, c’est-à-dire supprimer les hooks, vous devez supprimer cette ebextension et émettre une commande pour supprimer les fichiers qu’elle crée. Vous pouvez le faire manuellement ou via les commandes d’ebextensions que vous avez mises en place temporairement:

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

Je n’ai pas essayé cela, mais probablement quelque chose comme ça fonctionnerait pour les supprimer et annuler cette modification:

 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 

J’espère que cela peut aider quelqu’un d’autre à l’avenir.

La réponse acceptée ne fonctionnait plus pour moi. Le port par défaut était différent. L’emplacement du fichier de configuration a également changé. Je suis en train de créer une application Ruby On Rails avec Puma.

J’ai parlé à l’assistance payante, nous l’avons compris en exécutant les commandes manuellement sur l’instance en cours d’exécution. Ensuite, j’ai pu trouver la solution ci-dessous. Juste en vous connectant et en redémarrant les choses nginx alors travaillé.

 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 

Notez comment j’ai changé le numéro de port et l’emplacement du fichier de configuration.

Vous pouvez gérer la redirection via votre application Node.js.

Amazon envoie l’en X-Forwarded-Proto tête X-Forwarded-Proto qui correspond à http lorsque le client s’est connecté de manière non sécurisée.

Le middleware suivant doit être inséré juste après l’initialisation d’ Express et avant de définir vos itinéraires pour redirect automatiquement le client vers le sharepoint terminaison HTTPS correspondant:

 // 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(); }); 

J’ai pu faire fonctionner cette solution avec une solution légèrement plus simple.

S’il vous plaît noter que ceci est une instance SINGLE déployée élastique beanstalk, pas de charge équilibrée.

C’était mon extension que j’ai ajoutée.

 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; } 

Je dirige l’environnement «Ruby2 Puma» sur AWS Elastic Beanstalk, qui peut avoir une configuration légèrement différente de celle décrite ci-dessus. Dans mon environnement, je devais utiliser ‘listen 80’ au lieu de ‘listen 8080’.

sslredirect.config basé sur la réponse 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; } 

Je travaille avec Elastic Beanstalk et Docker, j’ai donc pris un chemin légèrement différent pour que les choses fonctionnent pour moi, mais très inspiré par la réponse acceptée. Ce script injecte la configuration requirejse dans /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf. (Si quelqu’un a une solution plus élégante, il aimerait le voir)

Ce script permet également à la vérification d’intégrité Beanstalk d’atteindre mon sharepoint terminaison de vérification de l’état de santé (dans mon cas, api / healthcheck). Il est préférable d’autoriser LoadBalancer à accéder à l’application plutôt qu’à 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 

J’ai pu faire en sorte que cela fonctionne de manière différente. J’ai modifié mon équilibreur de charge pour transférer le trafic du port 80 vers le port 8082 et modifié les règles de pare-feu (entrantes sur l’instance, sortantes sur le pare-feu) pour autoriser cela. Et puis ajouté ce fichier dans .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--; }