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

如何通过Docker与Nginx实现单端口部署多个独立Django项目

实现方案

1. 核心架构逻辑

你之前新增的监听8001的server配置无效,因为我们要实现统一入口,所有请求都走8000端口,仅需修改现有监听8000的Nginx主配置,通过路径匹配将不同前缀的请求转发到对应Django服务即可,无需暴露子项目的8001、8002端口到宿主机。

2. Nginx 配置修改

替换你原有监听8000的server配置为以下内容:

server {
    listen 8000;
    server_name localhost;

    # 根路径匹配Proj1
    location / {
        proxy_pass http://proj1:8000;
        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;
        proxy_redirect off;
    }

    # 匹配Pr2前缀的请求转发到Proj2
    location ^~ /Pr2/ {
        # 开启认证校验,所有请求先过Proj1的认证接口
        auth_request /api/check-auth;
        # 末尾斜杠必须加,作用是去掉请求路径中的/Pr2/前缀再转发,适配Proj2原有路由
        proxy_pass http://proj2:8001/;
        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;
        proxy_redirect off;
    }

    # 匹配Pr3前缀的请求转发到Proj3
    location ^~ /Pr3/ {
        auth_request /api/check-auth;
        proxy_pass http://proj3:8002/;
        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;
        proxy_redirect off;
    }

    # 内部认证接口,转发给Proj1校验登录态
    location = /api/check-auth {
        internal; # 仅允许Nginx内部调用,外部无法直接访问
        proxy_pass http://proj1:8000/api/check-auth;
        proxy_set_header Host $host;
        proxy_set_header Cookie $http_cookie;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
    }

    # 认证失败自动跳转到Proj1登录页
    error_page 401 = @error401;
    location @error401 {
        return 302 http://localhost:8000/login?next=$request_uri;
    }
}

注意:配置中的proj1、proj2、proj3对应docker-compose中三个Django服务的服务名,需和你实际配置保持一致

3. 子项目适配修改

修改Proj2、Proj3的settings.py配置,适配路径前缀:

# Proj2配置
FORCE_SCRIPT_NAME = '/Pr2'
STATIC_URL = '/Pr2/static/'

# Proj3配置
FORCE_SCRIPT_NAME = '/Pr3'
STATIC_URL = '/Pr3/static/'

4. 身份认证接口配置

在Proj1中新增校验登录态的接口,示例代码如下:

# proj1/views.py
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required

@login_required
def check_auth(request):
    # 登录态有效返回200,@login_required装饰器会自动给未登录请求返回401
    return HttpResponse(status=200)

在Proj1的urls.py中新增路由:

path('api/check-auth', check_auth, name='check_auth')

5. docker-compose 配套调整

确保三个Django服务和Nginx服务在同一个docker网络下,移除Proj2、Proj3的端口暴露配置,仅保留Nginx的8000端口映射即可。

内容的提问来源于stack exchange,提问作者Arindam Roychowdhury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:36:03