NGINGX выдает 502 Bad Gateway при попытке использовать NGINX + Gunicorn в Docker - PullRequest
0 голосов
/ 20 мая 2018

Я занимаюсь разработкой приложения Django с базой данных PostgreSQL и использую NGINX + Gunicorn с Docker.

PostgreSQL, NGINX и Gunicorn находятся в разных контейнерах, взаимодействующих с сетями.Я могу создать свое приложение с docker-compose build, но когда я запускаю его с docker-compose up и просматриваю мое приложение в браузере, все, что я получаю, это ошибка 502 Bad Gateway, а в терминале все, что я вижу, это:

nginx_1   | 127.0.0.1 - - [20/May/2018:01:53:01 +0000] "GET /home HTTP/1.0" 502 174 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" "172.23.0.1"
nginx_1   | 172.23.0.1 - - [20/May/2018:01:53:01 +0000] "GET /home HTTP/1.1" 502 174 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" "-"

Мой docker-compose выглядит так:

version: '3'

services:
  # Database container
  db:
    image: postgres:10
    volumes:
      - db_volume:/var/lib/postgresql/data
    env_file:
      - ./.env
    networks:
      - db_network

  # Web app container with gunicorn
  webapp:
    build: .
    env_file: ./.env

    volumes:
      - .:/opt/services/webapp/src
      - static:/opt/services/webapp/static
      - media:/opt/services/webapp/media
    networks:
      - db_network
      - nginx_network
    depends_on:
      - db

  # NGINX (Reverse proxy) container
  nginx:
    image: nginx:1.13
    ports:
      - 8000:80
    volumes:
      - ./config/nginx/conf.d:/etc/nginx/conf.d
      - static:/opt/services/webapp/static
      - media:/opt/services/webapp/media
    networks:
      - nginx_network
    depends_on:
      - webapp

networks:
  db_network:
    driver: bridge
  nginx_network:
    driver: bridge

volumes:
  db_volume:
  static:
  media:

А это мой Dockerfile:

# Start with an official Python image
FROM python:3.6

ENV PYTHONUNBUFFERED 1
RUN mkdir -p /opt/services/webapp/src
WORKDIR /opt/services/webapp/src

# Install dependencies
ADD requirements.txt /opt/services/webapp/src
RUN pip install -r requirements.txt

COPY . /opt/services/webapp/src

# Expose port 8000
EXPOSE 8000

# Default command to run when starting the container
CMD ["gunicorn", "-c", "config/gunicorn/conf.py", "--bind", ":8000", "--chdir", "myapp", "myapp.wsgi:application"]

Это мои требования. Txt:

bcrypt==3.1.4
cffi==1.11.5
Django==2.0.4
Pillow==5.1.0
psycopg2==2.7.4
psycopg2-binary==2.7.4
pycparser==2.18
pytz==2018.4
six==1.11.0
django-phonenumber-field==2.0.0
gunicorn==19.8.1
gevent==1.3.1

И моя конфигурация NGINX:

# Upstream server
upstream myapp_server {
    server webapp:8000;
}

# Main server
server {
    listen 80;
    server_name localhost;

    location /static/ {
        alias /opt/services/webapp/static/;
    }

    location /media/ {
        alias /opt/services/webapp/media/;
    }

    location / {
        proxy_pass http://myapp_server;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://127.0.0.1;
            break;
        }
    }
}

Я не уверен, что может быть причиной этой проблемы, но похоже, что gunicorn неправильно определяет мое приложение, NGINX работает и PostgreSQL, кажется, работает тоже!

1 Ответ

0 голосов
/ 20 мая 2018

Вам нужно использовать proxy_pass для вашего апстрима.

    if (!-f $request_filename) {
        proxy_pass http://myapp_server;
        break;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...