Отказ в соединении при настройке 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 перезапускается каждый раз при перезагрузке сервера.