Ubuntu 22.04下Nginx显示默认页而非Django应用的求助
问题分析与解决方案
核心问题
当前部署混用了Docker容器化部署和宿主机原生部署两种模式,导致Nginx无法正确转发请求到Django应用,具体问题点:
- Nginx容器使用默认配置,自定义的Nginx规则未挂载到容器内
- Nginx配置中指向宿主机的Unix Socket,但Gunicorn运行在Docker容器中,容器无法访问宿主机的Socket文件
- 静态文件路径配置错误,Nginx容器内的静态文件存储在挂载的Volume路径,而非宿主机本地目录
解决方案步骤
1. 清理宿主机无关配置
停止并删除宿主机上的Gunicorn服务与Socket配置:
sudo systemctl stop gunicorn.service gunicorn.socket sudo systemctl disable gunicorn.service gunicorn.socket sudo rm /etc/systemd/system/gunicorn.*
2. 创建自定义Nginx配置文件
在项目根目录下新建nginx/conf.d目录,创建default.conf文件:
server { listen 80; server_name localhost; location = /favicon.ico { access_log off; log_not_found off; } # 静态文件服务:对应容器内静态文件路径 location /static/ { alias /cycle_proj/static/; } # 媒体文件服务 location /media/ { alias /cycle_proj/media/; } # 转发动态请求到Django容器(Docker内部服务名为web,端口8000) location / { 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_pass http://web:8000; } }
3. 更新Docker Compose配置
修改docker-compose.yml,给Nginx容器挂载自定义配置文件:
version: "3.9" services: web: build: . volumes: - .:/cycle_proj - static_volume:/cycle_proj/static - media_volume:/cycle_proj/media ports: - '8000:8000' env_file: - web.env image: cycle_proj container_name: django_cycle_api command: > bash -c "./manage.py collectstatic --noinput && ./manage.py migrate && gunicorn -b 0.0.0.0:8000 core.wsgi:application" depends_on: - db db: image: postgres:14.1-alpine restart: always env_file: - web.env ports: - '5432:5432' volumes: - db:/var/lib/postgresql/data nginx: image: nginx depends_on: - web ports: - '80:80' volumes: - static_volume:/cycle_proj/static - media_volume:/cycle_proj/media # 挂载自定义Nginx配置目录 - ./nginx/conf.d:/etc/nginx/conf.d volumes: db: driver: local static_volume: media_volume:
4. 优化Dockerfile
移除Django容器中不需要的服务依赖(数据库、Nginx等由单独容器提供):
FROM python:3.11.1 SHELL ["/bin/bash", "-c"] ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 # 修正原拼写错误 EXPOSE 8000 WORKDIR /cycle_proj RUN pip install --upgrade pip RUN mkdir -p /cycle_proj/static /cycle_proj/media # 仅保留编译Python依赖所需的库 RUN apt update && apt -qy install gcc libjpeg-dev libxslt-dev libpq-dev gettext locales \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt COPY . . CMD ["gunicorn","-b","0.0.0.0:8000","core.wsgi:application"]
5. 重新部署容器
# 停止现有容器 docker-compose down # 重新构建并启动容器 docker-compose up --build -d
6. 验证部署
访问http://localhost检查应用是否正常加载,查看容器日志确认状态:
docker-compose logs web docker-compose logs nginx
内容的提问来源于stack exchange,提问作者Mihail Bury
相关产品推荐
相关产品推荐

