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

如何在Docker中通过Nginx和Gunicorn运行多Django项目(双端口服务)

在Docker环境下用Nginx+Gunicorn部署多个Django服务(双端口示例)

我们要实现两个不同端口的Django服务通过Nginx反向代理对外提供服务,以下是具体配置步骤:

1. 调整Nginx配置

保留原有的Nginx目录结构:

nginx
├── Dockerfile
└── nginx.conf

Dockerfile(无需修改)

该文件负责替换默认Nginx配置,直接沿用即可:

FROM nginx:1.21-alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d

修改nginx.conf配置

需要添加两个upstream块分别对应两个Django服务,可通过两种方式区分转发:

方案一:同端口不同路径区分

通过访问不同路径映射到对应服务:

# 第一个Django服务上游配置
upstream django_service1 {
    server web1:8000;
}

# 第二个Django服务上游配置
upstream django_service2 {
    server web2:8001;
}

server {
    listen 80;

    # 访问 /service1/* 转发到第一个服务
    location /service1/ {
        proxy_pass http://django_service1/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    # 访问 /service2/* 转发到第二个服务
    location /service2/ {
        proxy_pass http://django_service2/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

方案二:不同端口区分

用不同监听端口对应不同服务:

upstream django_service1 {
    server web1:8000;
}

upstream django_service2 {
    server web2:8001;
}

# 第一个服务监听80端口
server {
    listen 80;

    location / {
        proxy_pass http://django_service1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

# 第二个服务监听81端口
server {
    listen 81;

    location / {
        proxy_pass http://django_service2;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

2. 修改docker-compose.prod.yml配置

添加两个web服务对应不同Django项目,仅暴露端口给Docker内部网络:

version: '3.8'

services:
  # 第一个Django服务
  web1:
    build:
      context: ./app1  # 第一个Django项目所在目录
      dockerfile: Dockerfile.prod
    command: gunicorn django_project1.wsgi:application --bind 0.0.0.0:8000
    expose:
      - 8000
    env_file:
      - ./.env.prod1  # 第一个项目的环境变量文件
    depends_on:
      - db1  # 对应第一个服务的数据库,共享数据库则改为同一个db

  # 第二个Django服务
  web2:
    build:
      context: ./app2  # 第二个Django项目所在目录
      dockerfile: Dockerfile.prod
    command: gunicorn django_project2.wsgi:application --bind 0.0.0.0:8001
    expose:
      - 8001
    env_file:
      - ./.env.prod2  # 第二个项目的环境变量文件
    depends_on:
      - db2  # 同理,根据数据库配置调整

  # Nginx服务
  nginx:
    build: ./nginx
    ports:
      - "80:80"
      - "81:81"  # 若用方案二,需映射此端口
    depends_on:
      - web1
      - web2

  # 数据库服务示例(可共享或独立)
  db1:
    image: postgres:13
    volumes:
      - postgres_data1:/var/lib/postgresql/data/
    env_file:
      - ./.env.prod.db1

  db2:
    image: postgres:13
    volumes:
      - postgres_data2:/var/lib/postgresql/data/
    env_file:
      - ./.env.prod.db2

volumes:
  postgres_data1:
  postgres_data2:

3. 注意事项

  • 两个Django项目的Dockerfile.prod可保持一致,只需确保Gunicorn命令中的WSGI路径正确。
  • 若共享数据库,仅需配置一个db服务,两个web服务的depends_on均指向该服务。
  • 环境变量文件需分别配置,避免数据库连接等参数冲突。

内容的提问来源于stack exchange,提问作者Practical Bong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:42:50