如何使用SSL将AWS EC2 Flask应用程序部署到HTTPS端口443?

时间:2017-07-26 22:03:30

标签: ssl amazon-ec2 flask https aws-codestar

我无法让我的Flask应用程序在https://my.domain/上运行,尽管它已成功部署到常规http://my.domain/

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

上的Jupyter Notebook实例上运行

我能够修改/etc/httpd/conf/httpd.conf以访问https://my.domain/ - >上的根主目录。的/ home /用户名/代码/

我也能成功将http请求重定向到https,但是登录页面只是一个linux资源管理器,而不是我的Flask应用程序。

即使在对httpd.conf,ssl.conf和wsgi.conf进行大量编辑以在端口443上启动Flask应用程序之后,它仍然没有这样做,但仍保留在端口80上。

另外,我注意到每当我通过AWS CodeStar部署代码更改时,部署都会覆盖我的EC2实例/etc/httpd/conf.d/wsgi.conf文件。

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

1 个答案:

答案 0 :(得分:2)

为了让HTTPS / SSL适用于Flask,以便Flask在2个端口上运行,您首先要遵循以下提示:Https with Http in Flask Python

但是,这只会将Flask代码设置为使用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>

请注意,此时您还可以编辑端口80部分以删除wsgi,而是重定向到443,如下所述:  Redirect to Https using Elastic Beanstalk ELBRedirect HTTP to HTTPS Apache2

使用

重置Apache服务器来测试此配置
sudo service httpd restart

然后启动您的开发服务器

python application.py

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

然后您应该看到Flask在两个端口上运行!

但请注意,如果您在EC2实例上运行此代码,则您的代码可能已经部署并正在运行,因此您的端口可能正在使用中,您将看到&#34; OSError:[Errno 98]地址已经在使用&#34;

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

我从https://forums.aws.amazon.com/thread.jspa?threadID=163369发现了以下事实(另请参阅Stackoverflow问题what is difference between commands and container commands in elasticbean talkConfigure apache on elastic beanstalkwsgi user permissions on elastic beanstalk)...

显然,通过CodeStar和Elastic Beanstalk的EC2部署会覆盖/etc/httpd/conf.d/wsgi.conf文件。为了防止/纠正这种情况,您需要编辑.ebextensions配置脚本​​以使用您自己的wsgi.conf文件。请注意,这样做的缺点是不跟踪亚马逊可能对其默认脚本进行的更新。

首先,我将要保留的wsgi.conf文件复制到.ebextensions目录。

接下来,我编辑了我的.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

然后,在&#34;文件之后:&#34;部分,我将以下内容添加到配置的末尾:

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

请注意,上面使用的是CONTAINER_COMMANDS,而不是COMMANDS。

这项技术的优点在于Elastic Beanstalk会自动运行Apache服务器重启命令,因此在部署之后,您无需手动复制任何内容或重新运行&#34; sudo service httpd restart&#34;

按照上述步骤操作,您的Flask将在HTTPS上运行并使用SSL证书并正确部署。