Назад | Перейти на главную страницу

Как обслуживать статические файлы для нескольких проектов Django через nginx в одном домене

Я пытаюсь настроить свою конфигурацию nginx, чтобы я мог обслуживать соответствующие файлы для моих нескольких проектов Django. В конечном итоге я хочу, чтобы каждое приложение было доступно по адресу www.example.com/app1, www.example.com/app2 и т.д. Все они обслуживают статические файлы из каталога static-files, расположенного в корне их соответствующего проекта.

Структура проекта:

Home
  Ubuntu
    Web
        www.example.com
            ref
            logs
            app
                app1
                    app1
                        static
                            bower_components
                        templatetags
                    app1_project
                    templates
                    static-files

                app2
                    app2
                        static
                        templates
                        templatetags
                    app2_project
                    static-files

                app3
                    tests
                    templates
                    static-files
                    static
                    app3_project
                    app3
            venv

Когда я использую приведенную ниже conf, нет проблем с обслуживанием статических файлов для приложения, которое я указываю в / static / location. Я также могу получить доступ к различным приложениям, найденным в их местах. Однако я не могу понять, как обслуживать все статические файлы для всех приложений одновременно. Я изучал использование команды try_files для статического местоположения, но не могу понять, как узнать, работает она или нет.

Nginx Conf - обслуживает только статические файлы для одного приложения:

server {
listen 80;

server_name example.com; 
server_name www.example.com;

access_log /home/ubuntu/web/www.example.com/logs/access.log;
error_log  /home/ubuntu/web/www.example.com/logs/error.log;

root /home/ubuntu/web/www.example.com/;

location /static/ {
        alias /home/ubuntu/web/www.example.com/app/app1/static-files/; 
}


location /media/ {
        alias /home/ubuntu/web/www.example.com/media/;
    }

location /app1/ {
    include      uwsgi_params;
    uwsgi_param SCRIPT_NAME /app1;
    uwsgi_modifier1 30;
    uwsgi_pass   unix:///home/ubuntu/web/www.example.com/app1.sock;
}

location /app2/ {
    include      uwsgi_params;
    uwsgi_param SCRIPT_NAME /app2;
    uwsgi_modifier1 30;
    uwsgi_pass   unix:///home/ubuntu/web/www.example.com/app2.sock;
}

location /app3/ {
    include      uwsgi_params;
    uwsgi_param SCRIPT_NAME /app3;
    uwsgi_modifier1 30;
    uwsgi_pass   unix:///home/ubuntu/web/www.example.com/app3.sock;
}
# what to serve if upstream is not available or crashes
error_page 400 /static/400.html;
error_page 403 /static/403.html;
error_page 404 /static/404.html;
error_page 500 502 503 504 /static/500.html;

# Compression
gzip on;
gzip_http_version 1.0;
gzip_comp_level 5;
gzip_proxied any;
gzip_min_length  1100;
gzip_buffers 16 8k;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# Some version of IE 6 don't handle compression well on some mime-types, 
# so just disable for them
gzip_disable "MSIE [1-6].(?!.*SV1)";
# Set a vary header so downstream proxies don't send cached gzipped 
# content to IE6
gzip_vary on;
}

По сути, я хочу иметь что-то вроде (я знаю, что это не сработает)

location /static/ {
    alias /home/ubuntu/web/www.example.com/app/app1/static-files/; 
    alias /home/ubuntu/web/www.example.com/app/app2/static-files/; 
    alias /home/ubuntu/web/www.example.com/app/app3/static-files/; 
}

или (где он может обслуживать статические файлы на основе uri)

location /static/ {
     try_files $uri $uri/ =404;
}

Итак, если я использую try_files, как указано выше, проблема в структуре каталогов моего проекта? Или я совершенно не согласен с этим, и мне нужно поместить каждое приложение в субдомен вместо того, чтобы идти по этому пути? Спасибо за любые предложения

TL; DR: я хочу перейти по адресу:
www.example.com/APP_NAME_HERE

И пусть nginx обслуживает статическое местоположение:
/home/ubuntu/web/www.example.com/app/APP_NAME_HERE/static-files/;

Самый простой вариант - создать поддомены для каждого приложения (например, app1.example.com). Таким образом, вы можете иметь псевдоним для каталога статических файлов на каждом URL-адресе.