如何在EC2实例上以HTTPS运行Python Flask应用(无需修改代码)
在EC2上为Flask应用配置HTTPS(无需修改代码)
方法一:使用Nginx反向代理 + Let's Encrypt证书
这是最常用的方案,通过Nginx接收HTTPS请求,再转发给本地运行的Flask应用(保持HTTP)。
1. 安装Nginx
根据EC2实例的操作系统执行对应命令:
- 对于Amazon Linux 2/CentOS:
sudo yum install nginx -y sudo systemctl start nginx sudo systemctl enable nginx - 对于Ubuntu/Debian:
sudo apt update sudo apt install nginx -y sudo systemctl start nginx sudo systemctl enable nginx
2. 配置Nginx反向代理
编辑Nginx的站点配置文件,比如/etc/nginx/conf.d/flask_app.conf:
server { listen 80; server_name your-domain.com; # 替换为你的域名 # 把所有HTTP请求重定向到HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl; server_name your-domain.com; # SSL证书路径(后续通过certbot自动生成) ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # 转发请求到本地Flask应用(假设Flask跑在5000端口) location / { proxy_pass http://127.0.0.1:5000; 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; } }
保存后测试配置是否合法:
sudo nginx -t
如果没有错误,重启Nginx:
sudo systemctl restart nginx
3. 获取免费SSL证书(Let's Encrypt)
安装Certbot工具来自动获取和续期证书:
- 对于Amazon Linux 2/CentOS:
sudo yum install certbot python3-certbot-nginx -y - 对于Ubuntu/Debian:
sudo apt install certbot python3-certbot-nginx -y
执行证书申请命令,Certbot会自动配置Nginx:
sudo certbot --nginx -d your-domain.com
按照提示完成邮箱填写、同意条款等步骤即可。证书会自动续期,无需手动操作。
4. 配置EC2安全组
确保EC2实例的安全组开放**80(HTTP)和443(HTTPS)**端口,允许来自0.0.0.0/0的访问(或按需限制IP)。
方法二:使用AWS应用负载均衡器(ALB)
利用AWS的负载均衡器处理HTTPS终止,EC2上的Flask应用保持HTTP运行。
1. 创建并配置ALB
- 登录AWS控制台,进入EC2服务,创建应用负载均衡器,选择互联网-facing类型。
- 配置监听:添加HTTPS监听(端口443),选择一个已有的SSL证书(可在AWS Certificate Manager申请免费证书);同时添加HTTP监听(端口80)并设置重定向到HTTPS。
- 将Flask应用所在的EC2实例添加到目标组,目标组的端口设置为Flask运行的端口(如5000),协议选择HTTP。
2. 配置安全组
- ALB的安全组开放80和443端口。
- EC2实例的安全组仅允许来自ALB安全组的流量访问Flask端口(如5000),增强安全性。
3. 更新域名解析
将你的域名解析到ALB的DNS地址。
两种方案都不需要修改Flask应用的代码,只需通过外部代理或负载均衡器实现HTTPS访问。
内容的提问来源于stack exchange,提问作者Puneet Mehta
相关产品推荐
相关产品推荐

