Nginx和Django:如何跨多个路径跨越一个位置

时间:2011-10-11 07:00:21

标签: django nginx

在我的Django项目中,我为每个应用程序提供了静态文件夹,app1 / static /,app2 / static等。它可以与开发服务器一起使用。

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

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

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

3 个答案:

答案 0 :(得分:3)

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

它说的是您从app-folders中的static/个子文件夹提供文件。在您的模板中,您使用{{ STATIC_URL }}或旧版{% get_static_prefix %}。在开发服务器下的调试模式下,Django将直接提供app-folders中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>;
}

答案 1 :(得分:2)

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

答案 2 :(得分:0)

刚在测试服务器上试过这个 -

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。它将您的所有应用程序静态文件夹同步到一个集中文件夹进行托管。