AWS Elastic Beanstalk单实例环境:Nginx配置SSL及HTTP转HTTPS
配置AWS Elastic Beanstalk单实例(Nginx+uWSGI)的SSL与HTTP转HTTPS
我之前刚好在完全相同的EB环境(单实例、Python+Nginx+uWSGI)下配置过SSL,给你一步步拆解实操步骤:
1. 把SSL证书上传到AWS IAM
单实例模式没有负载均衡,我们需要将证书存到IAM中,让EB实例可以调用它:
- 打开AWS控制台的IAM服务,左侧菜单栏选择「证书管理」
- 点击「上传证书」,上传你的PEM格式证书主体、证书链文件,以及对应的私钥文件
- 上传完成后,复制证书的ARN(亚马逊资源名称),后面配置会用到
2. 修改Elastic Beanstalk环境的端口监听规则
接下来要让EB实例监听443端口并关联SSL证书:
- 打开Elastic Beanstalk控制台,进入你的Python应用环境
- 点击左侧「配置」,找到「实例」类别(不同EB版本可能在「网络」分类下)
- 找到「实例端口」板块,点击「编辑」:
- 添加新监听规则:协议选
HTTPS,端口填443,实例端口设为80(因为Nginx默认监听80端口,后续转发给uWSGI) - 在「SSL证书」下拉框中选择你刚上传的证书(也可以直接粘贴之前复制的ARN)
- 保存配置,等待EB环境更新完成
- 添加新监听规则:协议选
3. 配置Nginx强制HTTP转HTTPS
这一步要修改Nginx配置,实现所有HTTP请求自动重定向到HTTPS:
- 在你的Python项目根目录创建
.ebextensions文件夹(如果还没有的话) - 在
.ebextensions内创建nginx/conf.d/ssl_redirect.conf文件(EB会自动加载这个路径下的Nginx配置) - 将以下内容写入该文件:
server { listen 80; return 301 https://$host$request_uri; }
- 如果你需要确保HTTPS请求能正确转发到uWSGI,可以再创建
.ebextensions/nginx/conf.d/uwsgi_ssl.conf,内容如下(注意sock路径要和你当前uWSGI配置一致,默认是下面这个路径):
server { listen 443 ssl; ssl_certificate /etc/pki/tls/certs/server.crt; ssl_certificate_key /etc/pki/tls/certs/server.key; location / { include uwsgi_params; uwsgi_pass unix:/tmp/uwsgi.sock; } }
提示:EB会自动把IAM中的证书同步到实例的
/etc/pki/tls/certs/目录,无需手动上传证书文件到实例
4. 重新部署并验证配置
- 把包含
.ebextensions目录的代码重新部署到Elastic Beanstalk - 部署完成后,访问你的域名的HTTP地址,应该会自动跳转到HTTPS
- 用浏览器检查证书是否正常生效,确认没有安全警告
如果遇到Nginx启动失败的情况,可以通过EB控制台的「日志」功能下载实例日志,查看/var/log/nginx/error.log排查问题,大多是配置语法错误或路径不匹配导致的。
内容的提问来源于stack exchange,提问作者Fabio




