Nginx无法通过Gunicorn Docker容器转发Django URL的问题
问题描述
我正尝试通过Nginx和Gunicorn部署Django Docker应用,已完成配置。目前Django应用可在8000端口运行,Nginx在80端口运行,两者均可正常访问,但访问80/app时返回404,而8000/app可正常访问。
主Dockerfile
FROM python:3.10.6-alpine RUN pip install --upgrade pip COPY ./requirments.txt . RUN pip3 install -r requirments.txt COPY ./proto /app WORKDIR /app COPY ./entrypoint.sh / ENTRYPOINT [ "sh", "/entrypoint.sh" ]
entrypoint.sh
python manage.py migrate --no-input python manage.py collectstatic --no-input gunicorn proto.wsgi:application --bind 0.0.0.0:8000
compose.yml
version: '3.7' services: django_proto: volumes: - static:/static env_file: - .env build: context: . ports: - "8000:8000" nginx: build: ./nginx volumes: - static:/static ports: - "80:80" depends_on: - django_proto volumes: static:
Nginx配置(default.conf)
upstream django { server django_proto:8000; } server { listen 80; location /static/ { alias /app/static; } location / { proxy_set_header Host $http_host; proxy_pass http://django; proxy_redirect off; } }
Nginx Dockerfile
FROM nginx:1.19.0-alpine COPY ./default.conf /etc/nginx/conf.d/default.conf
编辑补充:通过Docker Desktop查看运行服务器上的default.conf,确认是我修改后的版本。
我已尝试调整文件夹结构、更换端口,甚至关闭防火墙,但问题仍未解决。
解决方案
问题核心在于Nginx静态文件路径配置错误,以及Django静态文件根目录的对应关系,按以下步骤修复:
修正Nginx静态文件路径
Nginx容器挂载的是static:/static卷,静态文件实际存储在容器的/static目录,而非/app/static。修改default.conf中的静态文件配置:location /static/ { alias /static/; }确认Django的
STATIC_ROOT配置
在Django项目的settings.py中,必须将静态文件根目录设置为与Docker卷匹配的路径:STATIC_ROOT = '/static'这样
collectstatic命令才会把静态文件收集到/static目录,供Nginx读取。完善Nginx请求转发头
补充必要的请求头,确保Django能正确识别代理请求,修改location /块:location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://django; proxy_redirect off; }重启服务验证
修改配置后,重新构建并启动容器:docker-compose down docker-compose up --build
完成以上操作后,访问80/app即可正常响应。
内容的提问来源于stack exchange,提问作者Domenic Splashpixx Wolf
相关产品推荐
相关产品推荐

