Nginx在处理Django静态内容时出现权限被拒绝的错误(13)

3
我使用了这个 tutorial 来设置虚拟环境和nginx服务器。 我完全按照指示操作,但是在访问静态内容时,我仍然会得到一个

Permission denied (13)

的错误提示。 我已经将我的静态目录和整个Django项目设置为www-data所有。

更进一步来说,如果我忽略静态内容并尝试运行emperor,我会遇到更多的权限被拒绝的错误。现在每次我尝试访问该站点都会出现此问题。

root      8704  0.0  0.0  62780  1260 ?        Ss   16:19   0:00 nginx: master process /usr/sbin/nginx
www-data  8705  0.0  0.0  63108  1680 ?        S    16:19   0:00 nginx: worker process
www-data  8706  0.0  0.0  63108  1680 ?        S    16:19   0:00 nginx: worker process
www-data  8707  0.0  0.0  63108  1680 ?        S    16:19   0:00 nginx: worker process
www-data  8708  0.0  0.0  63448  2276 ?        S    16:19   0:00 nginx: worker process

以root身份启动uwsgi: https://gist.github.com/anonymous/f19997fd07c0237a7435 以www-data身份启动uwsgi:

root@vmd2719:~/energy1/energydrinks# uwsgi --ini django.ini --uid www-data --gid www-data
[uWSGI] getting INI configuration from django.ini
open("./python27_plugin.so"): No such file or directory [core/utils.c line 3321]
!!! UNABLE to load uWSGI plugin: ./python27_plugin.so: cannot open shared object file: No such file or directory !!!
*** Starting uWSGI 1.9.6 (64bit) on [Mon Apr 15 16:24:49 2013] ***
compiled with version: 4.6.3 on 15 April 2013 11:52:36
os: Linux-3.2.0-40-generic #64-Ubuntu SMP Mon Mar 25 21:22:10 UTC 2013
nodename: vmd2719
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /root/energy1/energydrinks
writing pidfile to /tmp/energy-master.pid
detected binary path: /usr/local/bin/uwsgi
setgid() to 33
setuid() to 33
chdir(): Permission denied [core/uwsgi.c line 2063]
chdir(): Permission denied [core/uwsgi.c line 1249]
chdir(): Permission denied [core/uwsgi.c line 1269]

访问静态文件时的Nginx调试日志:

2013/04/15 16:20:25 [debug] 8708#0: *1 http filename: "/root/energy1/energydrinks/static/jgrowl/jquery.jgrowl.js"
2013/04/15 16:20:25 [debug] 8708#0: *1 add cleanup: 0000000001F68C10
2013/04/15 16:20:25 [error] 8708#0: *1 open() "/root/energy1/energydrinks/static/jgrowl/jquery.jgrowl.js" failed (13: Permission denied), client: 109.193.75.142, server: .de, request: "GET /static/jgrowl/jquery.jgrowl.js HTTP/1.1", host: ".de:8000", referrer: "http://.de:8000/member/register/"
2013/04/15 16:20:25 [debug] 8708#0: *1 http finalize request: 403, "/static/jgrowl/jquery.jgrowl.js?" a:1, c:1
2013/04/15 16:20:25 [debug] 8708#0: *1 http special response: 403, "/static/jgrowl/jquery.jgrowl.js?"
2013/04/15 16:20:25 [debug] 8708#0: *1 http set discard body
2013/04/15 16:20:25 [debug] 8708#0: *1 xslt filter header
2013/04/15 16:20:25 [debug] 8708#0: *1 charset: "" > "utf-8"
2013/04/15 16:20:25 [debug] 8708#0: *1 HTTP/1.1 403 Forbidden

请检查您的Nginx错误日志 - 它们可能会揭示问题的原因。 - krak3n
请检查nginx是否以用户www-data的身份有效运行。此外,您是在实际静态文件上运行测试还是在目录本身上运行测试?另外,请发布您的nginx配置。 - pistache
你对这个被判定为不相关感到惊讶吗?@will,如果你认为它太与服务器有关了,至少可以将其移动到例如ServerFault上。我对更多的答案很感兴趣。 - hwjp
@hwjp 请随意这样做。 - Julius F
@hwjp可能无法迁移。它可能太旧了,以至于没有任何模块可以将其迁移:/ 如果真的很重要,您可以标记并询问。 - user1228
显示剩余6条评论
2个回答

8

所以你的nginx正在/root内部以www-data身份运行...这不是一个好主意。/root对普通用户不可访问(除非你chmod +x,但这是个坏主意)。

你应该将数据移到/srv/http/var/www/home/whatever之外,而不是放在/root中。


刚刚意识到了。 :) - Julius F
那么我应该把静态文件放在哪里? - Raja Simon
@Raja 如我在答案中所述:/srv/http/var/www/home/whatever... 任何你喜欢的路径都可以,只要nginx用户有读取权限即可。 - Schnouki

2
如果您的Nginx不在生产环境中,可以添加"error_log /path/to/log debug;" 然后尝试访问您的静态内容之一。您将在调试文件中看到Nginx正在尝试加载什么。这应该是有用的。请不要犹豫在此处发布其内容以帮助我们理解。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接