需求細節:
一個web服務,分為正式伺服器和測試伺服器,透過nginx代理,用戶先造訪時會提交登入請求(post方式)到nginx上,透過nginx判斷登入用戶是否為測試用戶,若為測試用戶則轉發測試伺服器。
碰到的問題:
1.判斷用戶已經實現了,怎麼實現後續請求都發到同一台伺服器?想透過保存一個變數來實現,但是nginx變數是不能跨請求存在的,能否透過文件讀寫來保存變數? 。
2.跳轉方式如何實現?
下面是我的部分程式碼
首先造訪 127.0.0.1/smdb
location /smdb {
default_type 'text/plain';
set $jump 0;
access_log /var/log/nginx/smdb_access.log smdb;
error_log /var/log/nginx/error.log;
log_subrequest on;
lua_need_request_body on;
client_max_body_size 50k;
client_body_buffer_size 50k;
content_by_lua '
ngx.req.read_body()
local args, err = ngx.req.get_post_args()
if not args then
ngx.say("failed to get post args: ", err)
return
end
for key, val in pairs(args) do
if val == "test" then
ngx.var.jump = "1"
end
end
ngx.exec("/tosmdb")
';
}
location /tosmdb {
default_type 'text/plain';
echo $jump;#注释掉下面,这里显示为1即判断出了用户
if ($jump = "1"){
proxy_pass http://smdbtest;
}
if ($jump = "0"){
proxy_pass http://smdb;
}
}
#
你需要把使用者登入後的憑證都放到 cookie 裡面,然後就方便做驗算了。
詳見 https://github.com/cloudflare/lua-resty-cookie 裡面的範例。
跳轉的方式用
proxy_pass
應該沒問題,挺好的。