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