Nginx и Django: как охватить местоположение по нескольким путям - PullRequest
1 голос
/ 11 октября 2011

В моем проекте Django у меня есть статические папки для каждого приложения: app1 / static /, app2 / static и т. Д. Он отлично работает с сервером разработки.

Однако, когда я переключаюсь на использование сервера разработки Django + nginx через fastcgi. Есть проблема, что я могу сопоставить / статический только в одном месте. Возможно ли в Nginx отобразить app1 / static /, app2 / static и т. Д. На url / static.

Следующая конфигурация не работает. Как правильно это сделать? Спасибо

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

Ответы [ 3 ]

3 голосов
/ 11 октября 2011

Вы должны следовать https://docs.djangoproject.com/en/dev/howto/static-files/.

То, что он говорит, - то, что вы обслуживаете свои файлы из подпапок static/ в ваших папках приложения. В ваших шаблонах вы используете {{ STATIC_URL }} или в более старых версиях {% get_static_prefix %}. В режиме отладки на сервере разработки Django будет напрямую обслуживать файлы из подпапок static в ваших папках приложений.

Когда вы переключаетесь на nginx, вы запускаете collectstatic, как предлагает Aviral. При этом все файлы из подпапок 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>;
}
2 голосов
/ 11 октября 2011

Извините, я не знаю много о nginx, но я не думаю, что вам нужно это делать, и причина в том, что команда manage.py collectstatic автоматически копирует все ваши статические файлы в один каталог (STATIC_ROOT) для вас.Я надеюсь, что это решит вашу проблему.

0 голосов
/ 11 октября 2011

только что попробовал это на тестовом сервере -

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.

Я не знаю, лучше ли это делать на производстве.

Кредит на этот вопрос о сервере , я только что проверил его, чтобы убедиться, что он работает.

Моя главная проблема в этом: Файлы с таким же именем. Они извлекаются из первого каталога в списке.

Если вы согласны с именами файлов в приложениях / проектах, это может быть огромной проблемой. Например, style.css будет извлечен из static_test1

Вы действительно можете подумать о том, как вы хотите разместить статические файлы. Как уже упоминали другие. Статическая обработка файлов в Django начиная с v1.3 делает именно то, что вам нужно в одной команде - manage.py collectstatic. Он синхронизирует все статические папки вашего приложения в одну централизованную папку для хостинга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...