Django结合Docker、Nginx、PostgreSQL部署时静态文件访问异常问题求解
静态资源加载异常修复方案
核心问题定位
- 直接访问
127.0.0.1:8000的方式完全绕开Nginx的静态资源转发规则。8000是gunicorn监听的Django服务端口,gunicorn本身不处理静态文件请求——DEBUG=True模式下自动返回静态文件是Django自带runserver的逻辑,gunicorn部署时该逻辑不会触发。正确的外部访问入口是Nginx监听的80端口,即http://127.0.0.1/admin,不需要加8000端口。 - Nginx媒体资源规则配置错误:当前
default.conf中location /media/的alias指向/backend/static,与静态文件路径重复,无法读取媒体文件。 - Nginx容器挂载路径与配置不匹配:docker-compose中Nginx服务的静态目录挂载为
./backend/languages/static:/static,但Nginx配置中静态文件alias写的是/backend/static,路径无法对应;同时媒体目录未做任何映射,Nginx容器内完全读取不到媒体文件。 - backend服务的build路径配置错误:docker-compose中backend服务的build路径写为
./backend/languages,但实际Dockerfile位于./backend目录下,build上下文不匹配。
配置修改步骤
1. 修正Nginx核心配置
替换nginx/default.conf内容,对齐挂载路径,修正媒体路径错误:
upstream django { server backend:8000; } server { listen 80; location / { proxy_pass http://django; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static/ { alias /static/; autoindex off; } location /media/ { alias /media/; autoindex off; } }
2. 修正docker-compose编排配置
调整build路径、目录挂载规则,确保Nginx容器能正确读取静态、媒体文件:
version: "3.7" services: backend: build: ./backend stdin_open: true tty: true restart: "on-failure" env_file: .env volumes: - ./backend/languages:/backend - ./backend/languages/static:/backend/static - ./backend/languages/media:/backend/media ports: - 8000:8000 networks: - nginx_network - db_network depends_on: - db db: image: postgres:11 restart: "on-failure" environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres volumes: - postgres_data:/var/lib/postgresql/data/ networks: - db_network nginx: build: ./nginx restart: always volumes: - ./backend/languages/static:/static - ./backend/languages/media:/media ports: - 80:80 networks: - nginx_network depends_on: - backend networks: nginx_network: driver: bridge db_network: driver: bridge volumes: postgres_data:
3. 重启服务
执行重新构建命令生效配置:docker-compose down && docker-compose up --build -d
启动完成后直接访问http://127.0.0.1/admin,静态资源即可正常加载。
补充注意事项
- alias路径末尾的斜杠不可省略,否则会出现路径拼接错误(比如请求
/static/admin/css/base.css会被错误映射为/staticadmin/css/base.css,触发404)。 - 后续生产环境部署时,需要将
DEBUG改为False,同时将ALLOWED_HOSTS配置为实际访问域名,不要使用通配符*,此时静态、媒体请求将完全由Nginx处理,上述配置已适配该场景。
内容的提问来源于stack exchange,提问作者cu__007
相关产品推荐
相关产品推荐

