Как настроить приложение Django, развернутое с помощью Gunicorn, с фронтальным сервером NGINX, через docker compose?
Мне трудно понять ошибку в следующей установке, которая пытается обслуживать сервер приложений django-gunicorn с помощью nginx. (Я пока не концентрируюсь на статических активах)
Докер составляет файл
# Mentioning which format of dockerfile
version: "3.9"
# services or nicknamed the container
services:
# web service for the web
web:
build: .
# Add additional commands for webpack to 'watch for changes and bundle it to production'
command: gunicorn --bind unix:/run_socket/gunicorn.sock StockWhiz.wsgi:application
# Below command for using gunicorn to serve.
volumes:
- type: bind
source: ./stockwhiz-web
target: /code
- type: bind
source: ./run_socket
target: /run_socket
depends_on:
- db
environment:
- "DJANGO_SETTINGS_MODULE=StockWhiz.settings.local"
db:
image: postgres:14-bullseye
#
volumes:
- postgres_data:/var/lib/postgresql/data/
# unsure of what this environment means.
environment:
- "POSTGRES_HOST_AUTH_METHOD=trust"
nginx:
image: nginx:stable
restart: always
volumes:
- ./run_socket:/run_socket
- ./config/nginx/:/etc/nginx/conf.d/
ports:
- "80:80"
depends_on:
- web
# Volumes set up
volumes:
postgres_data:
NGINX config
# Note in our docker compose it's typically located at etc/nginx/conf.d/
# Which are automatically copied on to the nginx.conf file at etc/nginx
upstream gunicorn_application {
server unix:/run_socket/gunicorn.sock;
}
server{
listen 80;
server_name www.stockwhiz.in;
error_log stderr warn;
access_log /dev/stdout main;
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass gunicorn_application;
}
}
Logs
Ниже приведены некоторые журналы из docker compose. У меня также есть 502, ошибка шлюза на http://localhost
stockwhizfullfiles-web-1 | [2022-12-09 06:05:27 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:63)
stockwhizfullfiles-nginx-1 | 2022/12/09 06:05:27 [error] 38#38: *25 upstream prematurely closed connection while reading response header from upstream, client: 172.25.0.1, server: www.stockwhiz.in, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/run_socket/gunicorn.sock:", host: "localhost"
stockwhizfullfiles-nginx-1 | 172.25.0.1 - - [09/Dec/2022:06:05:27 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.42" "-"
stockwhizfullfiles-web-1 | [2022-12-09 06:05:27 +0000] [63] [INFO] Worker exiting (pid: 63)
stockwhizfullfiles-web-1 | [2022-12-09 06:05:27 +0000] [64] [INFO] Booting worker with pid: 64
stockwhizfullfiles-nginx-1 | 2022/12/09 06:05:58 [error] 38#38: *25 upstream prematurely closed connection while reading response header from upstream, client: 172.25.0.1, server: www.stockwhiz.in, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://unix:/run_socket/gunicorn.sock:", host: "localhost", referrer: "http://localhost/"
stockwhizfullfiles-web-1 | [2022-12-09 06:05:58 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:64)
stockwhizfullfiles-nginx-1 | 172.25.0.1 - - [09/Dec/2022:06:05:58 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.42" "-"
stockwhizfullfiles-web-1 | [2022-12-09 06:05:58 +0000] [64] [INFO] Worker exiting (pid: 64)
stockwhizfullfiles-web-1 | [2022-12-09 06:05:58 +0000] [79] [INFO] Booting worker with pid: 79
У меня было довольно много проблем на моей стороне:
Проблемы;
- Edge, Firefox и Chrome были перенаправлены на протокол
https://
благодаря небрежности в настройках и кэше. - Несчастная ссылка на неправильный файл настроек во время одного из испытаний вызвала кэширование в браузерах.
- Недостаточное понимание конфигурации Nginx .
Я справился с вышеуказанными проблемами, перезапустившись с командами по умолчанию runserver
и решив их в соответствующих местах.
Я также достаточно внимательно прочитал документацию по Nginx и книгу ниже, которая помогла мне понять расположение конфигурации Nginx.
HTTP-сервер Nginx: используйте Nginx для своих веб-приложений, чтобы максимально эффективно использовать инфраструктуру и обслуживать страницы быстрее, чем когда-либо
.
Обслуживание сайта
Первоначально я пытался обслуживать сайт через sock-файл. Я наткнулся на это руководство (также упомянутое @AjayK), которое делает это с помощью простого прокси-сервера в Nginx.
Таким образом, изменение конфигурационного файла nginx, как показано ниже, при открытии 8000
порта на сервисе web
поможет обслуживать приложение.
upstream gunicorn_app{
server web:8000;
}
server{
listen 80;
server_name localhost ;
error_log stderr warn;
access_log /dev/stdout main;
location / {
proxy_pass http://gunicorn_app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
Примечание:
- Приложение compose application включает в себя сеть DNS, где можно ссылаться на сервисы через их соответствующие имена.