Nginx代理Gunicorn Socket遇权限拒绝问题求助
解决Gunicorn与Nginx的Socket权限冲突问题
这个问题的核心是目录权限链的限制和Socket文件的权限归属,咱们一步步理清楚:
为什么会出现两种权限问题?
1. www-data启动Gunicorn时的Permission denied
你把项目放在了/root/PSite/blog里,但Linux中/root目录的默认权限是drwx------(只有root用户能读、写、进入)。哪怕你把项目文件夹的所有者改成了www-data:www-data,www-data用户也没法进入/root目录——目录的执行权限(x)是进入该目录的前提,没有这个权限,里面的文件再怎么设置都没用。
2. root启动Gunicorn后Nginx无权限访问Socket
当用root用户启动Gunicorn时,生成的sock文件默认所有者是root:root,权限通常是srw-rw----(只有所有者和同组用户能读写)。而Nginx是用www-data用户运行的,既不是root用户,也不在root组里,自然没法访问这个Socket。
推荐的解决方案(安全且规范)
最稳妥的做法是把项目从/root目录移出来,放到Web服务专用的目录(比如/var/www),然后调整权限:
步骤1:移动项目目录
mkdir -p /var/www/PSite mv /root/PSite/blog /var/www/PSite/
步骤2:设置正确的权限
确保www-data用户能完全访问项目目录:
chown -R www-data:www-data /var/www/PSite/blog chmod -R 755 /var/www/PSite/blog
chown把目录所有者改为www-data用户组chmod 755让用户有读写执行权限,组和其他用户有读、执行权限(符合Web项目的安全规范)
步骤3:修改Gunicorn配置文件
编辑/etc/systemd/system/gunicorn.service,更新路径:
[Unit] Description=gunicorn daemon After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/var/www/PSite/blog # 更新为新路径 ExecStart=/var/www/PSite/blog/blog/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/var/www/PSite/blog/blog.sock blog.wsgi:application # 更新为新路径 [Install] WantedBy=multi-user.target
步骤4:修改Nginx配置文件
编辑/etc/nginx/sites-available/blog,更新静态文件和Socket路径:
server { listen 80; server_name server_domain_or_IP; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /var/www/PSite/blog; } # 更新为新路径 location / { include proxy_params; proxy_pass http://unix:/var/www/PSite/blog/blog.sock; } # 更新为新路径 }
步骤5:重启服务生效
systemctl daemon-reload # 重载systemd配置 systemctl restart gunicorn systemctl restart nginx
不推荐的临时方案(仅作了解)
如果实在不想移动目录,可以临时放宽/root目录的权限(但不建议这么做,会降低root目录的安全性):
chmod o+x /root
这样www-data用户就能进入/root目录启动Gunicorn了,但root目录的安全性会大打折扣,所以还是优先用前面的规范方案。
内容的提问来源于stack exchange,提问作者Catalin
相关产品推荐
相关产品推荐

