【问题标题】:django + Nginx + Gunicorn - 404 for Static file when debug is falsedjango + Nginx + Gunicorn - 调试为假时静态文件的 404
【发布时间】:2016-11-13 08:35:55
【问题描述】:

我不知道 nginx 是如何处理静态文件的

/etc/nginx/站点可用/默认:

upstream example.com {
  server unix:/home/www/example/env/run/gunicorn.sock fail_timeout=0;
}

server {
    listen 80;
    server_name example.com;
    client_max_body_size 4G;

    access_log /home/www/example/logs/nginx-access.log;
    error_log //home/www/example/logs/nginx-error.log;

    location /static/ {
         alias /home/www/example/codeab/static/;
    }

    location /uploads/ {
        alias   /home/www/example/codeab/uploads/;
    }
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/www/example/env/run/gunicorn.sock;
    }
    # Error pages
    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /home/www/example/templates/;
    }
    error_page 404 /401.html;
    location = /401.html {
        root /home/www/example/codeab/templates/;
        internal;
    }
}

Django 设置.py

STATIC_URL = '/static/'
STATICFILES_DIRS =  (
    os.path.join(BASE_DIR, 'static_content/'),
)
STATIC_ROOT = os.path.join(BASE_DIR,'static/')

另外,我在 DEBUG = False 之前做了 collectstatic

似乎nginx没有考虑上面的配置文件,至于404页面它没有显示我自定义的401.html页面。

编辑配置后,我将其链接到启用站点

sudo ln -s /etc/site-available/default /etc/site-enabled/default
service nginx reload
sudo service nginx restart

请帮忙,或者如果我遗漏了任何东西,请告诉我。

【问题讨论】:

  • 欢迎来到 Stack Overflow!感谢您发布如此详细的问题描述,这对您有很大帮助。在我们深入了解您的问题的要点之前,请先做几件事。如果 NGINX 没有看到配置文件,它如何为您的静态文件返回 404?你最后说的链接是正确的,但是如果它使用include /etc/site-enabled/*;或include /etc/site-enabled/*.conf;,你需要签入nginx.conf如果它是*.conf,你需要将default重命名为@987654329 @。另外,你的site-enabled和site-available坐在/etc/有点奇怪
  • 这不是标准安装。对于您的自定义 4xx 模板:如果 NGINX 提供此服务,则它需要是静态 HTML 文件。它不能有任何模板标签,因为它没有被 Django 处理。我的建议是为此使用 Django 的内部错误模板。最后,关于你的静态文件,配置是正确的。我唯一要更改的是location ^~ /static/ {,以便 NGINX 知道它必须进行正则表达式匹配而不是直接字符串比较。
  • 嗨 Keenan,感谢您的快速回复。我检查了我的 nginx.conf,它是 include /etc/site-enabled/*;,所以文件名是正确的,即 default
  • 我也尝试了location ^~ /static/ {,但仍然 nginx 不提供静态文件。
  • 奇怪。运行python manage.py collectstatic 时的输出是什么?即它收集到哪个目录?

标签: django nginx gunicorn


【解决方案1】:

我不知道确切的解决方案,但它开始着手将我的 gunicorn 绑定从 xxx.xxx.xx.xx:80 更改为 xxx.xx.xx.xx:8000 并将配置编辑为 -

location / {
        include proxy_params;
        #proxy_pass http://unix:/home/www/example/env/run/gunicorn.sock;
        proxy_pass http://xxx.xxx.xx.xx:8000;
    }

我注释了 sock 文件的 proxy_pass 并添加了新行,如上所示。

【讨论】:

    【解决方案2】:

    Nginx 从 location /static/ 下的 nginx 配置文件中定义的目录提供静态文件,并在定义的目录中找不到此类静态资源时重定向到您在 nginx 配置中定义的自定义 404 html 页面。

    如果您在 settings.py 中设置 Debug = False 并将 'TEMPLATES'-'DIRS' 设置指向包含您的自定义 404 html 文件,如 Django documentation 中所述。

    因此,有效地 nginx 和 Django 显示相同 404 html 页面的方式是不同的并且彼此独立。

    【讨论】:

      【解决方案3】:

      只需更改 nginx 服务器块中的配置

      location /static/ {
               alias /home/www/example/codeab/static/;
          }
      

      到

      location /static/ {
               alias /home/www/example/codeab/static_content/;
          }
      

      原因,在命令python manage.py collectstatic 执行后 静态文件被放置在 static_content 文件夹中。

      【讨论】:

      • 试过了,还是不行。执行 collectstatic 后,所有来自 static_content 的文件都已放置到 static 文件夹中。这就是你投反对票的原因。
      • 你找到解决办法了吗
      猜你喜欢
      • 2015-11-30
      • 2021-08-08
      • 2021-05-27
      • 2017-10-27
      • 2014-06-07
      • 2013-08-12
      • 2017-06-05
      • 2012-11-20
      • 1970-01-01
      相关资源
      最近更新 更多