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开发的路上,我们一起前行!
--- 爱学习,爱分享的小鲤鱼。