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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM