AWS EC2 HTTPS配置故障:443端口目标组异常及访问超时排查
问题诊断
核心问题拆解:
- 443目标组不健康:大概率是目标组健康检查配置与EC2后端服务不匹配,或负载均衡的SSL终止配置未完成
- HTTPS/无端口访问超时:Route53记录未指向负载均衡、负载均衡443监听未绑定有效SSL证书、或安全组/路由规则存在拦截
一、推荐方案:SSL终止于AWS负载均衡(ALB/NLB)
这种模式更易维护、性能更优,也是AWS官方推荐的架构:
1. 修正负载均衡443监听配置
- 登录AWS控制台进入负载均衡器页面,找到你的ALB/NLB
- 编辑443端口监听:
- 协议选
HTTPS,端口443 - 绑定你在ACM签发的SSL证书(必须是已颁发状态,域名验证完成)
- 转发目标组的协议设为
HTTP,目标端口填8080(和Node.js应用端口一致)
- 协议选
2. 修复目标组健康检查
- 进入目标组页面,编辑健康检查:
- 协议:
HTTP - 端口:
8080(和Node.js应用监听端口一致) - 路径:
/(对应你Node.js的根路由,确保访问该路径返回200状态码) - 间隔、超时保持默认即可,重点保证健康检查请求能被后端响应
- 协议:
3. 修正Route53域名解析记录
- 进入Route53托管区,确保
personindicator.com的A/CNAME记录指向负载均衡的DNS名称(不是EC2公网IP):- A记录选「别名」,直接关联你的负载均衡
- CNAME记录直接填写负载均衡的完整DNS域名
4. 优化Node.js应用(强制HTTPS跳转,可选但推荐)
负载均衡会通过X-Forwarded-Proto头传递原始请求协议,添加中间件强制非HTTPS请求跳转:
// 放在所有中间件最前面 app.use((req, res, next) => { if (req.headers['x-forwarded-proto'] !== 'https') { return res.redirect(`https://${req.headers.host}${req.url}`); } next(); }); // 原有代码保留 app.use(cors()); app.use(express.json()); app.get("/", (req, res) => { res.status(200).send("server running"); }); const port = process.env.PORT || 8080; app.listen(port, () => { console.log(`Server running on http://localhost:${port}`); });
5. 调整80端口重定向规则
把原来的8080端口重定向改成80端口的规则:
- 编辑负载均衡80端口监听,设置为重定向到
HTTPS,端口443,主机头保持personindicator.com
二、备选方案:直接在Node.js应用处理SSL(不推荐)
仅适合无负载均衡的场景,步骤如下:
1. 获取SSL证书文件
ACM证书无法直接下载,可通过Certbot生成Let's Encrypt证书,或使用自签证书,最终需要两个文件:cert.pem(证书)和key.pem(私钥)
2. 修改Node.js代码启用HTTPS
const https = require('https'); const fs = require('fs'); const express = require('express'); const app = express(); app.use(cors()); app.use(express.json()); app.get("/", (req, res) => { res.status(200).send("server running"); }); // 加载证书文件 const sslOptions = { key: fs.readFileSync('./private-key.pem'), cert: fs.readFileSync('./certificate.pem') }; const port = process.env.PORT || 443; https.createServer(sslOptions, app).listen(port, () => { console.log(`Server running on https://localhost:${port}`); });
3. 调整目标组与负载均衡
- 目标组协议改为
HTTPS,端口443 - 负载均衡443监听直接转发到目标组(无需SSL终止)
- 确保EC2安全组开放443端口
故障排查分步指南
1. 验证SSL证书有效性
- 进入ACM控制台,确认证书状态为「已颁发」,域名验证记录(Route53中的CNAME)存在且生效
2. 检查目标组健康检查
- 登录EC2实例,执行
curl http://localhost:8080,确认返回200状态码 - 检查EC2安全组,确保允许负载均衡所在安全组访问8080端口(不要只开放0.0.0.0/0)
- 查看目标组健康检查日志,明确失败原因(比如超时、状态码非200)
3. 排查负载均衡配置
- 用
curl -v https://personindicator.com查看请求链路,判断是DNS解析失败、TCP连接超时还是SSL握手出错 - 确认负载均衡安全组允许0.0.0.0/0访问80、443端口
4. 验证EC2后端状态
- 执行
netstat -tulpn | grep 8080,确认Node.js应用监听0.0.0.0:8080(不是仅localhost) - 检查EC2子网路由表,确保关联了互联网网关(IGW)
- 检查EC2网络ACL,允许80、443、8080端口的入站/出站流量
内容的提问来源于stack exchange,提问作者Gaoridang
相关产品推荐
相关产品推荐

