Nginx报(13: Permission denied)连接upstream错误,Django部署后访问白屏
问题根因
报错(13: Permission denied) while connecting to upstream是Nginx进程没有权限访问Gunicorn生成的Unix套接字文件导致的,你当前把sock文件放在了/root目录下,该目录默认仅root用户可访问,而Nginx默认以www-data普通用户运行,自然无法读取目录下的sock文件。
排查步骤
- 确认Nginx运行用户:执行命令
ps aux | grep nginx,查看第一列的运行用户,默认应为www-data - 检查sock文件所在目录权限:执行命令
ls -ld /root/myproject/,确认www-data是否有读和执行权限 - 检查sock文件本身权限:执行命令
ls -l /root/myproject/myproject.sock,确认文件权限是否允许非root用户访问 - 检查AppArmor状态(Ubuntu默认开启),确认是否有安全策略阻止Nginx访问sock路径
解决方案
方案1:移动sock文件到公共可访问目录(推荐,安全性最高)
不要把sock文件放在/root目录下,移动到/run或者/var/www这类公共目录:
- 修改Gunicorn的systemd配置文件(一般路径为
/etc/systemd/system/gunicorn.service),把sock文件的生成路径改到/run下,例如把--bind unix:/root/myproject/myproject.sock改成--bind unix:/run/myproject.sock - 重载systemd配置:
sudo systemctl daemon-reload - 重启Gunicorn服务:
sudo systemctl restart gunicorn - 修改Nginx配置文件里的上游地址,把sock路径同步为新路径,例如
proxy_pass http://unix:/run/myproject.sock; - 测试Nginx配置是否合法:
sudo nginx -t - 重启Nginx服务生效:
sudo systemctl restart nginx
方案2:调整目录和sock文件权限(不推荐,存在安全风险)
如果必须把sock放在/root目录下,可临时调整权限解决:
- 给
/root目录加执行权限,允许其他用户进入目录:sudo chmod o+x /root - 给项目目录加读和执行权限:
sudo chmod o+rx /root/myproject - 把
www-data加入sock文件所属的用户组:sudo usermod -aG root www-data - 重启Nginx服务生效:
sudo systemctl restart nginx
内容的提问来源于stack exchange,提问作者Osama Radwan
相关产品推荐
相关产品推荐

