J'ai un site propulsé par Node.js que j'exécute sur Amazon Elastic Beanstalk.
Mon application Node.js écoute sur le port 8080, et j'utilise la configuration d'équilibrage 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 régler quelque chose dans l'application pour résoudre ce problème, mais je suis intéressé par un moyen d'obtenir l'équilibreur de charge pour rediriger toutes les demandes HTTP vers mon site via HTTPS.
Après plusieurs faux départs avec des idées du support payant d'Amazon, ils ont finalement abouti. Pour que cela fonctionne, vous configurez votre environnement pour qu'il réponde aux ports 80 et 443. Créez ensuite un dossier dans votre dossier principal Node.js, appelé .ebextensions
, et vous placez un fichier nommé 00_nginx_https_rw.config
là-dedans, 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 de support d'Amazon a expliqué: Cette configuration crée un hook de déploiement qui ajoutera les règles de réécriture à /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf.
(Auparavant, ils m'avaient proposé des .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 avoir la priorité sur la configuration par défaut de nginx, pour une raison quelconque.)
Si jamais vous voulez annuler cela, c'est-à-dire supprimer les crochets, vous devez supprimer cette extension électronique et émettre une commande pour supprimer les fichiers qu'elle crée. Vous pouvez le faire soit manuellement, soit via les commandes ebextensions que vous mettez temporairement en place:
/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 ce changement:
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 pourra 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 configure une application Ruby on Rails avec Puma.
J'ai parlé au support payant, nous l'avons compris en exécutant simplement les commandes manuellement sur l'instance en cours d'exécution. Ensuite, j'ai pu comprendre la solution ci-dessous. Juste en vous connectant et en redémarrant les choses nginx, cela a fonctionné.
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
Remarquez 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 le X-Forwarded-Proto
en-tête qui est égal à 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 de Express
et avant de définir vos itinéraires pour rediriger automatiquement le client vers le point de 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 cela avec une solution légèrement plus simple.
Veuillez noter qu'il s'agit d'une instance SINGLE déployée par beanstalk élastique, non équilibrée en charge.
C'était mon ebextension 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;
}
J'exécute l'environnement 'Ruby2 Puma' sur AWS Elastic Beanstalk qui peut avoir une configuration légèrement différente de celle ci-dessus. Dans mon environnement, j'avais besoin d'utiliser "écouter 80" au lieu de "écouter 8080".
sslredirect.config basé sur réponse d'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 requise dans /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf. (Si quelqu'un a une solution plus élégante, j'adorerais la voir)
Ce script permet également au contrôle de santé Beanstalk d'atteindre mon point de terminaison de contrôle de santé (dans mon cas, api/healthcheck) Mieux pour permettre au LoadBalancer de frapper l'application, plutôt que de se terminer sur 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 d'une manière différente. J'ai changé mon équilibreur de charge pour transférer le trafic du port 80 vers le port 8082, et changé les règles de pare-feu (entrant sur l'instance, sortant sur le pare-feu) pour le permettre. 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--;
}
La réponse acceptée n'a pas fonctionné pour moi. Après de nombreux essais (et des heures de recherche sur Google), je trouve quelque chose qui a fonctionné pour moi. J'ai également un site propulsé par Node.js que j'exécute sur Elastic Beanstalk.
J'ai utilisé le script à partir d'ici: https://adamjstevenson.com/tutorials/2017/02/02/configuring-and-forcing-https-for-aws-elastic-beanstalk.html
La seule modification que j'ai faite a été de désactiver
/opt/elasticbeanstalk/support/conf/webapp_healthd.conf
par
/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf
donc ça donne ceci:
files:
"/tmp/45_nginx_https_rw.sh":
owner: root
group: root
mode: "000644"
content: |
#! /bin/bash
CONFIGURED=`grep -c "return 301 https" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf`
if [ $CONFIGURED = 0 ]
then
sed -i '/listen 80;/a \ if ($http_x_forwarded_proto = "http") { return 301 https://$Host$request_uri; }\n' /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_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
Après eb deploy
, redémarrez simplement votre nginx Sudo service nginx restart
et vous êtes prêt.