Docker Compose部署Django应用:Nginx未托管静态文件求助
Django+Docker Compose部署中静态文件未被Nginx托管的问题
环境与文件信息
文件夹结构
docker_insta(根目录) - insta_backend - insta_backend - manage.py - requirements.txt - Dockerfile - entrypoint.sh - nginx - default.conf - Dockerfile - docker-compose.yml
核心文件内容
docker-compose.yml
version: '3.9' services: db: image: postgres:13.3 environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres ports: - 5432:5432 volumes: - db:/var/lib/postgresql/data redis: image: redis:6.2.4 ports: - 6379:6379 django: volumes: - static:/app/static - media:/app/media build: ./insta_backend ports: - 8000:8000 depends_on: - db - redis nginx: build: ./nginx volumes: - static:/app/static - media:/app/media ports: - 80:80 depends_on: - django volumes: static: media: db:
Django Dockerfile
FROM python:3.9-alpine RUN pip install --upgrade pip COPY ./requirements.txt . RUN pip install -r requirements.txt COPY . /app WORKDIR /app ENTRYPOINT [ "sh", "entrypoint.sh" ]
entrypoint.sh
#!/bin/sh python manage.py migrate --no-input python manage.py collectstatic --no-input gunicorn insta_backend.wsgi:application --bind 0.0.0.0:8000
Nginx Dockerfile
FROM nginx:1.19.0-alpine COPY ./default.conf /etc/nginx/conf.d/default.conf
default.conf
upstream django_server { server django:8000; } server { listen 80; location /static/ { alias /app/static/; } location /media/ { alias /app/media/; } location / { proxy_pass http://django_server; } }
settings.py(相关片段)
... STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/' ...
问题现象
- 所有容器启动正常
- 访问
localhost能看到Django应用,但静态文件加载失败 - 日志显示
/static/开头的请求被转发到Django服务器,而非由Nginx直接托管 - 已确认Django与Nginx的卷挂载正常,双方都能查看静态文件夹内的文件
解决步骤
1. 确认请求路径与端口
当前django容器暴露了8000端口,若直接访问localhost:8000会绕过Nginx,必须确保访问的是localhost(80端口),让请求经过Nginx处理。
2. 检查Nginx配置的路径匹配
Nginx按顺序匹配location规则,当前配置逻辑正确,但需验证路径一致性:
- 确保
location /static/的末尾斜杠与alias /app/static/的斜杠完全对应,可尝试替换alias为root测试(注意路径拼接逻辑):location /static/ { root /app; # 实际路径为/app/static/,root会自动拼接location路径 }
3. 验证Nginx容器内静态文件存在性
进入Nginx容器,确认静态文件是否挂载到位:
docker-compose exec nginx ls /app/static
若文件不存在,检查Django容器内collectstatic是否正确生成文件:
docker-compose exec django ls /app/static
4. 排查Nginx配置语法错误
重启Nginx容器并查看日志,确认配置无语法问题:
docker-compose restart nginx docker-compose logs nginx
若日志提示配置错误,修正default.conf后重新构建容器。
5. 优化Nginx配置
添加请求头与缓存规则,确保静态文件处理逻辑更健壮:
upstream django_server { server django:8000; } server { listen 80; server_name localhost; location /static/ { alias /app/static/; expires 30d; access_log off; } location /media/ { alias /app/media/; expires 30d; access_log off; } location / { proxy_pass http://django_server; proxy_set_header Host $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; } }
6. 重新部署容器
修改配置后,重新构建并启动所有容器:
docker-compose down docker-compose build nginx docker-compose up -d
验证
访问localhost,打开浏览器开发者工具查看静态文件请求状态:
- 返回200则说明Nginx已正确托管静态文件
- 仍返回404则检查Nginx与Django日志,确认请求路径匹配情况
内容的提问来源于stack exchange,提问作者Anurag
相关产品推荐
相关产品推荐

