You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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静态文件根目录的对应关系,按以下步骤修复:

  1. 修正Nginx静态文件路径
    Nginx容器挂载的是static:/static卷,静态文件实际存储在容器的/static目录,而非/app/static。修改default.conf中的静态文件配置:

    location /static/ {
        alias /static/;
    }
    
  2. 确认Django的STATIC_ROOT配置
    在Django项目的settings.py中,必须将静态文件根目录设置为与Docker卷匹配的路径:

    STATIC_ROOT = '/static'
    

    这样collectstatic命令才会把静态文件收集到/static目录,供Nginx读取。

  3. 完善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;
    }
    
  4. 重启服务验证
    修改配置后,重新构建并启动容器:

    docker-compose down
    docker-compose up --build
    

完成以上操作后,访问80/app即可正常响应。

内容的提问来源于stack exchange,提问作者Domenic Splashpixx Wolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:19:57