502 nginx не может подключиться к серверу Gunicorn - PullRequest
1 голос
/ 15 января 2020

Я так растерялся из-за того, что идет не так.

У меня есть nginx и gunicorn, работающие в отдельных docker контейнерах. Nginx работает на порту 80, перенаправляя на gunicorn на 8000. Я получаю 502 ошибки от nginx. Если я подключаюсь к порту 8000, я получаю ответ 200 от моего сервера gunicorn.

Если я снимаю nginx docker и запускаю сервер nginx на моем ноутбуке, пересылаю трафик c на порт 8000 все работает нормально. Может быть, что-то не так с настройкой сервера dockerized nginx?

docker -compose.yml

version: '3.3'
services:
  nginx:
    build: ./nginx
    ports:
      - '1337:80'
    depends_on:
      - django-api
  django-api:
    build:
      context: .
      dockerfile: Dockerfile
    command: gunicorn my_app.wsgi:application --log-level verbose --log-file=/var/log/guni --access-logfile=/var/log/gunia --bind 0.0.0.0:8000 --forwarded-allow-ips "*"
    ports:
      - '8000:8000'
    depends_on:
      - mysql
  mysql:
    image: mysql:5
    volumes:
      - type: bind
        source: ./db/docker-entrypoint-initdb.d
        target: /docker-entrypoint-initdb.d
      - type: volume
        source: mysql-data
        target: /var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: toor
    networks:
      - backend
    ports:
      - '3306:3306'
volumes:
  mysql-data:
  static_volume:
networks:
  backend:

gunicorn Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
ENV DJANGO_SETTINGS_MODULE dori.settings.dev
WORKDIR /app
COPY . /app
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt

# Port to expose
EXPOSE 8000

nginx .conf

upstream hello_django {
    server localhost:8000;
}

server {
    listen 80;
    location / {
        proxy_pass http://hello_django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

1 Ответ

3 голосов
/ 15 января 2020

Проблема в вашем nginx файле конфигурации. Вы пытаетесь переслать запрос, поступающий в контейнер nginx, в сам контейнер на порт 8000, просто измените свой файл конфигурации nginx на этот:

upstream hello_django {
    server django-api:8000;
}

server {
    listen 80;
    location / {
        proxy_pass http://hello_django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

django -api - это имя службы для вашего контейнера в сети, которую создает docker -compose, и ваша другая служба может разрешить его в локальной сети при попытке подключения к нему.

...