nginx 仅在端口 80 上提供文件
nginx serves files only on port 80
我有 dockerizd django 应用程序与 gunicorn 和 nginx。该应用程序本身在 http://127.0.0.1:8000 上运行但没有 static/media 个文件,错误:
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 上的文件,它们会正常运行。
Docker 文件:
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
可能有问题,但我想不通。
有什么想法吗?
这似乎是罪魁祸首:proxy_pass http://127.0.0.1:8000;
此行使 Nginx 在 Nginx 容器 内的端口 8000
上寻找服务。容器内的 localhost
/ 127.0.0.1
始终表示 "the container itself" 而 不是 Docker 主机。
您 运行 两个服务都在同一个 Docker 网络中,所以这应该适合您:
proxy_pass http://web:8000;
我看到你是 运行 两个容器,nginx 无法连接到 python 容器,因为你提供的 IP 地址绑定到容器内部。您可能需要将 extra_hosts: in docker-compose 添加到 nginx 部分,以便能够连接到其他容器。
如果您在 nginx 中设置了良好的日志记录,您会发现它不是 运行 在 127.0.0.1 上,因为它是一个组合服务。所以你需要检查你的 compose 网络在哪个 IP 上运行,那是你找到 nginx 的地方。
我有 dockerizd django 应用程序与 gunicorn 和 nginx。该应用程序本身在 http://127.0.0.1:8000 上运行但没有 static/media 个文件,错误:
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 上的文件,它们会正常运行。
Docker 文件:
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
可能有问题,但我想不通。
有什么想法吗?
这似乎是罪魁祸首:proxy_pass http://127.0.0.1:8000;
此行使 Nginx 在 Nginx 容器 内的端口 8000
上寻找服务。容器内的 localhost
/ 127.0.0.1
始终表示 "the container itself" 而 不是 Docker 主机。
您 运行 两个服务都在同一个 Docker 网络中,所以这应该适合您:
proxy_pass http://web:8000;
我看到你是 运行 两个容器,nginx 无法连接到 python 容器,因为你提供的 IP 地址绑定到容器内部。您可能需要将 extra_hosts: in docker-compose 添加到 nginx 部分,以便能够连接到其他容器。
如果您在 nginx 中设置了良好的日志记录,您会发现它不是 运行 在 127.0.0.1 上,因为它是一个组合服务。所以你需要检查你的 compose 网络在哪个 IP 上运行,那是你找到 nginx 的地方。