实际的需求就类似github 的自定义page
1. 个性化域名
   github 实现原理就是用户个性化域名使用泛域名解析,这个比较简单,大部分域名提供商都可以解决
   具体操作不用赘述
   使用nginx 的配置比较简单
   openresty 配置如下:

server {
listen 8080default;
index index.html index.htm index.php;
root html;
location /{
root html;
}
location /app {
root html;
}
location /default{
root html;
}
}
server {
listen 80;
server_name XXXXXXXXX;// 此处进行泛域名解析配置
index index.html index.htm;
root html2;
location /{
set $subdomain default;
if( $http_host ~*"^(.*)\.XXXXXXXXX\.com"){
set $subdomain $1;// 获取租户个性域名
}
rewrite ^/(.*)$ /$subdomain/$1 break;
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /app {
root html;
}
location /default{
root html;
}
}

  

2. 绑定租户自己域名
    github 的实现原理: 租户自己域名使用cname 绑定github 的个性化域名
    通过cname 进行用户请求站点的定位
    我的实现是使用openresty 结合redis (此处具体的应该结合自己的场景,一般saas 系统还是建议使用一个环境          中间件处理会比较好)
 原理如下:
   a. 租户配置cname 解析到自己的个性化域名(一般都是在域名购买方的系统配置的)
        备注:此处也可以直接使用a 记录进行ip配置
   b. 租户需要在saas 平台申请自己需要绑定的域名
   c. saas 运营平台进行审核(当然一般都是通过的),将租户的域名与个性化域名的对照管理存储到redis 
   d. 租户使用自己的域名登陆saas 系统
   e. saas 系统服务器(openresty )结合请求的host 在redis 进行租户个性化域名的查找
   f.  服务器进行反向代理到租户的个性化域名主机
     openresty 配置如下:

server {
listen 80 default_server;
index index.html index.htm index.php;
resolver 127.0.0.1;// 进行dns 解析的我的测试是使用自己大家的dns服务器
root html;
location /{
set $subdomain default;
access_by_lua '
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("XXXXXXXXX", 6379)
if not ok then
ngx.say("failed to connect: ", err)
return
end
local host = ngx.var.host;
local res, err = red:get(host)
ngx.var.subdomain = res
';
proxy_pass http://$subdomain/$url;
proxy_set_header Host $subdomain;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log /usr/local/openresty/nginx/logs/openresty.access.log access;
error_log /usr/local/openresty/nginx/logs/openresty.error.log;
}

  

3. 总结

       参考图:
       

 
 
       实际上原理以及还是比较简单的,只是结合了openresty 会简化了我们好多的开发
       以上就是自己的一些实践,实际上上面redis 的连接最好使用连接池,同时对于请求记性缓存处理
       openresty 参考文档:
 
 

saas 系统租户个性化域名&&租户绑定自己域名的解决方案的更多相关文章

  1. EFCore高级Saas系统下一个DbContext如何支持多数据库迁移

    EFCore高级玩法单DbContext支持多数据库迁移 前言 随着系统的不断开发和迭代默认的efcore功能十分强大,但是随着Saas系统的引进efcore基于表字段的多租户模式已经非常完美了,但是 ...

  2. Saas系统架构的思考,多租户Saas架构设计分析

    ToB Saas系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统.很多Saas创业公司也拿了大额风投.毕竟Saas相对传统软件的优势非常明显. ...

  3. saas 系统租户自助网站

    1. 原理       类似github 的自定义页面,使用jekyll 进行租户自助网站的生成,系统使用jenkins 进行租户的网站构建    同时结合租户的个性化域名系统,进行租户页面的发布管理 ...

  4. saas系统多租户数据隔离的实现(一)数据隔离方案

    0. 前言 前几天跟朋友聚会的时候,朋友说他们公司准备自己搞一套saas系统,以实现多个第三方平台的业务接入需求.聊完以后,实在手痒难耐,于是花了两天时间自己实现了两个saas系统多租户数据隔离实现方 ...

  5. efcore在Saas系统下多租户零脚本分表分库读写分离解决方案

    efcore在Saas系统下多租户零脚本分表分库读写分离解决方案 ## 介绍 本文ShardinfCore版本x.6.0.20+ 本期主角: - [`ShardingCore`](https://gi ...

  6. 在IT在系统中使用多租户技术的跨部门和虚拟团队的解决方案为员工提供(草案)

    1 前言 经过多年的企业信息化建设,Office系统逐步形成有9营业场所的分部门.9专业应用子系统.20独立的信息模块.330一种方法.这些系统或模块内置于Microsoft IIS.Apache T ...

  7. SaaS “可配置”和“多租户”架构的几种技术实现方式

    1.数据存储方式的选择 多租户(Multi-Tenant ),即多个租户共用一个实例,租户的数据既有隔离又有共享,说到底是要解决数据存储的问题. 常用的数据存储方式有三种. 方案一:独立数据库   一 ...

  8. 如何用Serverless让SaaS获得更灵活的租户隔离和更优的资源开销

    关于SaaS和Serverless,相信关注我的很多读者都已经不陌生,所以这篇不会聊它们的技术细节,而将重点放在SaaS软件架构中引入Serverless之后,能给我们的SaaS软件带来多大的收益. ...

  9. saas系统架构经验总结

    2B Saas系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统.很多Saas创业公司也拿了大额风投.毕竟Saas相对传统软件的优势非常明显. ...

随机推荐

  1. panda2

    pandas是python为数据分析建造的可靠工具,很多地方和R语言有想通之处.数据分析并不是工具越高深越好,excel,R,python都是针对不同情况的不同工具,各有各的优缺点,就像你要搭一个架子 ...

  2. Dapper 条件语句(Where) 中参数使用

    public static List<ECInput> GetECInputList(DateTime beginDate,DateTime endDate,string[] barcod ...

  3. Linux命令详解-cp

    cp 命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在, 就会询问是否覆盖,不管你是否使用-i参数.但是如 ...

  4. Linux系统 SSHD服务安全优化方案

      # 1. 修改默认端口 #Port 22 # 2. 修改监听协议,只监听某个或某些网络协议 #AddressFamily any AddressFamily inet # 3. 修改ssh只监听内 ...

  5. C#/JAVA 程序员转GO/GOLANG程序员笔记大全(DAY 02)

    ------------------- 指针 go 保留的 c 语言指针的操作,同时增加了自动垃圾回收机制 var a = new(int) *a = // &a 内存地址 --------- ...

  6. cat 命令|more命令|less命令

    cat主要有三大功能:1.一次显示整个文件:cat [-n] filename2.从键盘创建一个文件:cat > filename 3.将几个文件合并为一个文件:cat file1 file2 ...

  7. [C#]ref,out关键字的作用

    ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点. 使用ref前必须对变量赋值,out不用 out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都 ...

  8. QUnit 学习笔记 使用说明(一)

    一.单元测试前言 什么是单元测试? 如果是新接触单元测试的童鞋,简要的解释:就是一个JS函数/功能/模块的测试. 单元测试的工具:这里介绍QUnit Qunit原本是jqury家的,不过现在已经独立了 ...

  9. C++中几个值得分析的小问题(2)

    下面有3个小问题,作为C++ Beginner你一定要知道错在哪里了. 1.派生类到基类的引用或指针转换一定“完美”存在? 一般情况,你很可能会认为:派生类对象的引用或指针转换为基类对象的引用或指针是 ...

  10. WiFi无线网络参数 802.11a/b/g/n 详解

    转载自:WiFi无线网络参数 802.11a/b/g/n 详解 如转载侵犯您的版权,请联系:2378264731@qq.com 802.11a/b/g/n,其实指的是无线网络协议,细分为802.11a ...