Как установить nginx для правильного обслуживания React и Django - PullRequest
0 голосов
/ 01 мая 2020

Я использую Linux сервер для обслуживания приложения React в качестве внешнего интерфейса и Django в качестве внутреннего.

Конфигурация gunicorn выглядит следующим образом:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=name
Group=www-data
WorkingDirectory=/var/www/backend/app
ExecStart=/var/www/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/name/backend.sock app.wsgi:application

[Install]
WantedBy=multi-user.target

И nginx config выглядит следующим образом:

server {
    listen 80;
    root /var/www/frontend/build;
    server_name example.com;

    location = /favicon.ico { access_log off; log_not_found off; }

    location / {

    }

    location /graphql {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $http_host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
        proxy_pass http://unix:/home/name/backend.sock;
    }
}

Приложение Django urls.py выглядит следующим образом:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('reports/', include('reports.urls')),
    path('graphql/', csrf_exempt(GraphQLView.as_view(graphiql=True)))
]

Если я получаю запрос на выборку www.example.com/graphql, он работает нормально.

Но если я хочу получить доступ к Django панели администратора, как указано ниже www.example.com/admin/, она не работает.

Если я правильно понимаю, location /graphql {} означает, что Django приложения запускаются на этом URL. Таким образом, если я хочу получить доступ к некоторым URL-адресам в файле urls.py, я использую www.example.com/graphql/url from urls.py

Разве это не должно быть www.example.com/graphql/graphql

Как получить доступ к панели администратора? Что я не понимаю хорошего?

1 Ответ

0 голосов
/ 01 мая 2020

Метод 1

Измените свой urls.py на этот:

from django.urls import include, path
# ... other imports ...

sub_patterns = [
    path('admin/', admin.site.urls),
    path('reports/', include('reports.urls')),
    path('graphql/', csrf_exempt(GraphQLView.as_view(graphiql=True)))
]

urlpatterns = [
    path('graphql/', include(sub_patterns)),
]

Тогда вы сможете получить доступ к странице администратора по адресу www.example.com/graphql/admin/.

Метод 2

Если я правильно понимаю, location / graphql {} означает, что на этом URL запускается Django приложений.

На самом деле нет. Давайте возьмем вымышленный URL в качестве примера: www.example.com/graphql/a/b/c/. Диспетчер URL Django увидит /graphql/a/b/c/ (а не просто /a/b/c/, как вы ожидали).

Таким образом, чтобы Django см. /a/b/c/ (при этом гарантируя, что reverse() все еще будет работать правильно вернувшись к /graphql/a/b/c/), вы можете отредактировать вашу nginx конфигурацию:

// ...
    location /graphql {
        // ...
        // Add this line:
        proxy_set_header SCRIPT_NAME /graphql;
        // ...
    }
// ...

Примечание: я никогда не использовал этот метод в работе, и могут быть некоторые сложности, поэтому я советую провести дальнейшие исследования.

...