實際的需求就類似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 參考文檔: