uwsgi与NGINX搭配sock文件无权限问题解决

2025-11-26 10:10:04 by wst

django

问题

作为一名Python开发者,经常使用Django框架开发web项目,但是在部署的时候,经常会遇到这么一个问题:用户权限问题。

比如运行python的用户是wst, 运行nginx的用户是www-data, 运行uwsgi的用户是wst。在访问url的时候看到错误日志:

2025/11/25 17:15:39 [crit] 362910#362910: *93 connect() to unix:///home/wst/workspace/baykeshop/socket.sock failed (13: Permission denied) while connecting to upstream, client: 123.127.39.194, server: shop.wanshitao.com, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://unix:///home/wst/workspace/baykeshop/socket.sock:", host: "shop.wanshitao.com", referrer: "https://shop.wanshitao.com/ "

分析

日志里括号中的 (13: Permission denied) 就是 Linux 返回的 errno,含义非常明确:
nginx(以 www-data 身份)去访问 socket 文件 /home/wst/workspace/baykeshop/socket.sock 时被拒绝。
99 % 的情况不是 socket 本身权限,而是 “目录路径” 对 www-data 没有 x(搜索)权限 导致无法到达文件。

解决方法

1. 逐级查看每一级目录的权限,一个命令就可以搞定

wst@iZ2zeckc3dag76gzyszxc4Z:~/workspace/baykeshop$ namei -l /home/wst/workspace/baykeshop/socket.sock
f: /home/wst/workspace/baykeshop/socket.sock
drwxr-xr-x root root /
drwxr-xr-x root root home
drwx------ wst  wst  wst
drwx------ wst  wst  workspace
drwx------ wst  wst  baykeshop
srwxrwxrwx wst  wst  socket.sock

到这里就能看到 /home/wst 目录是 drwx------其它用户(含 www-data)连进都进不来,socket 权限再宽松也没用。

2. 给目录加“执行”权限,保证 www-data 能走到文件,即保留目录归 wst,但给其它用户加 x

sudo chmod 755 /home/wst /home/wst/workspace /home/wst/workspace/baykeshop

3. 重启nginx、uwsgi服务;

# 重新载入nginx
sudo nginx -s reload
# 重新启动uwsgi,包括停止和启动
/home/wst/anaconda3/envs/bayke/bin/uwsgi --stop uwsgi.pid
/home/wst/anaconda3/envs/bayke/bin/uwsgi --ini bayke_uwsgi.ini

 

在探索Web开发的路上,我们一起前行!

--- 爱学习,爱分享的小鲤鱼。


Comments(0) Add Your Comment

Not Comment!