OpenResty實現用戶私有域名綁定

個性化域名綁定

常見SaaS平台應用都會給用戶分配一個「二級域名」,也就是常說的「個性化域名」。個性化域名的綁定實現,利用域名泛解析和伺服器nginx URL重寫rewrite ,即可將URL重定向到實際的URL。

如:

訪問的URL :ming.uedst.com/

實際的URL :uedst.com/space/ming

nginx.conf 配置如下:

server { listen 80; server_name *.uedst.com; if ( $host ~* ((?!www)w+).w+.w+ ) { set $userdomain $1; } location / { rewrite ^/$ /space/$userdomain last; proxy_pass http://www.uedst.com/; } }

私有域名綁定

對於實現用戶私有域名綁定的情況,如果系統的用戶數量不多的話,也完全可以通過在nginx中手動配置來一一綁定實現;但對於一個多用戶的雲平台來說,通過直接修改配置文件來綁定用戶私有域名,這維護難度也太大了!

有沒有一種簡單又靈活的方式,來實現私有域名綁定呢?答案肯定是有的。

通過OpenResty來實現私有域名綁定

綁定和解析流程圖

只需三步

1、系統平台域名做泛解析「 *.uedst.com」, 給用戶分配「個性化域名u2.web.uedst.com

2、系統平台將用戶「私有域名duiler.com」與用戶「個性化域名u2.web.uedst.com」對應關係保存到redis緩存中

$ set www.duiler.com u2.web.uedst.com

3、用戶將「私有域名duiler.com」做 cname別名解析指向到系統平台分配自己的「個性化域名u2.web.uedst.com」上

nginx.conf 配置

server { # 域名指向都不匹配時,會選擇此配置,對於泛解析的域名,可以在這裡做一些處理 listen 80 default_server; server_name _; resolver 8.8.8.8; location / { lua_code_cache off; #設置$userdomain變數及默認值 set $userdomain default; #引入lua文件 access_by_lua_file /lua/cname.lua; #反向代理 proxy_pass http://$userdomain; proxy_set_header Host $userdomain; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { #匹配系統分配的二級域名 listen 80; server_name *.web.uedst.com; location / { default_type text/html; content_by_lua_block { #可看到實際訪問的域名 ngx.say("hello:", ngx.var.host); #ngx.say(ngx.var.document_uri); } } }

cname.lua文件

參考官方demo github.com/openresty/lu

local redis = require "resty.redis"local red = redis:new()red:set_timeout(1000)local ok, err = red:connect("127.0.0.1", 6379)if not ok thenngx.say("failed to connect: ", err)returnendlocal host = ngx.var.host —獲取訪問的域名local res, err = red:get(host) —查找對應的cname記錄if res thenngx.var.userdomain = res —修改nginx變數returnendlocal ok, err = red:set_keepalive(10000, 100)if not ok thenngx.say("failed to set keepalive: ", err)returnend

OpenResty官網 :

OpenResty? - 中文官方站?

openresty.org圖標

OpenResty安裝 參考 :

OpenResty - 安裝?

openresty.org

OpenResty教程 參考 :

序 · OpenResty最佳實踐?

moonbingbing.gitbooks.io


推薦閱讀:

鎚子T2發布會上提到的OpenResty機構,是一個什麼樣的組織?

TAG:OpenResty | SaaS | 綁定域名 |