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

