2017-07-26 2 views
0

Je ne peux pas obtenir mon application Flask pour fonctionner sur https://my.domain/, bien qu'il ne se déploie avec succès à la régulière http://my.domain/Comment déployer une application AWS EC2 Flask sur le port HTTPS 443 avec SSL?

j'ai pu obtenir avec succès et le test des certificats SSL et vérifier qu'ils fonctionnent sur une instance de portable Jupyter à https://my.domain:8888/

j'ai pu modifier /etc/httpd/conf/httpd.conf pour accéder à mon répertoire racine à https://my.domain/ ->/home/nom d'utilisateur/code/

Je suis également capable de rediriger avec succès des requêtes http à https, mais la page d'atterrissage est juste un explorateur Linux, pas mon Flask un pplication.

C'est, même après l'édition étendue de httpd.conf, ssl.conf et wsgi.conf pour lancer l'application Flask sur le port 443, il ne le fait pas, mais reste sur le port 80.

également , J'ai remarqué que chaque fois que je déploie mes modifications de code via AWS CodeStar, le déploiement écrase mon fichier EC2 instance /etc/httpd/conf.d/wsgi.conf.

Existe-t-il un paramètre du côté Amazon que je dois configurer pour que mon application se déploie sur le port correct? Ou dois-je modifier les fichiers de configuration sur mon serveur d'instance EC2? Ou est-ce que quelque chose d'autre est mauvais?

Répondre

0

Afin d'obtenir HTTPS/SSL pour travailler pour Flask afin que Flask fonctionne sur 2 ports, vous voulez d'abord suivre les conseils ici: Https with Http in Flask Python

Cependant, cela ne mettre en place votre code Flask pour exécuter avec SSL. Il ne lancera pas réellement le processus Flask lors du déploiement. Pour cela, vous devrez éditer votre script /etc/httpd/conf.d/wsgi.conf pour lancer une deuxième instance du démon wsgi. Votre script par défaut pour wsgi.conf doit contenir une section pour le port 80. Vous souhaitez copier cette section, ajouter vos paramètres SSL, puis modifier la commande wsgi pour avoir un nom de variable différent, sinon Apache se plaindra lorsque vous lancement. Je donne les résultats suivants ajouté:

<VirtualHost *:443> 
    ServerName <MY SERVER NAME> 
    ServerAlias <MY SERVER NAME> 
    SSLEngine on 
    SSLCertificateFile <Server PEM file> 
    SSLCertificateKeyFile <Private Key PEM file> 
    SSLProtocol all -SSLv2 -SSLv3 
    SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA; 
    SSLHonorCipherOrder on 
    Alias /static/ /opt/python/current/app/static/ 
    <Directory /opt/python/current/app/static/> 
    Order allow,deny 
    Allow from all 
    </Directory> 
    WSGIScriptAlias//opt/python/current/app/application.py 
    <Directory /opt/python/current/app/> 
    Require all granted 
    </Directory> 
    WSGIDaemonProcess wsgi2 processes=1 threads=15 display-name=%{GROUP} \ 
    python-path=/opt/python/current/app:/opt/python/run/venv/lib64/python3.4/site-packages:/opt/python/run/venv/lib/python3.4/site-packages user=wsgi group=wsgi \ 
    home=/opt/python/current/app 
    WSGIProcessGroup wsgi2 
    </VirtualHost> 

Notez que vous pouvez également modifier la section port 80 à ce moment pour enlever wsgi et à la place ont une redirection vers 443, comme expliqué ici: Redirect to Https using Elastic Beanstalk ELB et Redirect HTTP to HTTPS Apache2

test cette configuration en réinitialisant le serveur Apache en utilisant

sudo service httpd restart 

Et puis lancez votre serveur de développement

python application.py 

ou

sudo /home/ec2-user/anaconda3/bin/python application.py 

Vous devriez alors voir Flask en cours d'exécution sur deux ports! Cependant, notez que si vous exécutez ceci sur votre instance EC2, votre code peut déjà être déployé et en cours d'exécution, ainsi vous pourrez utiliser les ports et vous verrez "OSError: [Errno 98] Address déjà utilisé "

Mais vous n'avez pas encore fini ... oh non, il y en a un de plus ...

J'ai découvert ce fait suite à partir https://forums.aws.amazon.com/thread.jspa?threadID=163369 (voir aussi des questions Stackoverflow what is difference between commands and container commands in elasticbean talk, Configure apache on elastic beanstalk, wsgi user permissions on elastic beanstalk) ...

De toute évidence le déploiement EC2 via Codestar et Elastic Beanstalk ne remplace votre /etc/httpd/conf.d/ wsgi.conf fichier. Afin de prévenir/corriger cela, vous devez éditer vos scripts de configuration .ebextensions pour utiliser votre propre fichier wsgi.conf. Notez que cela a l'inconvénient de ne pas suivre les mises à jour qu'Amazon peut apporter à leur script par défaut.

J'ai d'abord copié le fichier wsgi.conf que je veux conserver dans le répertoire .ebextensions.

Ensuite, je modifié mon .ebextensions/fichier sshd.config (le seul que j'ai dans ce répertoire) pour ajouter ce qui suit:

files: 
    "/etc/httpd/conf.d/wsgi.conf" : 
    mode: "000777" 
    owner: root 
    group: root 
    content: | 
     <IfModule !wsgi_module> 
     LoadModule wsgi_module modules/mod_wsgi.so 
     </IfModule> 
     . . . 
     <VirtualHost *:443> 
     . . . 
     </VirtualHost> 
     LogFormat "%h (%{X-Forwarded-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 

Puis, après les « fichiers: » section, ajouter ce qui suit à la fin de la configuration:

container_commands: 
    02_update_wsgi: 
    command: > 
     cp .ebextensions/wsgi.conf ../wsgi.conf 

Notez que les utilisations ci-dessus CONTAINER_COMMANDS, pas Commands.

La grande chose au sujet de cette technique est que Elastic Beanstalk exécute automatiquement la commande de redémarrage du serveur Apache, donc une fois que vous vous déployez ne pas besoin de copier quoi que ce soit manuellement ou re-run « httpd restart sudo service »

Suite à la Au-dessus des étapes obtiendront votre Flask s'exécutant sur HTTPS avec des certificats SSL ET déployer correctement.