OpenResty實現用戶私有域名綁定
個性化域名綁定
常見SaaS平台應用都會給用戶分配一個「二級域名」,也就是常說的「個性化域名」。個性化域名的綁定實現,利用域名泛解析和伺服器nginx URL重寫rewrite ,即可將URL重定向到實際的URL。
如:
訪問的URL :http://ming.uedst.com/
實際的URL :http://www.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、系統平台域名做泛解析「 *.http://uedst.com」, 給用戶分配「個性化域名http://u2.web.uedst.com」
2、系統平台將用戶「私有域名http://www.duiler.com」與用戶「個性化域名http://u2.web.uedst.com」對應關係保存到redis緩存中
$ set www.duiler.com u2.web.uedst.com
3、用戶將「私有域名http://www.duiler.com」做 cname別名解析指向到系統平台分配自己的「個性化域名http://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 https://github.com/openresty/lua-resty-redis
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安裝 參考 :
OpenResty - 安裝OpenResty教程 參考 :
序 · OpenResty最佳實踐
推薦閱讀: