Сконфигурировать Nginx для обслуживания внешнего интерфейса Angular, внутреннего интерфейса Django Rest Framework на том же сервере? - PullRequest
0 голосов
/ 27 мая 2019

Интерфейс моего сайта построен на Angular 7, а серверная часть построена на Django Rest Framework. Все работает через docker-compose, и я пытаюсь обслуживать весь сайт через NGINX.

Основная предпосылка моей конфигурации такова:

  • Если в запросе содержится URL с / api / или / admin /, разрешите gunicorn обработать запрос.
  • Если в качестве URL-адреса используется что-то еще, отправьте его в корневой index.html, чтобы Angular мог обрабатывать маршрутизацию.
  • Корневой URL / должен обслуживать мой предварительно скомпилированный javascript через index.html.

С помощью следующей конфигурации Nginx я могу посетить все угловые маршруты. Я могу посетить страницу администратора и мой просматриваемый API. Однако когда я захожу в / admin или API для просмотра, все статические файлы возвращают ошибку 404.

Вы видите проблему? Спасибо!

# urls.py

urlpatterns = [
    re_path(r'^favicon\.ico$', favicon_view),

    path('api/v1/', include('api.urls'), name='api'),
    path('admin/', admin.site.urls),
]



# nginx.conf

upstream my_app {
    server django:8000;
}

server {

    listen 80;

    location /staticfiles/ {
        alias /usr/src/app/staticfiles/;
    }

    location ~ (api|admin) {
        proxy_pass http://my_app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location / { 
        root /usr/src/app/staticfiles/;
        try_files $uri $uri/ /index.html;
    }

}

1 Ответ

1 голос
/ 28 мая 2019

Ваши конфиги говорят, что все доступное от /api/ или /admin/ предоставляется прокси на my_app.Таким образом, вы можете либо гарантировать, что статические файлы, используемые этими конечными точками, доступны через Django Rest Framework, либо ИЛИ сказать NGINX, чтобы они всегда сначала пробовали статические файлы, а затем вернуться к прокси my_app.

ПервыйОпция будет включать установку STATIC_ROOT, STATIC_URL, STATICFILES_STORAGE и т. д. согласно документации Django для статических файлов (ссылка идет на текущую версию разработчика).

Другая опция включает сборактивы, используемые /api/ и /admin/ в том же месте, что и ваши ресурсы Angular, и изменение конфигурации NGINX, чтобы они выглядели примерно так:

# nginx.conf

upstream my_app {
    server django:8000;
}

server {

    listen 80;

    location /staticfiles/ {
        alias /usr/src/app/staticfiles/;
    }

    location / { 
        root /usr/src/app/staticfiles/;
        try_files $uri $uri/ index.html;
        location /drf {
            proxy_pass http://my_app;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_redirect off;

        }
    }

}

В сущности, это означает, что нужно искать все в вашемКаталог Angular staticfiles, если он не найден, попробуйте найти его в приложении DRF.

...