如何使用Nginx正确部署配置NestJS后端?Ubuntu部署遇502网关错误
问题排查与修复方案
核心错误配置
你当前配置中最明显的问题是proxy_pass协议写错:
- 本地运行的NestJS服务默认没有配置SSL证书,走的是HTTP协议,你配置成了
https://localhost:3000,Nginx尝试用HTTPS协议请求本地HTTP服务,自然连接失败返回502。
其他常见配置遗漏
1. 接口路径前缀处理
你当前配置的location /api/如果直接代理到http://localhost:3000,会把/api前缀一起转发给NestJS服务。比如你访问/api/products,最终NestJS收到的请求路径是/api/products,如果你的NestJS接口没有统一加/api前缀,就会返回404。
如果需要自动去掉/api前缀,只需要在proxy_pass的地址末尾加斜杠即可。
2. 缺失必要代理头
反向代理时需要主动传递请求头给后端服务,否则NestJS可能无法正确获取请求源信息,引发跨域、访问限制等问题。
修正后的Nginx配置
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/ikse/html; server_name ikse.fransenit.nl www.ikse.fransenit.nl; index index.html index.htm; location / { try_files $uri $uri/ /index.html; } location /api/ { # 修正为HTTP协议,末尾加斜杠自动去除/api前缀 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; } listen [::]:443 ssl; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/ikse.fransenit.nl/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/ikse.fransenit.nl/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot }
后续排查步骤
修改配置后执行nginx -t验证配置是否合法,合法的话执行systemctl reload nginx重载配置。如果还是有问题,可以按以下步骤排查:
- 执行
ss -tulpn | grep 3000确认NestJS服务确实在监听3000端口 - 查看Nginx错误日志
cat /var/log/nginx/error.log获取具体报错信息 - 确认NestJS服务没有设置IP访问限制,允许本地回环地址127.0.0.1访问
内容的提问来源于stack exchange,提问作者Jessey Fransen
相关产品推荐
相关产品推荐

