如何使用Nginx或AWS负载均衡器为AWS EC2实例上的NodeJS应用多端口配置HTTPS
解决EC2 NodeJS应用多端口HTTPS配置问题
嘿,我来帮你搞定这个多端口HTTPS配置的问题!下面给你两种实用方案,你可以根据自己的场景选——一种是用Nginx反向代理(适合单EC2实例的情况),另一种是用AWS负载均衡器(适合需要弹性扩展的场景)。
方案一:Nginx反向代理(单实例首选)
这个方案成本低,配置起来也快,适合只有一台EC2实例的场景。
前置准备
- 你的域名已经解析到EC2实例的公网IP
- 已经拿到SSL证书(推荐用Let's Encrypt免费证书,或者你自己购买的证书)
- EC2安全组已经开放3000、1337、8080、443端口的TCP入站流量
步骤1:安装Nginx
根据你的EC2实例系统类型执行命令:
- Ubuntu/Debian系统:
sudo apt update && sudo apt install nginx -y - CentOS/RHEL系统:
sudo yum install nginx -y
步骤2:配置SSL证书
如果用Let's Encrypt,直接用certbot工具生成证书:
sudo apt install certbot python3-certbot-nginx -y # Ubuntu/Debian # CentOS需先装epel源:sudo yum install epel-release -y,再安装certbot sudo certbot certonly --nginx -d yourdomainname.com
执行完后,证书会存在/etc/letsencrypt/live/yourdomainname.com/目录下。
步骤3:配置Nginx多端口HTTPS
编辑Nginx配置文件,比如新建一个站点配置:
sudo nano /etc/nginx/sites-available/yourdomain.conf
粘贴以下配置(记得替换成你的域名和证书路径):
# 配置3000端口的HTTPS server { listen 3000 ssl; server_name yourdomainname.com; ssl_certificate /etc/letsencrypt/live/yourdomainname.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomainname.com/privkey.pem; # 反向代理到NodeJS的3000端口服务 location / { proxy_pass http://localhost:3000/; 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; } } # 配置1337端口的HTTPS server { listen 1337 ssl; server_name yourdomainname.com; ssl_certificate /etc/letsencrypt/live/yourdomainname.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomainname.com/privkey.pem; location / { proxy_pass http://localhost:1337/; 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; } } # 配置8080端口的HTTPS server { listen 8080 ssl; server_name yourdomainname.com; ssl_certificate /etc/letsencrypt/live/yourdomainname.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomainname.com/privkey.pem; location / { proxy_pass http://localhost:8080/; 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 yourdomainname.com; return 301 https://$server_name$request_uri; }
步骤4:启用配置并重启Nginx
先检查配置是否有误:
sudo nginx -t
如果提示test is successful,就重启Nginx:
sudo systemctl restart nginx
现在你就可以通过https://yourdomainname.com:3000、https://yourdomainname.com:1337、https://yourdomainname.com:8080访问对应服务了!
方案二:AWS应用负载均衡器(ALB,多实例/弹性场景首选)
如果你的服务需要后续扩展多台EC2实例,或者想让AWS帮你管理SSL证书和流量分发,ALB是更好的选择。
前置准备
- 你的域名已经解析到即将创建的ALB(可以先创建ALB再改解析)
- 在AWS ACM(证书管理器)中申请了SSL证书(必须和ALB在同一区域)
- EC2实例的安全组允许ALB的安全组访问3000、1337、8080端口
步骤1:创建目标组
每个NodeJS服务端口对应一个目标组:
- 登录AWS控制台,进入EC2服务,找到目标组,点击创建目标组
- 选择实例类型,协议选HTTP,端口填3000,下一步
- 选择你的EC2实例,注册进去,创建目标组(命名为
target-group-3000) - 重复以上步骤,分别创建端口1337的
target-group-1337和8080的target-group-8080
步骤2:创建应用负载均衡器
- 进入EC2服务的负载均衡器页面,点击创建负载均衡器,选择应用负载均衡器
- 配置基本信息:命名,选择公网访问,选择EC2实例所在的VPC和可用区
- 配置安全组:创建一个新的安全组,开放3000、1337、8080、443端口的HTTPS(TCP)入站流量
- 配置监听:
- 添加第一个监听:端口3000,协议HTTPS,选择你在ACM申请的证书,默认转发到
target-group-3000 - 添加第二个监听:端口1337,协议HTTPS,选择同一证书,默认转发到
target-group-1337 - 添加第三个监听:端口8080,协议HTTPS,选择同一证书,默认转发到
target-group-8080 - (可选)添加443端口的HTTPS监听,用路径规则转发到不同目标组,比如
/service1转发到3000,这样可以不用带端口访问
- 添加第一个监听:端口3000,协议HTTPS,选择你在ACM申请的证书,默认转发到
- 完成创建,等待ALB状态变为活跃
步骤3:更新域名解析
把你的域名解析到ALB的DNS名称(在ALB详情页可以找到)
现在你就可以通过https://yourdomainname.com:3000等地址访问服务了,而且后续添加EC2实例到目标组就能自动扩展!
两种方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| Nginx反向代理 | 成本低,配置简单,适合单实例 | 需要自己维护Nginx和证书续期,扩展性差 |
| AWS ALB | 弹性扩展,AWS管理证书自动续期,高可用 | 有额外的负载均衡器费用,配置步骤稍多 |
内容的提问来源于stack exchange,提问作者syed monzurul ahsan AYON
相关产品推荐
相关产品推荐

