nginx обслуживает файлы только через порт 80 - PullRequest
0 голосов
/ 08 мая 2019

У меня есть приложение dockerizd django с gunicorn и nginx.Само приложение работает на http://127.0.0.1:8000, но без статических / мультимедийных файлов, ошибка:

172.24.0.1 - - [08/May/2019:13:25:50 +0000] "GET /static/js/master.js HTTP/1.1" 404 77 "http://127.0.0.1:8000/"

Если я пытаюсь получить доступ к файлам через порт 80, они обслуживаются очень хорошо.

Dockerfile:

FROM python:3.6-alpine

RUN apk --update add \
    build-base \
    postgresql \
    postgresql-dev \
    libpq \
    # pillow dependencies
    jpeg-dev \
    zlib-dev

RUN mkdir /www
WORKDIR /www
COPY requirements.txt /www/
RUN pip install -r requirements.txt

ENV PYTHONUNBUFFERED 1

COPY . /www/

docker-compose.yml

version: "3"
services:
  web:
    build: .
    restart: on-failure
    volumes:
      - .:/www
    env_file:
      - ./.env
    command: >
      sh -c "python manage.py collectstatic --noinput &&
      gunicorn --bind 0.0.0.0:8000 portfolio.wsgi:application --access-logfile '-'"
    expose:
      - "8000"
    ports:
      - "8000:8000"
  nginx:
    image: "nginx"
    restart: always
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./static:/var/www/portfolio/static
      - ./media:/var/www/portfolio/media
    links:
      - web
    ports:
      - "80:80"

nginx.conf

server {
  listen 80;
  server_name 127.0.0.1;

  # serve static files
  location /static/ {
    root /var/www/portfolio;
  }

  # serve media files
  location /media/ {
    root /var/www/portfolio;
  }

  # pass requests for dynamic content to gunicorn
  location / {
    pproxy_pass http://web:8000;
    proxy_set_header Host $server_name;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

То, что я хочу, является статическим имультимедийные файлы для загрузки с моим веб-приложением на 127.0.0.1.Мне кажется, что может быть проблема с proxy_pass, но я не могу понять это.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 08 мая 2019

Кажется, это виновник: proxy_pass http://127.0.0.1:8000;

Эта строка заставляет Nginx искать сервис в порту 8000 внутри контейнера Nginx .localhost / 127.0.0.1 внутри контейнера всегда означает «сам контейнер», а не хост Docker.

Вы запускаете обе службы в одной и той же сети Docker, поэтому это должно работатьдля вас:

proxy_pass http://web:8000;

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

Если вы установите хорошую регистрацию в nginx, вы поймете, что он не работает на 127.0.0.1, так как это сервис compose.Поэтому вам нужно проверить, по какому IP работает ваша композитная сеть, и именно там вы найдете nginx.

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

Я вижу, что вы запускаете два контейнера, и nginx не может подключиться к контейнеру Python, поскольку указанный вами IP-адрес связан внутри контейнера. вам может понадобиться добавить extra_hosts: в docker-compose к части nginx, в которой он сможет подключаться к другому контейнеру.

...