Django+Gunicorn+Nginx环境下Connection Refused错误排查求助
问题排查:Nginx连接上游拒绝及重启失败
一、初始连接拒绝错误
网站搜索功能调用API时触发Nginx错误日志如下:
2022/08/31 21:01:56 [error] 726#726: *23 connect() failed (111: Connection refused) while connecting to upstream, client: 11.111.111.111, server: api.mydomain.com, request: "GET /dividends/IBM/3/5 HTTP/1.1", upstream: "http://127.0.0.1:8001/dividends/IBM/3/5", host: "api.example.com", referrer: "example.com/"
当前环境:supervisord管理的Gunicorn、MongoDB、Nginx均显示正常运行,初始Nginx配置中upstream指向127.0.0.1:8001。
二、修改套接字路径后Nginx重启失败
调整Nginx配置中proxy_pass为proxy_pass unix:/etc/systemd/system/gunicorn.socket;后,执行重启操作失败:
root@my-droplet:~/stocks_backend# sudo service nginx restart Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
当前gunicorn.socket配置内容:
[Unit] Description=gunicorn socket [Socket] ListenStream=/run/gunicorn.sock [Install] WantedBy=sockets.target
三、排查与解决方案
1. 修复Nginx重启失败问题
- 核心错误:套接字路径不匹配:gunicorn.socket配置中监听的是
/run/gunicorn.sock,但Nginx配置里写的是/etc/systemd/system/gunicorn.socket,路径完全错误。 - 修正步骤:
- 编辑Nginx配置文件
/etc/nginx/sites-available/stocks_backend,将location /块中的proxy_pass改为:proxy_pass http://unix:/run/gunicorn.sock; - 先测试Nginx配置语法是否正确:
sudo nginx -t - 确认语法无误后重启Nginx:
sudo systemctl restart nginx
- 编辑Nginx配置文件
2. 解决初始连接拒绝问题
- 原因分析:初始Nginx配置中
upstream指向127.0.0.1:8001,但Gunicorn实际通过/run/gunicorn.sock套接字监听,而非TCP端口,导致连接被拒绝。 - 后续验证步骤:
- 确认gunicorn.socket和gunicorn.service状态正常:
sudo systemctl status gunicorn.socket sudo systemctl status gunicorn.service - 检查套接字文件权限:确保Nginx进程用户(通常为
www-data)对/run/gunicorn.sock有读写权限,可通过以下命令查看:
若权限不足,可在gunicorn.service配置中添加ls -l /run/gunicorn.sockUMask=0007,或修改socket所属组为www-data。 - 若需改用TCP端口监听,需调整Gunicorn配置,让其监听
127.0.0.1:8001,同时保持Nginx的upstream和proxy_pass指向该端口。
- 确认gunicorn.socket和gunicorn.service状态正常:
内容的提问来源于stack exchange,提问作者codyc4321
相关产品推荐
相关产品推荐

