如何在无负载均衡器的情况下为EC2上的Express服务配置ACM证书实现HTTPS?
替代负载均衡的EC2后端HTTPS配置方案及ACM证书使用方法
一、无需负载均衡的HTTPS配置替代方案
1. 直接在EC2实例上配置HTTPS(Nginx反向代理+证书)
- 优点:
- 成本极低,仅需承担EC2实例基础费用,无额外服务开销
- 配置流程直观,适合学习阶段深入理解HTTPS原理
- 完全掌控服务器端SSL/TLS配置细节
- 缺点:
- 存在单点故障风险,EC2实例宕机则服务完全中断
- 需手动维护证书续期(若使用非托管证书)
- 无法实现自动扩容,高流量场景下性能瓶颈明显
- SSL/TLS加密解密性能完全依赖EC2实例硬件配置
2. 用CloudFront反向代理EC2后端
- 优点:
- 借助CloudFront全球边缘节点,大幅提升全球用户访问速度
- 自动管理ACM证书续期,无需手动操作
- 自带基础DDoS防护能力,提升服务安全性
- 低流量场景下成本远低于负载均衡,按实际使用量计费
- 缺点:
- 配置复杂度略高于直接在EC2部署,需熟悉CloudFront源站配置规则
- 动态API场景下需谨慎配置缓存策略,避免返回过期数据
- CloudFront与EC2之间通信若需加密,仍需在EC2端配置证书
3. 使用API Gateway集成EC2后端(仅适用于API服务)
- 优点:
- 完全托管式服务,无需维护EC2实例操作系统和Web服务器
- 自动处理HTTPS流量,原生支持ACM证书
- 内置API限流、身份认证、请求转换等功能,无需自行开发
- 低调用量场景下成本极低,按请求次数计费
- 缺点:
- 复杂Express应用迁移时需调整架构(适配API Gateway集成规则)
- 存在一定请求延迟,不适合对响应速度要求极高的场景
- 不支持WebSocket等长连接协议
二、无负载均衡下使用ACM证书的步骤
ACM证书默认分为两类:一类用于AWS托管服务(如CloudFront、ELB),无法直接导出;另一类支持导出,可用于EC2等第三方服务器。具体操作如下:
申请可导出的ACM证书
- 登录AWS控制台进入ACM服务,选择「请求公有证书」
- 输入后端域名(如
api.yourdomain.com),选择「DNS验证」(若用Route53可自动添加验证记录,快速完成域名验证) - 证书签发后,确认标记为「可导出」(申请时需选择「用于第三方设备或服务」的用途)
导出并上传证书文件
- 在ACM控制台找到目标证书,点击「导出」,获取PEM格式的证书、私钥和证书链文件
- 将文件上传到EC2实例安全目录(如
/etc/ssl/certs/),设置私钥权限为600(避免其他用户读取)
配置服务使用证书
- Express直接配置:
const https = require('https'); const fs = require('fs'); const express = require('express'); const app = express(); // 业务路由逻辑 app.get('/api', (req, res) => { res.json({ status: 'ok', message: 'HTTPS enabled' }); }); const sslOptions = { key: fs.readFileSync('/etc/ssl/certs/private.key'), cert: fs.readFileSync('/etc/ssl/certs/cert.pem'), ca: fs.readFileSync('/etc/ssl/certs/chain.pem') }; https.createServer(sslOptions, app).listen(443, () => { console.log('HTTPS server running on port 443'); }); - Nginx反向代理(推荐,性能更优):
server { listen 443 ssl; server_name api.yourdomain.com; ssl_certificate /etc/ssl/certs/cert.pem; ssl_certificate_key /etc/ssl/certs/private.key; ssl_trusted_certificate /etc/ssl/certs/chain.pem; location / { proxy_pass http://localhost:3000; # 对应Express运行端口 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; } } # 可选:HTTP请求重定向到HTTPS server { listen 80; server_name api.yourdomain.com; return 301 https://$server_name$request_uri; }
- Express直接配置:
安全组配置
- 开放EC2实例安全组的
443端口(HTTPS)和80端口(若配置HTTP转HTTPS),允许公网访问
- 开放EC2实例安全组的
内容的提问来源于stack exchange,提问作者Bennyh961
相关产品推荐
相关产品推荐

