当前位置: 首页 > news >正文

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权限
  1. 修改settings.py:
    • 将django-hosts添加到app:
    INSTALLED_APPS = [...'django_hosts','sso','doc','task',]

- 添加Django的hosts配置:

    ROOT_HOSTCONF = 'CellMiddle.hosts'  # host配置DEFAULT_HOST = 'sso'  # 默认的域名
  1. - 将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 settingsfrom django_hosts import patterns, hosthost_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')),  # 默认ssopath('doc', include(('doc.urls', 'doc'), namespace='doc')),  # 文档path('task', include(('task.urls', 'task'), namespace='task')),  # 需求]
  1. reload 重载服务:
  • DNS 确认子域名的解析;
  • 检查nginx的配置有效性,重载nginx;
  • 动态更新Web服务 或 在 supervisorctl重启Web服务;
$ kill -HUP PID  # root权限
$ supervisorctl restart program_name服务名  # root权限
  1. 检查子域名的访问,app对应的路由,静态资源访问等是否正常;

相关文章:

  • Linux之前后端项目部署与发布
  • 数据增加
  • 无需邀请码,Xinstall实现精准分享归因
  • 【QT+QGIS跨平台编译】之五十三:【QGIS_CORE跨平台编译】—【qgssqlstatementparser.cpp生成】
  • 单细胞Seurat - 降维与细胞标记(4)
  • Java集合相关面试题(2024大厂高频面试题系列)
  • Dataframe学习笔记:记录一下工作上使用的几种示例
  • kafka学习笔记四(面试题)
  • QML中动态表格修改数据
  • SpringSecurity入门demo(四)权限校验
  • SpringMVC 学习(七)之报文信息转换器 HttpMessageConverter
  • python difflib --- 计算差异的辅助工具
  • 华为OD技术面试案例6-2024年
  • golang 装饰器模式详解
  • MongoDB聚合运算符:$ceil
  • Bytom交易说明(账户管理模式)
  • CentOS7简单部署NFS
  • CSS3 变换
  • gcc介绍及安装
  • iOS编译提示和导航提示
  • Iterator 和 for...of 循环
  • jdbc就是这么简单
  • mysql 数据库四种事务隔离级别
  • MySQL几个简单SQL的优化
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Twitter赢在开放,三年创造奇迹
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 从setTimeout-setInterval看JS线程
  • 搭建gitbook 和 访问权限认证
  • 给Prometheus造假数据的方法
  • 构造函数(constructor)与原型链(prototype)关系
  • 后端_MYSQL
  • 计算机常识 - 收藏集 - 掘金
  • 判断客户端类型,Android,iOS,PC
  • 前端路由实现-history
  • 嵌入式文件系统
  • 巧用 TypeScript (一)
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 微信小程序开发问题汇总
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​比特币大跌的 2 个原因
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)shell调试方法
  • .net快速开发框架源码分享
  • .net网站发布-允许更新此预编译站点
  • .NET中的十进制浮点类型,徐汇区网站设计
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @RequestMapping用法详解
  • [ 数据结构 - C++] AVL树原理及实现