AWS EC2上Nginx HTTPS连接不生效 仅IP:端口可正常访问Flask应用
问题根源
- 你当前配置的443端口监听未添加
ssl标识,也未配置对应SSL证书参数,Nginx无法正常处理HTTPS请求,是无返回内容的核心原因 - 未删除default软链接时,Nginx默认服务块优先级高于你写的无有效HTTPS配置的服务块,因此访问时返回默认页
- 你未配置代理请求头,即使后续连通服务,Flask也可能无法获取正确的客户端请求信息
解决步骤
1. 安装SSL证书申请工具
执行命令安装certbot用于申请Let's Encrypt免费SSL证书:
sudo apt update && sudo apt install certbot python3-certbot-nginx -y
2. 修正Nginx配置
编辑/etc/nginx/sites-enabled/flaskapp文件,替换为以下配置:
# HTTP请求自动重定向到HTTPS server { listen 80; server_name ec2-xx-xx-xx-45.ap-south-1.compute.amazonaws.com; return 301 https://$host$request_uri; } # HTTPS服务配置 server { listen 443 ssl; server_name ec2-xx-xx-xx-45.ap-south-1.compute.amazonaws.com; # 以下SSL配置会由certbot自动填充,无需手动修改 # ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem; # ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem; # include /etc/letsencrypt/options-ssl-nginx.conf; # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_pass http://127.0.0.1:8000; # 配置代理头,保证Flask能获取正确的请求信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
3. 申请SSL证书
执行certbot命令,按照提示完成证书申请和自动配置:
sudo certbot --nginx -d ec2-xx-xx-xx-45.ap-south-1.compute.amazonaws.com
4. 验证配置并重启服务
先检查配置语法是否正确:
sudo nginx -t
返回syntax is ok和test is successful后,重载Nginx生效:
sudo systemctl reload nginx
5. 安全组检查
确认AWS EC2实例关联的安全组已经开放443端口的入站规则,允许0.0.0.0/0访问。
多应用部署方案
如果需要在同一台EC2上部署多个HTTPS应用,按以下操作即可:
- 为每个应用分配不同的域名(可使用自有域名的不同子域名,均解析到当前EC2公网IP)
- 每个应用对应gunicorn启动时使用不同的端口,比如第二个应用使用8001端口
- 在
/etc/nginx/sites-available目录下新建对应应用的配置文件,参考上述flaskapp配置修改server_name和proxy_pass端口 - 执行
ln -s /etc/nginx/sites-available/新配置文件名 /etc/nginx/sites-enabled/创建软链接 - 用certbot为新域名申请SSL证书,重载Nginx即可生效
内容的提问来源于stack exchange,提问作者dhairyashil
相关产品推荐
相关产品推荐

