Django + Nginx на Docker неправильный запрос (400) - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь заставить django (на gunicorn) и nginx работать с докером. К сожалению, я продолжаю получать ошибку Bad Request (400) после запуска docker-compose up -d --build. Помощь.

Я пытался изменить каталоги, имена каталогов, тома, сети и открытые порты, но безрезультатно. Я также попытался добавить и удалить server_name в моем файле nginx.conf.

В settings.py У меня есть:

DEBUG = False

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

Это мой docker-compose.yml файл:

version: '3.3'

services:
  web:
    build: ./app
    command: gunicorn my_server.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - ./app/:/usr/src/app/
    expose:
      - 8000
    environment:
      - DATABASE=${DATABASE}
      - SECRET_KEY=${SECRET}
      - SQL_DATABASE=${POSTGRES_USER}
      - SQL_ENGINE=django.db.backends.postgresql
      - SQL_HOST=${POSTGRES_HOST}
      - SQL_PASSWORD=${POSTGRES_PASSWORD}
      - SQL_PORT=${POSTGRES_PORT}
      - SQL_USER=${POSTGRES_USER}
      - SU_NAME=${SU_NAME}
      - SU_EMAIL=${SU_EMAIL}
      - SU_PASSWORD=${SU_PASSWORD}
    depends_on:
      - db
    logging:
      driver: "json-file"
      options:
        max-size: "100k"
        max-file: "20"

  db:
    image: postgres:11.2-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_USER=${POSTGRES_USER}
    logging:
      driver: "json-file"
      options:
        max-size: "100k"
        max-file: "20"

  nginx:
    build: ./nginx
    restart: unless-stopped
    volumes:
      - static_volume:/usr/src/app/assets
    ports:
      - 80:80
    depends_on:
      - web
    logging:
      driver: "json-file"
      options:
        max-size: "100k"
        max-file: "20"

volumes:
  static_volume:
  postgres_data:
    external: true

а это мой nginx.conf файл:

upstream my_server {
    server web:8000;
}

server {

    listen 80;

    location / {
        proxy_pass          http://my_server;
        proxy_set_header    Host                $http_host;
        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_redirect off;
    }

    location /assets/ {
        alias /usr/src/app/assets;
    }

    location  /robots.txt {
        alias  /var/www/html/robots.txt;
    }
}

В моем Dockerfile для django я запускаю makemigrations и migrate, и я подтвердил, что таблицы базы данных созданы.

Я ожидаю перейти на localhost или 127.0.0.1 и посмотреть, как там работает мой веб-сайт. Вместо этого я получаю эту ошибку: Bad Request (400).

Когда я бегу docker ps, я получаю:

CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                NAMES
2dbc6ff7be78        my_server_nginx        "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        0.0.0.0:80->80/tcp   my_server_nginx_1
a6173e017c93        my_server_web          "/usr/src/app/entryp…"   4 minutes ago       Up 4 minutes        8000/tcp             my_server_web_1
918e7bdae298        postgres:11.2-alpine   "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        5432/tcp             my_server_db_1

Когда я запускаю docker logs my_server_nginx_1, я получаю такие строки:

172.18.0.1 - - [08/May/2019:22:25:07 +0000] "GET / HTTP/1.1" 400 37 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" "-"
172.18.0.1 - - [08/May/2019:22:25:07 +0000] "GET /favicon.ico HTTP/1.1" 400 37 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" "-"

Ответы [ 3 ]

0 голосов
/ 09 мая 2019
Create socket file using gunicorn and configure in our virtual host.
#############Gunicorn configuration###################

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

[Service]
User=root
Group=nginx
WorkingDirectory=/var/www/html/source
 ExecStart=/var/www/html/env_source/bin/gunicorn --workers 3 --bind 
unix:/var/www/html/source/source.sock application_name.wsgi:application
[Install]
WantedBy=multi-user.target

Будет создано имя файла source.sock, просто настройте этот файл sock на виртуальном хосте nginx

########### nginx Configuratio
    server {
    server_name example.com;
    listen 80;
    access_log /var/www/html//source/access.log;
    error_log /var/www/html/source/error.log;
    include /etc/nginx/default.d/*.conf;

    location /static/ {
            root /var/www/html/source/run;
    }


    location / {
            proxy_pass http://unix:/var/www/html/source/source.sock;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $host;
       }
  }
0 голосов
/ 10 мая 2019

Пытаясь реализовать решение upinder kumar, я наткнулся на это решение.Я добавлю сюда для всех, кто столкнется с этой проблемой в будущем:

nginx.conf не может иметь как

proxy_set_header    Host                $http_host;

, так и

proxy_set_header    Host                $host;

Удаление любой решеннойпроблема.

0 голосов
/ 09 мая 2019

Вероятно, вам нужно добавить my_server к разрешенным хостам (так же, как ваш апстрим в конфигурации NGINX):

ALLOWED_HOSTS = ['my_server']
...