2017-07-26 126 views
0

我不能让我的瓶的应用程序在https://my.domain/运行,但它确实成功地部署到正规http://my.domain/如何使用SSL将AWS EC2 Flask应用程序部署到HTTPS端口443?

我是能够成功地获取并测试SSL证书和验证它们在https://my.domain:8888/

上Jupyter笔记本实例工作

我能够修改/etc/httpd/conf/httpd.conf中的https://my.domain/以访问我的根主目录 - > /首页/用户名/密码/

我也能够成功地将HTTP请求重定向到https,但登陆页面只是一个Linux资源管理器,而不是我的Flask a pplication。

也就是说,即使在httpd.conf中,ssl.conf中,并wsgi.conf发动对端口443瓶应用广泛的编辑,它没有这样做,但仍然在80端口

而且,我注意到无论何时通过AWS CodeStar部署我的代码更改,部署都会覆盖我的EC2实例/etc/httpd/conf.d/wsgi.conf文件。

在亚马逊这边有一个设置,我必须配置,以便我的应用程序部署到正确的端口?还是需要编辑我的EC2实例服务器上的配置文件?或者是其他错误?

回答

0

为了得到HTTPS/SSL为瓶工作,使瓶2个端口上运行,你首先要在这里遵循的提示:Https with Http in Flask Python

然而,这只会设置你的瓶代码运行与SSL。它不会在部署时实际启动Flask进程。为此,您需要编辑/etc/httpd/conf.d/wsgi.conf脚本以启动wsgi守护程序的第二个实例。

您的wsgi.conf的默认脚本应该包含一个端口80的部分。您想复制此部分,添加您的SSL参数,然后编辑wsgi命令以拥有不同的变量名称,否则Apache会在您投诉时发射。我有以下补充:

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

请注意,您还可以在这个时候,除去WSGI,而是编辑端口80节有一个重定向到443,因为这里说明: Redirect to Https using Elastic Beanstalk ELBRedirect HTTP to HTTPS Apache2

测试这种配置通过重新使用

sudo service httpd restart 

然后Apache服务器启动您的开发服务器

python application.py 

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

之后,应看到瓶上的两个端口上运行的!

但是,请注意,如果您在EC2实例上运行此代码,则您的代码可能已经部署并正在运行,因此您的端口可能正在使用中,您将看到“OSError:[Errno 98] Address already in use “

但是你还没有完成......哦,不,还有一个问题......

我发现从https://forums.aws.amazon.com/thread.jspa?threadID=163369这实际上如下(见的问题#1 what is difference between commands and container commands in elasticbean talkConfigure apache on elastic beanstalkwsgi user permissions on elastic beanstalk)...

通过CodeStar和弹性青苗显然EC2应用并覆盖你/etc/httpd/conf.d/ wsgi.conf文件。为了防止/更正此问题,您需要编辑.ebextensions配置脚本​​以使用您自己的wsgi.conf文件。请注意,这有一个缺点,那就是不跟踪亚马逊可能对其默认脚本进行的更新。

首先,我复制了我想保留在.ebextensions目录下的wsgi.conf文件。

接下来,我修改了.ebextensions/sshd.config文件(唯一一个我有在该目录中),以添加以下内容:

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 

然后,在经过“文件:”一节中,我添加以下到配置结束:

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

请注意,上述使用CONTAINER_COMMANDS,而不是命令。

关于这项技术的最大好处是,弹性魔豆自动运行的Apache服务器重新启动命令,所以在部署之后,你不需要手动复制任何东西,或重新运行“命令服务的httpd重新启动”

继上述步骤将使您的Flask在HTTPS上运行SSL证书并正确部署。

相关问题