【问题标题】:Nginx and Django: How to span a location across multiple pathsNginx 和 Django:如何跨越多个路径的位置
【发布时间】:2011-12-05 01:33:06
【问题描述】:

在我的 Django 项目中,每个应用程序都有静态文件夹,app1/static/、app2/static 等。它与开发服务器一起工作正常。

但是,当我通过 fastcgi 切换到使用 Django 开发服务器 + nginx 时。有一个问题是我只能将 /static 映射到一个位置。是否可以在 Nginx 中将 app1/static/、app2/static 等映射到 url /static。

以下配置似乎不起作用。实现它的正确方法是什么?谢谢

location ^~ /static/ {
    root "app1/static/";app2/static;
    }

【问题讨论】:

    标签: django nginx


    【解决方案1】:

    你应该关注https://docs.djangoproject.com/en/dev/howto/static-files/

    它说的是您从应用文件夹中的static/ 子文件夹提供文件。在您的模板中使用{{ STATIC_URL }} 或在旧版本中使用{% get_static_prefix %}。在开发服务器下的调试模式下,Django 将直接提供应用文件夹中static 子文件夹中的文件。

    当你切换到 nginx 时,你会按照 Aviral 的建议运行 collectstatic。这会将static/ 子文件夹中的所有文件收集到STATIC_ROOT 文件夹中。为了不在一个文件夹中包含所有文件,我建议在您的应用程序中使用static/app-name 文件夹。在这种情况下,STATIC_ROOT 将填充不同的 app-name 子文件夹,并且每个应用程序的静态文件是分开的。模板必须引用 {{ STATIC_URL }}/app-name/my_static_image.jpg 之类的文件。

    你的 nginx 配置应该看起来像这样:

    location ^~ /static {
         root <your STATIC_ROOT path>;
    }
    

    【讨论】:

    • 谢谢。我以前读过那个链接。但是重新阅读您的答案对我来说更有意义。我终于明白 STATIC_ROOT 是用什么了。
    【解决方案2】:

    对不起,我对 nginx 了解不多,但我认为您不需要这样做,原因是manage.py collectstatic 命令会自动将您的所有静态文件复制到一个目录(STATIC_ROOT)中。我希望这能解决您的问题。

    【讨论】:

    • 感谢您的回答。但我想保持每个应用程序独立,有自己的静态子文件夹,因为该项目只是为了学习目的,里面的所有应用程序实际上是相互无关的。
    • 您仍然可以使用静态文件:AppDirectoriesFinder 会从每个应用程序的静态目录 (docs.djangoproject.com/en/1.3/ref/contrib/staticfiles/…) 中收集文件。
    • 是的,我正在使用的开发服务器。但是使用 Nginx 时会出现问题:无法访问 app2 的静态文件。请在问题中查看我的更新。
    • 我终于明白你建议的方式是最正确、最自然的方式了。感谢您的启发。
    【解决方案3】:

    刚刚在测试服务器上尝试过-

    test directory structure
    /home
        /username
            /static_test1
                test1.txt
                style.css
            /static_test2
                test2.txt
                style.css
    
    #nginx.conf
    server {
        server_name example.com;
    
        location / {
            root /home/username;
            try_files /static_test1$uri /static_test2$uri =404;
        }
    }
    

    如果我访问 example.com/test1.txt,我会得到 test1.txt 的内容,它也适用于 test2。但它没有任何类型的自动索引页面,如果你没有调用正确的文件,你会得到 Nginx 404。

    我不知道这是否是生产中最好的做法。

    感谢this serverfault question,我刚刚对其进行了测试以确保它可以正常工作。

    我对此的主要担忧: 具有相同名称的文件。它们是从第一个列出的目录中提取的。

    如果您在应用程序/项目之间的文件命名保持一致,这可能是一个大问题。例如,style.css 将从 static_test1 中提取

    您可能确实需要考虑托管静态文件的方式。正如其他人所提到的。从 v1.3 开始,Django 的静态文件处理正是您在一个命令中所需要的 -manage.py collectstatic。它将您的所有应用静态文件夹同步到一个集中的文件夹进行托管。

    【讨论】:

    • 您和其他人的上述回答告诉我,collectstatic 是最好的方法。虽然我只能接受一个答案,但我确实向大家学习。谢谢。
    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2014-10-17
    • 2018-02-21
    相关资源
    最近更新 更多