我正在使用 Nginx 在 django 开发服务器上提供静态文件。但是我无法让它工作。服务器运行良好,但 nginx 无法找到静态文件。
这是我在 nginx.conf 中的设置:
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
alias /path/Documents/python_projects/to_pm/static/;
access_log off;
expires 30d;
}
我的项目设置.py:
STATIC_URL = '/static/'
# for production
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
我还习惯python manage.py collectstatics
将所有静态文件复制到/path/Documents/python_projects/to_pm/static/
文件夹中。
但是当我使用http://localhost:8080
该网站时,它看起来非常丑陋,显然静态文件不是由 nginx 提供的。我该如何解决这个问题?
我的错误日志说
13:静态文件的权限被拒绝
我检查了用户,发现 nginx 以 root 身份作为主进程运行,nobody 则作为工作进程运行。我无法将用户更改root
为默认用户,因为如果我更改用户,就会出现此错误:
[emerg] getgrnam("root") failed in /usr/local/etc/nginx/nginx.conf:2
答案1
我找到了我的问题的答案:
答案就在本文中:
https://gist.github.com/jhjguxin/6208474
正如它所指出的:
Nginx needs to have read permission of the files that should be served AND
have execute permission in each of the parent directories along the path from
the root to the served files.
静态文件夹也需要由您的 nginx 用户拥有。
答案2
我遇到过类似的问题。原来是 SELinux 的问题,在更新后才出现。
*如果您的静态文件位于用户主文件夹下方,则此解决方案适用
查看 /var/log/nginx/-error.log 中的 nginx 日志,我发现 nginx 进程在尝试打开静态文件时被拒绝访问。
之后,我查看了审计日志 (/var/log/audit/audit.log)。这个文件包含有关正在发生的事情的所有信息,但很难阅读。
但有一个很好的工具叫做 audit2why (yum 安装 policycoreutils-python)
所以如果你尝试这个:grep1433926027.242:416/var/log/audit/audit.log | audit2why
我在 audit.log 文件的末尾找到了这个数字 1433926027.242
运行时,它显示了解决方案。只需使用 setsebool 设置一个标志:
setsebool -P httpd_read_user_content 1
之后,我的 nginx 就可以毫无问题地打开静态文件了。*
希望能帮助到你!
答案3
如果你使用的是 CentOS,你可以执行以下操作:
# This allows to use semanage - SELinux Policy Management tool
sudo yum install -y policycoreutils-python
sudo chown -R $USER:$USER /home/path/Documents/python_projects/to_pm/static
sudo usermod -a -G $USER nginx
sudo chmod 755 -R /home
sudo semanage fcontext -a -t httpd_sys_content_t /home/path/Documents/python_projects/to_pm/static(/.*)?"
sudo restorecon -R -v /home/path/Documents/python_projects/to_pm/static
sudo systemctl restart nginx