如何在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
相关产品推荐
相关产品推荐

