代理 - 一個(gè)nginx需求,訪問(wèn)web服務(wù)時(shí),若用戶為測(cè)試用戶則轉(zhuǎn)發(fā)到web服務(wù)的測(cè)試版本
問(wèn)題描述
需求細(xì)節(jié):一個(gè)web服務(wù),分為正式服務(wù)器和測(cè)試服務(wù)器,通過(guò)nginx代理,用戶首先訪問(wèn)時(shí)會(huì)提交登錄請(qǐng)求(post方式)到nginx上,通過(guò)nginx判斷登錄用戶是否為測(cè)試用戶,若為測(cè)試用戶則轉(zhuǎn)發(fā)測(cè)試服務(wù)器。
碰到的問(wèn)題:1.判斷用戶已經(jīng)實(shí)現(xiàn)了,怎么實(shí)現(xiàn)后續(xù)請(qǐng)求都發(fā)到同一服務(wù)器?想通過(guò)保存一個(gè)變量來(lái)實(shí)現(xiàn),但是nginx變量是不能跨請(qǐng)求存在的,能否通過(guò)文件讀寫(xiě)來(lái)保存變量?。
2.跳轉(zhuǎn)方式如何實(shí)現(xiàn)?下面是我的部分代碼首先訪問(wèn) 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' thenngx.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;} }
問(wèn)題解答
回答1:你需要把用戶登錄后的憑證都放到 cookie 里面,然后就方便做驗(yàn)算了。
詳見(jiàn) https://github.com/cloudflare/lua-resty-cookie 里面的例子。
跳轉(zhuǎn)的方式用 proxy_pass 應(yīng)該沒(méi)問(wèn)題,挺好的。
