我正在尝试按照本指南使用uWSGI和nginx设置我的Django应用程序。我能够使用 Django 的开发服务器运行我的应用程序,并直接从 uWSGI 提供服务。
我在大学管理的 Ubuntu 16.04 虚拟机上运行所有内容,并且我的用户拥有
sudo
访问权限。
我的问题:
当到达本教程的这一点并尝试获取图像时,我从 nginx 收到 403 错误。
下一部分的结果是 502。
/var/log/nginx/error.log
显示
连接到上游时,连接到 unix:///me/myproject/media/image.jpg 失败(13:权限被拒绝)
连接到上游时,连接到 unix:///me/myproject/project.sock 失败(13:权限被拒绝)
分别适用于 403 和 502。
我已经阅读了多个问题和指南(这里一个,这里另一个和另一个,这不是全部),更改了我的权限,甚至将我的
.sock
移动到另一个文件夹(其中之一) SO答案建议)。
我还能尝试什么?
更新:
我在评论中提到了这一点,但我已经进一步了解了bit。问题的一部分是,显然,我的虚拟机上的
/home
目录是 NFS,这会搞乱很多权限。
我做了什么:
/var/www/myproject/
chown -R me:www-data myproject
chmod -R 764 myproject
我的新成果:
uwsgi --http :8000 --module myproject.wsgi
uwsgi --socket myproject.sock --module myproject.wsgi --chmod-socket=664
uwsgi --ini myproject.ini
所以现在已经不是一般的权限问题了,绝对是nginx的问题...
更新#2:
目前,当
other
对套接字具有 read-write
权限以及对项目其余部分的 read-execute
权限时,一切正常。www-data
用户身份运行,这是我的整个项目的组所有者,并且具有 read-execute
权限,就像other
现在有。
这是我的(更新)
nginx.conf
# myproject_nginx.conf
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server unix:///var/www/myproject/myproject.sock;
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 8000;
# the domain name it will serve for
server_name my.ip.goes.here; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /var/www/myproject/media; # your Django project's media files - amend as required
}
location /static {
alias /var/www/myproject/static; # your Django project's static files - amend as required
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include /var/www/myproject/uwsgi_params; # the uwsgi_params file you installed
}
}
这是我的(更新)
uwsgi.ini
# myproject_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /var/www/myproject
# Django's wsgi file
module = myproject.wsgi
# the virtualenv (full path)
home = /var/www/myenv
# process-related settings
master = true
# maximum number of worker processes
processes = 10
# the socket (full path)
socket = /var/www/myproject/myproject.sock
# ... with appropriate permissions - may be needed
chmod-socket = 666
uid = me
gid = www-data
# clear environment on exit
vacuum = true
根据我的经验,Web 服务器周围的大多数权限问题都是通过访问 root 拥有的文件来实现的,但 Apache (nginx) 是在
www-data
用户下运行的。
尝试跑步
sudo chown www-data -R /path/to/your/data/folder
。
正如教程所说:
您可能还需要将您的用户添加到 nginx 的组中(这可能是 www-data),反之亦然,以便 nginx 可以读取和写入您的 插座正确。
尝试一下,看看会发生什么。
同样,我不建议您使用 sudo 或 root 执行操作,而是以普通用户身份执行操作并在必要时授予权限,否则您可能最终会遇到 Nginx 或 uWSGI 需要使用 sudo 执行某些操作的情况文件,它们归 root 所有。
解决方案 无论选择哪种解决方案,请记住重新启动 Nginx
sudo /etc/init.d/nginx restart
同样使用--chmod-socket=666权限执行
uwsgi --socket project.sock --module project.wsgi --chmod-socket=666
1。将 .sock 文件和文件夹分配给 www-data 组
在我看来,这是最好的选择,因为它只能访问这些文件夹,而没有创建项目的用户组有权访问的所有内容的权限(正如我们在第二点中所做的那样)。 我们必须将 www-data 指定为 .sock 文件和直至用户名的文件夹的组。
示例:
sudo chown :www-data /home/daniel/
sudo chown :www-data /home/daniel/project
sudo chown :www-data /home/daniel/project/project.sock
2。将 www-data 用户添加到创建 .sock 的用户组中 第一个也是推荐的解决方案是将默认的 Nginx 用户添加到创建项目的用户组中:
这将允许 www-data 用户(由 Nginx 使用)访问 daniel 拥有的文件和目录。
sudo usermod -aG daniel www-data
将 Nginx 用户 (www-data) 添加到您的用户组 (daniel) 可能会产生一些安全隐患,具体取决于您的系统配置方式以及您的用户 (daniel) 拥有的权限。
3.更改 /etc/nginx/nginx.conf 中的用户 与之前的情况类似,将 www-data 用户更改为创建项目的用户会更宽松。 确保 Nginx 在正确的用户下运行。通常,Nginx 在基于 Debian/Ubuntu 的系统上运行在 www-data 用户下,在基于 CentOS/Red Hat 的系统上运行在 nginx 下。
您可以在 Nginx 配置文件(/etc/nginx/nginx.conf)中检查这一点:
user www-data;
重新启动服务
更改权限和配置后,重新启动 Nginx 和 uWSGI 以使更改生效:
sudo systemctl restart nginx
sudo systemctl restart uwsgi