saas 系統(tǒng)租戶個性化域名&&租戶綁定自己域名的解決方案

實際的需求就類似github 的自定義page

1. 個性化域名

github 實現(xiàn)原理就是用戶個性化域名使用泛域名解析,這個比較簡單,大部分域名提供商都可以解決

具體操作不用贅述

使用nginx 的配置比較簡單

openresty 配置如下:

server{

listen8080default;

index index.html index.htm index.php;

root? html;

location/{

root html;

}

location/app{

root html;

}

location/default{

root html;

}

}

server{

listen80;

server_name XXXXXXXXX;// 此處進行泛域名解析配置

index index.html index.htm;

root? html2;

location/{

set$subdomaindefault;

if($http_host~*"^(.*)\.XXXXXXXXX\.com"){

set$subdomain $1;// 獲取租戶個性域名

}

rewrite^/(.*)$ /$subdomain/$1break;

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 的實現(xiàn)原理: 租戶自己域名使用cname 綁定github 的個性化域名

通過cname 進行用戶請求站點的定位

我的實現(xiàn)是使用openresty 結(jié)合redis (此處具體的應(yīng)該結(jié)合自己的場景,一般saas 系統(tǒng)還是建議使用一個環(huán)境 ? ? ? ? ?中間件處理會比較好)

原理如下:

a. 租戶配置cname 解析到自己的個性化域名(一般都是在域名購買方的系統(tǒng)配置的)

備注:此處也可以直接使用a 記錄進行ip配置

b. 租戶需要在saas 平臺申請自己需要綁定的域名

c. saas 運營平臺進行審核(當然一般都是通過的),將租戶的域名與個性化域名的對照管理存儲到redis

d. 租戶使用自己的域名登陸saas 系統(tǒng)

e. saas 系統(tǒng)服務(wù)器(openresty )結(jié)合請求的host 在redis 進行租戶個性化域名的查找

f. ?服務(wù)器進行反向代理到租戶的個性化域名主機

openresty 配置如下:

server{

listen80default_server;

index index.html index.htm index.php;

resolver127.0.0.1;// 進行dns 解析的我的測試是使用自己大家的dns服務(wù)器

root? html;

location/{

set$subdomaindefault;

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/$1;

proxy_set_headerHost$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. 總結(jié)

參考圖:


實際上原理以及還是比較簡單的,只是結(jié)合了openresty 會簡化了我們好多的開發(fā)

以上就是自己的一些實踐,實際上上面redis 的連接最好使用連接池,同時對于請求記性緩存處理

openresty 參考文檔:

https://openresty.org/en/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容