Отказ в соединении при настройке Nginx + Gunicorn/Django REST

У меня есть установка с Nginx в качестве веб-сервера, Gunicorn в качестве сервера приложений, обслуживающего Django REST API, и все это внутри контейнера docker.

Внутри контейнера я запускаю gunicorn, используя следующую команду:

gunicorn --bind 0.0.0.0:8000 cdm_api.wsgi -t 200 --workers=3

и я могу получить доступ к API, например:

curl -d "username=<user>&password=<pass>" -X POST http://127.0.0.1:8000/api/concept

Однако, когда я запускаю то же самое извне контейнера, я получаю:

curl: (7) Failed to connect to 127.0.0.1 port 8000: Connection refused

Nginx слушает порт 80 внутри контейнера, который отображается на порт 8080 вне контейнера на localhost.

Я могу получить доступ к nginx, но похоже, что nginx не может действовать как обратный прокси и перенаправлять вызовы на 8000 (вне контейнера) на 8080 (внутри контейнера).

Вот мой файл nginx conf:

server {
    listen       80;
    listen  [::]:80;
    server_name  127.0.0.1;

    location  /api/ {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_connect_timeout 360s;
        proxy_read_timeout 360s;
    }

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

Сообщите мне, если потребуется дополнительная информация. Заранее спасибо!

Со

gunicorn создаст sock файл и вам нужно будет сопоставить ваш proxy_pass с созданным sock файлом, сейчас вы сопоставляете с вашим localhost:8000, для этого вам нужно будет выполнить команду django runserver, чтобы nginx смог найти сервер, работающий на порту 8000.

что-то вроде -

    location / {
        include proxy_params;
        #proxy_pass http://unix:/home/abc/backend/social.sock;
        proxy_pass http://unix:/home/abc/backend/backend.sock;
    }  

gunicorn позволяет обслуживать django на продакшене, вам не нужно каждый раз командовать runserver. Убедитесь, что gunicorn перезапускается каждый раз при перезагрузке сервера.

Со

gunicorn создаст sock файл и вам нужно будет сопоставить ваш proxy_pass с созданным sock файлом, сейчас вы сопоставляете с вашим localhost:8000, для этого вам нужно будет выполнить команду django runserver, чтобы nginx смог найти сервер, работающий на порту 8000.

что-то вроде -

    location / {
        include proxy_params;
        #proxy_pass http://unix:/home/abc/backend/social.sock;
        proxy_pass http://unix:/home/abc/backend/backend.sock;
    }  

gunicorn позволяет обслуживать django на продакшене, вам не нужно каждый раз командовать runserver. Убедитесь, что gunicorn перезапускается каждый раз при перезагрузке сервера.

Вернуться на верх