如何通过ELB与Nginx处理子域名及自定义域名的SSL请求
解决方案
针对自定义域名的SSL安全与请求转发问题,提供以下3种可行方案:
方案1:基于AWS ALB + ACM多域名证书(生产环境推荐)
- 操作步骤:
- 要求商户将自定义域名的CNAME记录指向你的ALB域名,而非直接用A记录绑定EC2 IP
- 在AWS ACM中申请多域名SSL证书,同时包含你的泛域名
*.salesklik.com以及所有商户的自定义域名;若商户已有自有证书,也可通过ACM的证书导入功能统一管理 - 配置ALB的HTTPS监听器,绑定该多域名证书,将HTTPS请求转发至EC2的HTTP端口(ALB已完成SSL终止,EC2无需再处理加密)
- 确保EC2上的Next.js应用监听对应端口,ALB会自动转发原始
Host头,Next.js默认可直接读取
- 核心优势:统一管理所有域名的SSL证书,商户仅需修改DNS记录,无需自行维护证书;ALB自带负载均衡能力,后续扩容EC2实例更便捷
- 注意事项:若商户无法使用CNAME记录(必须用A记录),可引导其使用Route 53的别名记录绑定ALB,或搭配AWS Global Accelerator实现静态IP访问(成本略高)
方案2:EC2部署Nginx作为反向代理处理SSL
- 操作步骤:
- 在EC2实例上安装Nginx,配置反向代理指向Next.js应用(假设Next.js监听3000端口)
- 使用Let's Encrypt的
certbot工具,为每个自定义域名自动申请并续期免费SSL证书 - Nginx配置示例:
# 处理自定义域名HTTPS请求 server { listen 443 ssl; server_name store1.com; ssl_certificate /etc/letsencrypt/live/store1.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/store1.com/privkey.pem; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; # 确保Next.js获取原始请求域名 proxy_set_header X-Forwarded-Proto $scheme; } } # 强制HTTP跳转至HTTPS server { listen 80; server_name store1.com; return 301 https://$host$request_uri; } - 让商户将自定义域名的A记录指向EC2公网IP
- 核心优势:无需依赖ALB,适合小规模部署场景,证书自动续期成本极低
- 注意事项:新增商户域名时需更新Nginx配置并重启服务;若EC2公网IP变动,所有商户需同步修改DNS记录,维护风险较高
方案3:Next.js直接处理SSL(不推荐生产环境使用)
- 操作步骤:
- 为每个自定义域名获取SSL证书(可使用Let's Encrypt)
- 通过Next.js启动参数配置SSL,示例命令:
next start --port 443 --ssl-cert /path/to/store1.com.crt --ssl-key /path/to/store1.com.key - 若需支持多域名,需自定义Next.js服务器或使用
http-proxy-middleware实现证书路由
- 核心劣势:Next.js并非专业Web服务器,处理SSL和高并发的能力较弱,多域名场景下维护复杂度极高,不建议用于生产环境
内容的提问来源于stack exchange,提问作者Sayak-dutta
相关产品推荐
相关产品推荐

