nginx仅在端口80上提供文件

时间:2019-05-08 13:42:03

标签: docker nginx docker-compose gunicorn

我有带有gunicorn和nginx的dockerizd django应用程序。该应用程序本身可以在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上的Web应用程序中加载。在我看来proxy_pass可能有问题,但我想不出来。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这似乎是罪魁祸首:proxy_pass http://127.0.0.1:8000;

此行使Nginx在Nginx容器内部的端口8000 上寻找服务。容器内的localhost / 127.0.0.1始终表示“容器本身”,而不是Docker主机。

您正在同一Docker网络中运行这两种服务,因此这应该对您有用:

proxy_pass http://web:8000;

答案 1 :(得分:0)

我看到您正在运行两个容器,并且nginx无法连接到python容器,因为您提供的IP地址已绑定到容器内部。您可能需要在docker-compose中将extra_hosts添加到nginx部分,使其可以连接到其他容器。

答案 2 :(得分:0)

如果在nginx中设置了不错的日志记录,您将意识到它不是在127.0.0.1上运行,因为它是一个组合服务。因此,您需要检查您的撰写网络在哪个IP上运行以及在哪里找到nginx。