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

基于NGINX反向代理的NodeJS+Express应用出现504网关超时求助

Hey Dave,刚接触Nginx遇到504超时确实头大,我帮你一步步排查,咱们从最基础的地方开始:

排查Nginx反向代理504 Gateway Time-out的步骤

第一步:先确认Node.js应用本身能正常运行

首先得排除不是应用本身的问题——毕竟504本质是Nginx没法从后端(你的Node/Express服务)拿到响应。

  • 先在服务器本地用curl访问你的应用端口(假设你的App跑在3000端口,要是实际端口不一样记得改):
    curl http://localhost:3000
    如果能返回正常的页面/接口响应,说明应用本身没问题;如果连这个都超时或报错,先去看pm2的日志找原因:
    pm2 logs appname
    重点看有没有启动失败、端口被占用、依赖缺失这类报错。
  • 顺便确认pm2确实把应用拉起来了:pm2 list,看对应appname的状态是不是online。

第二步:检查Nginx的反向代理配置

这是新手最容易踩坑的环节,尤其是结合SSL配置的时候,重点看这几个点:

1. 反向代理的地址和端口必须完全匹配

打开你的Nginx站点配置文件(一般在/etc/nginx/sites-available/或/etc/nginx/conf.d/目录下),找到location /块,确保proxy_pass指向的是你的Node应用实际运行的地址和端口:

location / {
    proxy_pass http://localhost:3000; # 这里的端口要和你的App监听端口完全一致!
    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; # 这个对SSL场景很重要,能让Express识别出请求是HTTPS的
}

要是你把端口写错了(比如App跑在8080,这里写3000),Nginx肯定连不上后端,直接报504。

2. SSL配置和HTTP跳转是否正确

因为你用了Let's Encrypt,配置里应该有两个server块:一个监听80端口做HTTPS跳转,一个监听443端口处理SSL请求。

  • 正确的HTTP转HTTPS配置大概是这样:
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com; # 换成你的实际域名
    return 301 https://$server_name$request_uri;
}
  • 而HTTPS的server块里,除了Let's Encrypt自动生成的证书配置(ssl_certificate和ssl_certificate_key),必须包含上面的反向代理location /配置,不然HTTPS请求没法转发到Node应用。

3. 调整Nginx的超时设置

有时候504是因为Nginx等待后端响应的时间太短了,可以在http块或者对应的server块里添加超时配置:

proxy_connect_timeout 60s; # 连接后端的超时时间
proxy_send_timeout 60s;    # 发送请求到后端的超时时间
proxy_read_timeout 60s;    # 等待后端响应的超时时间

先把时间设长一点,测试是不是这个问题导致的超时。

第三步:检查服务器防火墙设置

Ubuntu 16.04默认用ufw防火墙,要确保:

  • 80和443端口是开放的:执行ufw status,查看输出里有没有ALLOW 80/tcp和ALLOW 443/tcp的条目;
  • 本地的Node应用端口(比如3000)允许Nginx访问——其实本地回环(localhost)的端口一般不受防火墙限制,但如果你的App绑定的是0.0.0.0,也可以确认下端口没被防火墙挡住:ufw allow 3000/tcp(测试完可以删掉这条)。

第四步:查看Nginx错误日志找细节

这是最关键的排查手段!Nginx会把所有错误信息写到日志里,默认路径是/var/log/nginx/error.log。
执行命令实时查看最新日志:
tail -f /var/log/nginx/error.log
然后刷新你的网站,看日志里有没有具体的报错,比如:

connect() failed (111: Connection refused) while connecting to upstream

这种信息就直接说明Nginx连不上你的Node应用,那回到第一步再确认App的运行状态和端口。

最后:测试配置并重启Nginx

每次修改Nginx配置后,一定要先测试配置是否合法:
nginx -t
如果输出显示test is successful,再重启Nginx让配置生效:
systemctl restart nginx

要是按上面的步骤排查完还是有问题,把你的Nginx配置文件内容、pm2日志片段贴出来,我再帮你细查!

内容的提问来源于stack exchange,提问作者Dave H.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:55:21