NGINX无法连接已运行的后端服务,请求提示连接被拒绝
看起来你第一次部署网站就碰到了NGINX和后端服务连通的麻烦,别着急,咱们一步步排查问题。从你贴的NGINX错误日志:
2024/11/29 10:36:48 [error] 901#901: *9 connect() failed (111: Connection refused) while connecting to upstream, client: 172.69.121.138, server: avery-insights.icu, request: "POST /auth/signup HTTP/1.1", upstream: "http://127.0.0.1:5000/auth/signup", host: "avery-insights.icu"
能明确核心问题:NGINX尝试连接127.0.0.1:5000时被拒绝了,哪怕你本地运行完全正常。下面是几个常见的排查方向:
先确认后端服务真的在监听127.0.0.1:5000吗?
本地跑没问题不代表服务器上的后端绑定了正确地址。很多时候开发时服务绑定127.0.0.1,但部署后如果只绑定回环地址,或者不小心绑定了其他网卡地址,NGINX就连不上。你可以在服务器上执行命令:netstat -tulpn | grep 5000 # 或者用更现代的ss命令 ss -tulpn | grep 5000看看输出里有没有进程在监听5000端口,且监听地址是
0.0.0.0(允许所有地址访问)或者127.0.0.1(仅限本地)。如果看不到相关进程,那就是服务没启动对。检查后端服务是否真的在服务器上正常运行
别只看控制台没输出,可能服务启动失败了只是你没抓到错误。你可以用这个命令看看进程是否存在:ps aux | grep 你的后端进程名另外别忘了查看后端服务的日志文件(如果有配置的话),确认服务确实启动成功且没有崩溃。
优化你的NGINX配置(虽然不是直接导致连接拒绝的原因,但能避免后续问题)
你现在的配置是单个路径的转发,其实可以简化成针对整个/auth前缀的转发,更灵活:location /auth { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }另外你配置里的
Upgrade和Connection 'upgrade'是给WebSocket用的,如果你的后端只是普通HTTP API,完全可以去掉这些头,避免不必要的干扰。检查服务器防火墙/安全组是否拦截了5000端口
哪怕后端监听了5000端口,服务器的防火墙(比如ufw、iptables)或者云服务商的安全组如果没允许本地访问5000端口,也会导致连接被拒绝。你可以临时关闭防火墙测试一下,或者添加规则允许127.0.0.1访问5000端口:# 以ufw为例 sudo ufw allow in from 127.0.0.1 to any port 5000排查后端服务的运行权限问题
虽然5000是非特权端口(大于1024),非root用户也能绑定,但如果后端服务依赖的文件/资源权限不足,也可能导致服务启动后无法正常监听端口。可以看看服务启动时的日志有没有权限相关的报错。
先从上面这几点入手排查,应该能找到问题所在。
备注:内容来源于stack exchange,提问作者huy huy

