如何为NestJS框架的Node.js后端配置HTTPS并解决443端口访问失败问题
解决方案
1. 解决特权端口绑定权限问题
Linux系统中小于1024的端口默认仅允许root用户绑定,443属于特权端口,普通用户启动的Node进程默认没有监听权限,可选两种解决方法:
- 方法一:使用root权限启动应用,在你原本的启动命令前加
sudo即可,比如sudo npm run start:prod - 方法二:给Node二进制文件开放绑定特权端口的权限,执行命令:
sudo setcap 'cap_net_bind_service=+ep' $(which node)
2. 修复证书文件路径读取问题
当前代码使用相对路径./secrets/key.pem读取证书,如果Node进程的工作目录不是项目根目录,会读取证书失败导致HTTPS服务启动报错,建议改为绝对路径读取:
首先在文件头部引入path模块:
import * as path from 'path';
修改httpsOptions配置:
const httpsOptions = { // 路径需根据你main.ts部署后的实际位置调整,确保能匹配到secrets目录即可 key: fs.readFileSync(path.join(__dirname, '../secrets/key.pem')), cert: fs.readFileSync(path.join(__dirname, '../secrets/cert.pem')), };
3. 新增HTTPS服务错误捕获日志
当前代码没有捕获HTTPS服务的启动错误,就算启动失败也无法从日志定位问题,修改HTTPS服务启动逻辑:
const httpsServer = https.createServer(httpsOptions, server); httpsServer.listen(443, () => { logger.log(`HTTPS server listening on port 443`); }); httpsServer.on('error', (err) => { logger.error(`HTTPS server startup failed:`, err); });
新增日志后可以直接从应用日志判断是权限问题、证书读取问题还是其他异常。
4. 检查EC2实例本地防火墙规则
AWS安全组放通443不代表实例内部的操作系统防火墙也放通了端口:
- 如果是Ubuntu等使用ufw的系统:执行
sudo ufw status查看443端口是否允许,未放通则执行sudo ufw allow 443 - 如果是使用iptables的系统:执行
sudo iptables -L -n检查规则,未放通则执行sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
5. 验证端口监听状态
应用启动后执行sudo netstat -tulpn | grep :443或者ss -tulpn | grep :443,如果能看到Node进程监听443端口就说明启动成功。
注意:你使用的是自签名证书,客户端默认会报证书不受信任错误,curl测试时需要加上
-k参数跳过证书校验,比如curl -k https://34.201.57.229/api/status,生产环境建议替换为可信CA颁发的正式证书。
内容的提问来源于stack exchange,提问作者Arefe
相关产品推荐
相关产品推荐

