Как настроить приложение 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, где можно ссылаться на сервисы через их соответствующие имена.
Вернуться на верх