配置 nginx 以提供 django 开发静态文件

配置 nginx 以提供 django 开发静态文件

我正在使用 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

相关内容