基于NGINX反向代理的NodeJS+Express应用出现504网关超时求助
Hey Dave,刚接触Nginx遇到504超时确实头大,我帮你一步步排查,咱们从最基础的地方开始:
第一步:先确认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.

