无法在 Django 中使用 nginx 服务静态文件

Posted

技术标签:

【中文标题】无法在 Django 中使用 nginx 服务静态文件【英文标题】:cannot server static files with nginx in django 【发布时间】:2017-12-04 15:42:42 【问题描述】:

我正在使用 nginx 作为 Web 服务器运行 django。配置后,我似乎总是得到 404 的静态文件。这是我的配置

base.py

STATIC_ROOT = os.path.join(PROJECT_DIR, "static")
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(PROJECT_DIR, 'static_files'),
]

nginx.conf

    upstream django 
        server unix:///tmp/mysite.sock;
    


    # configuration of the server
    server 
        listen  5000;
        server_name server localhost:5000;  address or FQDN
        charset     utf-8;
        client_max_body_size 75M;   

      location /static 
        alias /Users/del/projects/app-backend/static/; 
      

      location ~ ^/(images|javascript|js|css|flash|media|static)/  
        autoindex on;
        root /Users/del/projects/app-backend/static/; 
      

      location / 
        uwsgi_pass  django;
        include     /Users/del/perso/django/library/uwsgi;

        
    

我已经确定运行python manage.py collectstatic,文件实际上是在/static/文件夹下生成的

【问题讨论】:

你用过collectstatic吗? 是的,我做到了,而且我已经在我的问题中写了。 【参考方案1】:

你似乎猜到了 nginx 应该做什么,但不明白 alias 和 root 是如何工作的:

root 设置该位置的父目录。父目录中必须存在同名物理目录:

root    /var/www
directory     |----- /static
file                    |----- image.jpg

location /staticroot /var/www 现在将提供来自 /var/www/static 的文件。 URL http://example.com/static/image.jpg 将服务于/var/www/static/image.jpg

结构相同,但 location /salias /var/www/static 现在将提供来自 /var/www/static 的文件。 URL http://example.com/s/image.jpg 将服务于/var/www/static/image.jpg

所以你的简单配置是:

server 
    root /var/www; # Set root at server level

    location /static 
        expires max;
    

    location / 
        uwsgi_pass django;
    
 

我不知道您需要正则表达式做什么。如果您在模板中始终使用 Django 的static 标签,则无需匹配“/images”等。

最后,由于 static 在正则表达式中,并且正则表达式模式优先于字符串匹配,因此您在 URL 中对 /static/ 的所有引用都将在 app-backend/static/static 中查找。

【讨论】:

以上是关于无法在 Django 中使用 nginx 服务静态文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Docker 上使用 Nginx 和 Django 提供静态文件?

Nginx+uWSGI+Django部署方案的详细实现过程

无法在 osx 上使用 nginx + gunicorn 查看静态文件

为啥建议使用不同的服务来托管 django 的静态文件(如 nginx 或 apache)?

docker、nginx、django 以及如何提供静态文件

Nginx 无法在数字海洋上提供 django 静态或媒体文件