Nginx+uWSGI部署Django时chown-socket遇Operation not permitted问题
解决Nginx与uWSGI的Socket权限问题
问题背景
Nginx报错:
connect() to unix:/var/www/html/view/dbproject/dbproject.sock failed (13: Permission denied) while connecting to upstream
尝试在uWSGI配置中添加chown-socket = %(username):www-data后,uWSGI日志出现chown(): Operation not permitted,核心原因是普通用户无权限将文件组修改为www-data系统组。
解决方案
方法1:将用户加入www-data组(推荐)
无需root启动uWSGI,通过组权限实现访问:
- 执行命令将目标用户添加到www-data组:
sudo usermod -aG www-data myusername - 注销当前用户重新登录,或执行
newgrp www-data让组权限临时生效 - 修改uwsgi.ini配置:
- 移除
chown-socket = %(username):www-data(或改为%(username):%(username)) - 保留
chmod-socket = 660,此时socket的组用户(www-data)拥有读写权限,Nginx可正常访问
- 移除
方法2:以root启动uWSGI并降权运行worker进程
若必须设置socket所有者为myusername:www-data,可通过root启动master进程完成权限修改,再让worker进程以普通用户运行:
- 在uwsgi.ini中添加以下配置:
uid = myusername gid = www-data - 使用sudo启动uWSGI:
此时master进程以root运行,可修改socket所有者,worker进程自动降权为sudo uwsgi --ini /var/www/html/view/dbproject/uwsgi.inimyusername:www-data,兼顾权限需求与运行安全。
方法3:调整Socket存放目录
将socket放到Nginx与uWSGI都有权限的系统目录:
- 创建目录并设置权限:
sudo mkdir -p /run/uwsgi/ sudo chown myusername:www-data /run/uwsgi/ sudo chmod 750 /run/uwsgi/ - 修改uwsgi.ini中的socket路径:
socket = /run/uwsgi/dbproject.sock - 移除
chown-socket配置,保留chmod-socket = 660,socket会继承目录的权限属性,Nginx可正常访问。
内容的提问来源于stack exchange,提问作者ymantan
相关产品推荐
相关产品推荐

