【问题标题】:Fetching static files failed with 404 in nginx在 nginx 中获取静态文件失败,出现 404
【发布时间】:2014-12-01 23:51:21
【问题描述】:

我现在正在 ubuntu 12 上部署一个带有 nginx 和 gunicorn 的 django 应用程序。

我配置nginx虚拟主机文件如下:

server {
    listen 80;
    server_name mydomain.com;
    access_log  /var/log/nginx/gunicorn.log;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static/ {
        root /var/www/django/ecerp/erp/static/;
    }

}

我可以很好地请求django,但是当请求静态文件时,它会以404状态响应。

我确定静态文件的根路径是正确的。

谁能帮忙?

【问题讨论】:

  • 我还要确保您的 nginx 用户有权访问该目录。祝你好运
  • @pztrick 没有权限问题。我将其更改为 777。现在返回 404 而不是 403。
  • 我自己的配置使用alias 指令而不是root。我还将静态和媒体路径放置在裸location / 之前。也许它首先路由到location /匹配?
  • @pztrick,不是订单问题,我已经解决了,应该删除多余的static/

标签: django ubuntu nginx gunicorn


【解决方案1】:

您应该使用alias 而不是rootroot 将尾随 URL 部分附加到您的本地路径(例如 http://test.ndd/trailing/part,它将添加 /trailing/part 到您的本地路径)。取而代之的是,alias 完全符合您的要求:当请求 http://test.ndd/static/ 时,/static 将准确映射到您的别名,而无需再次附加 static。

例如:

location /static {
    alias /var/www/django/ecerp/erp/static/;
}

如果文件/var/www/django/ecerp/erp/static/foo.html 存在,那么转到/static/foo.html 将返回其内容。

【讨论】:

    【解决方案2】:

    TL;DR - 你应该检查你的文件权限

    偶然发现了这个问题,我已经在使用 alias 而不是 root,所以虽然现有答案是正确的,但以下内容可能对其他人有用。

    在我的情况下,解决相同症状的方法是 static/ 中的文件以 root 为所有者。

    一个简单的chown www-data:www-data . 解决了问题,没有更多404

    【讨论】:

    • 我也用 chmod 试过这个。 nginx 对文件实际需要哪个权限?只读似乎还不够。完全访问似乎有点过头了。
    • @ST-DDT 从 Nginx 访问 root 文件不是一个好主意,无论他们可能拥有什么权限。在这里使用chown 是一个更好的选择。
    猜你喜欢
    • 2022-10-13
    • 1970-01-01
    • 2014-06-07
    • 2017-06-05
    • 2018-10-12
    • 1970-01-01
    • 2017-09-04
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多