You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动