Django多个app配置多个域名访问

环境:Python 3.8.1 + Django 2.2.12

项目目录结构:

复制代码
CellMiddle  -- 项目根目录
├─task --- 需求系统
│  ├─migrations
│  ├─static
│  └─templates
├─logs --- 日志目录
├─doc --- 文档系统
│  ├─data
│  ├─migrations
│  ├─static
│  └─templates
├─sso --- 单点登录,权限控制系统
│  ├─migrations
│  ├─static
│  └─templates
├─upload ---文件资源上传目录
├─static --- 静态资源
├─templates --- 公共模板
└─CellMiddle --- 项目主目录
│    ├─config --- 公共配置
│    ├─helper --- 公共辅助类,ex:时间,日期,字符串,响应等
│    └─loader --- 第三方库的实例化加载,ex:Redis,Memcached等
│    │  settings.py
│    │  urls.py
│    │  wsgi.py
│    │  __init__.py
├─manage.py
└─envConf  -- 部署配置文件:requirement.txt, host.conf, supervisor, gunicorn 等

使用 nginx + gunicorn + supervisor 部署,使用域名 cell.hao456.com 解析指向服务器, nginx 监听 gunicorn 绑定的端口,可以正常访问:

http://cell.hao456.com/task

http://cell.hao456.com/doc

http://cell.hao456.com/sso

虽然同一个域名路由控制来访问,也是可以的。但还是想像PHP一样只要独立入口文件,每个app独立使用不同子域名,如:

复制代码
http://task.hao456.com 指向task
http://doc.hao456.com  指向doc
http://sso.hao456.com  指向sso

尝试了几种办法:

nginx 层转发;

修改proxy指向,location 要加app,static 等。

每个app独立一个 wsgi.py 文件,使用gunicorn单独起服务;

增加 task_wsgi.py, doc_wsgi.py, sso_wsgi.py,使用 supervisor起三个gunicorn服务。

使用django-hosts;

添加MIDDLEWARE中间件,实现host与urls的namespace关联。nginx的conf配置不用改动,只需要将 所有子域名的监听,一起代理指向gunicorn端口

复制代码
$ cat hosts.conf
server {
    listen 80;
    server_name task.hao456.com doc.hao456.com sso.hao456.com;
    location / {
        proxy_pass http://127.0.0.1:10888;
        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_read_timeout 120s;
    }
    ... ...
}
django-hosts实现:
  1. pip 安装 django-hosts, 这里用到的是 4.0版本:

    复制代码
     $ pip install django-hosts==4.0  # root权限
  2. 修改settings.py:

    • 将django-hosts添加到app:

      INSTALLED_APPS = [
      ...
      'django_hosts',
      'sso',
      'doc',
      'task',
      ]

  • 添加Django的hosts配置:

    复制代码
      ROOT_HOSTCONF = 'CellMiddle.hosts'  # host配置
      DEFAULT_HOST = 'sso'  # 默认的域名
    • 将django_hosts添加到中间件MIDDLEWARE:

      MIDDLEWARE = [
      'django_hosts.middleware.HostsRequestMiddleware', # 首要加
      ...
      'django_hosts.middleware.HostsRequestMiddleware', # 尾要加
      ]

  1. 在项目主目录下settings.py同级,添加 hosts.py(注意和 settings 里面配置的ROOT_HOSTCONF一致):

    ...
    └─CellMiddle
    │ hosts.py --- 新增文件
    │ settings.py
    │ urls.py
    │ wsgi.py
    │ init.py

内容为:

复制代码
# coding=utf8
    """
    django-hosts
    """
    from django.conf import settings
    from django_hosts import patterns, host
 
    host_patterns = patterns(
        '',
        host('sso', settings.ROOT_URLCONF, name='sso'),
        host('doc', 'doc.urls', name='doc'),
        host('task', 'task.urls', name='task'),
    )
  1. 路由配置urls.py,添加路由对应的appname(app名称), namespace(域名):

    复制代码
     urlpatterns = [
         path('admin/', admin.site.urls),
         path('', include(('sso.urls', 'sso'), namespace='sso')),  # 默认sso
         path('doc', include(('doc.urls', 'doc'), namespace='doc')),  # 文档
         path('task', include(('task.urls', 'task'), namespace='task')),  # 需求
     ]
  2. reload 重载服务:

  • DNS 确认子域名的解析;

  • 检查nginx的配置有效性,重载nginx;

  • 动态更新Web服务 或 在 supervisorctl重启Web服务;

    kill -HUP PID # root权限 supervisorctl restart program_name服务名 # root权限

  1. 检查子域名的访问,app对应的路由,静态资源访问等是否正常;
相关推荐
2601_965619692 分钟前
AI视频制作:财经数据可视化视频怎么做:AI 自动生成图表动画的实操流程
人工智能·nginx·音视频
Generalzy14 分钟前
Qt 桌面开发入门:PySide6 学习路线、架构原理与技术选型
笔记·python·学习
Mr.D学长15 分钟前
毕业设计项目 基于机器视觉的车牌识别系统
python·毕业设计·毕设
2601_9656196929 分钟前
历史解说视频怎么做:青铜器瓷器文物画面自动对齐的完整教程
运维·nginx·音视频
云和数据.ChenGuang31 分钟前
AI 工程师相关就业岗位(细分,偏工程落地,由底层到上层)
服务器·开发语言·人工智能·python
Web3&Basketball41 分钟前
litellm 做 Agent 成本监控:3 个账单维度实战
python·大模型·agent·可观测性·litellm·成本控制·llm运维
Mr.D学长1 小时前
毕业设计项目 基于python的答题卡识别评分系统
python·毕业设计·毕设
云和数据.ChenGuang1 小时前
LangChain 实战指南:从入门到构建智能应用
开发语言·人工智能·python·langchain
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:拓扑排序课程表排课解析
c++·python·算法·bfs·信息学竞赛
const_qiu1 小时前
第三章 04:3.6 基础调用链的构建
开发语言·python