如何将AWS CloudFront HTTPS流量转发至HTTP协议的EC2实例
问题描述
我有一台EC2实例,其上运行着一个简单的React Web应用,部署在Nginx之后(监听80端口)。目前可通过EC2实例的公网IP访问该应用,但因使用HTTP协议,希望将整个链路切换为HTTPS。
已创建CloudFront分配并关联AWS SSL证书,同时配置Route 53将某域名的流量转发至该分配,但CloudFront流量无法转发至EC2实例,猜测原因是CloudFront用HTTPS而EC2未启用SSL服务,求解决方法。若需AWS配置截图,可提供。
更新信息
浏览器显示错误:
This site doesn't support https
配置背景
- EC2实例通过
curl访问80端口正常(附截图) - CloudFront分配配置为仅允许客户端HTTPS访问(附截图)
- CloudFront分配已配置为转发流量至EC2的80端口(HTTP协议)(附截图)
解决方法
方案一:CloudFront与EC2间用HTTP通信(无需EC2配置SSL)
这种方案无需在EC2部署SSL证书,由CloudFront对外提供HTTPS,内部转发用HTTP,是最简便的实现方式,重点检查以下配置:
- CloudFront源配置
- 源域名填写EC2的弹性IP(避免动态公网IP变化)或公网IP
- 源端口选
80,协议设置为HTTP only - 安全组配置:EC2入站规则允许
HTTP(80)访问,来源优先选择CloudFront官方前缀列表com.amazonaws.global.cloudfront.origin-facing(更安全),也可临时开放0.0.0.0/0测试是否为安全组限制问题
- CloudFront行为配置
- 确认“源协议策略”设为
HTTP only(关键配置,确保CloudFront用HTTP转发请求到EC2的80端口) - 已配置的“查看器协议策略”(仅允许HTTPS)保持不变
- 确认“源协议策略”设为
- 生效验证
- 等待CloudFront配置部署完成(通常需5-10分钟),清除浏览器缓存后重新访问域名
方案二:EC2配置SSL,实现端到端HTTPS
若要求CloudFront到EC2的链路也用HTTPS,需在EC2的Nginx上配置SSL:
- 获取SSL证书
- 可使用Let's Encrypt免费证书,或导出AWS ACM证书(注意ACM公有证书无法直接下载,需用私有CA或第三方证书)
- 修改Nginx配置
- 编辑Nginx站点配置文件(通常在
/etc/nginx/conf.d/或/etc/nginx/sites-available/目录下),添加443端口监听:server { listen 443 ssl; server_name 你的域名; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/private.key; location / { root /path/to/react/build; try_files $uri $uri/ /index.html; } } - 重启Nginx:
sudo systemctl restart nginx
- 编辑Nginx站点配置文件(通常在
- 更新CloudFront配置
- 源端口改为
443,协议设为HTTPS only - “源协议策略”设置为
HTTPS only - EC2安全组开放
HTTPS(443)访问,来源配置同方案一
- 源端口改为
额外排查步骤
若配置后仍报错,可检查:
- Route 53解析记录是否为
A/CNAME类型,且指向CloudFront分配域名(而非EC2公网IP) - 用
curl -v https://你的域名查看详细请求日志,定位具体错误环节 - 确认CloudFront分配状态为“已部署”(未部署的配置不会生效)
内容的提问来源于stack exchange,提问作者vikrant
相关产品推荐
相关产品推荐

