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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:56:03