为了让 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,如下所述:
使用 Elastic Beanstalk ELB重定向到 HTTPS和将 HTTP 重定向到 HTTPS Apache2
通过使用重置 Apache 服务器来测试此配置
sudo service httpd restart
然后启动你的开发服务器
python application.py
或者
sudo /home/ec2-user/anaconda3/bin/python application.py
然后你应该看到 Flask 在两个端口上运行!
但是,请注意,如果您在 EC2 实例上运行它,您的代码可能已经部署并运行,因此您的端口可能正在使用中,您将看到“OSError: [Errno 98] Address already in use”
但是你还没有完成......哦不,还有一个问题......
我从https://forums.aws.amazon.com/thread.jspa?threadID=163369发现了以下事实(另请参阅 Stackoverflow 问题elasticbean talk 中的命令和容器命令有什么区别,在弹性 beanstalk 上配置 apache,wsgi弹性beantalk的用户权限)...
显然,通过 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
然后,在“文件:”部分之后,我将以下内容添加到配置的末尾:
container_commands:
02_update_wsgi:
command: >
cp .ebextensions/wsgi.conf ../wsgi.conf
请注意,上面使用的是 CONTAINER_COMMANDS,而不是 COMMANDS。
这种技术的伟大之处在于 Elastic Beanstalk 会自动运行 Apache 服务器重启命令,因此在部署后您无需手动复制任何内容或重新运行“sudo service httpd restart”
遵循上述步骤将使您的 Flask 使用 SSL 证书在 HTTPS 上运行并正确部署。