You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 22:36:07