實(shí)現(xiàn)原理
當(dāng)我們?cè)L問一個(gè)網(wǎng)站,請(qǐng)求頭中會(huì)有 user-agent 的頭部,如 mozilla/5.0 (macintosh; intel mac os x 10.12; rv:50.0) gecko/20100101 firefox/50.0,這個(gè) ua 是可以自定義的,很多瀏覽器插件也支持新增自定義 ua,如火狐的 user agent swicher 插件。
如圖,這里新增了一個(gè)自定義 ua,內(nèi)容改成了自己的名字,通過這個(gè) ua 請(qǐng)求網(wǎng)站,我們可以在請(qǐng)求頭中看到 ua 變成自己的了,這就是一個(gè)標(biāo)識(shí)。
根據(jù)這個(gè) ua ,通過 nginx 進(jìn)行判斷,不同的 ua 轉(zhuǎn)發(fā)到不同的端口,每個(gè)端口下對(duì)應(yīng)一個(gè)網(wǎng)站目錄。
nginx 判斷 ua
通過 nginx 可以獲取每次請(qǐng)求的 ua,即 $http_user_agent 變量。
如在 location 域中可以這樣判斷 ua 并設(shè)置一個(gè)標(biāo)識(shí):
if?(?$http_user_agent?~?"dashen"?)?{ ?set?$flag?"01"; }
比如判斷 ua 內(nèi)容為 dashen,設(shè)置 $flag 為 01,可以設(shè)置很多個(gè)這樣的標(biāo)識(shí)。
nginx 反向代理和負(fù)載均衡
通過判斷不同的 ua,我們可以通過反向代理轉(zhuǎn)發(fā)到不同的機(jī)器和端口,這里同一臺(tái)測(cè)試機(jī)可以轉(zhuǎn)發(fā)到本機(jī)的不同的端口,監(jiān)聽不同的端口設(shè)置不同的網(wǎng)站目錄。
具體如下:
server { ?listen?192.168.1.251:80; ?server_name?*.example.com; ?index?index.html?index.htm?index.php; ?charset?utf-8; ?location?/?{ ?set?$flag?"00"; ?if?(?$http_user_agent?~?"dashen"?)?{ ???set?$flag?"01"; ??} ?if?(?$http_user_agent?~?"mianwo"?)?{ ???set?$flag?"02"; ??} ?if?(?$http_user_agent?~?"bingkuai"?)?{ ???set?$flag?"03"; ??} ?if?(?$http_user_agent?~?"hadoop"?)?{ ???set?$flag?"04"; ??} ??proxy_set_header?host?$host; ??proxy_set_header?x-forwarded-for?$proxy_add_x_forwarded_for; ??if?(?$flag?=?"00"?){ ???add_header?z-server?mobile; ???proxy_pass?http://webserver_mobile; ??} ??if?(?$flag?=?"01"?){ ???add_header?z-server?dashen; ???proxy_pass?http://webserver_dashen; ??} ??if?(?$flag?=?"02"?){ ???add_header?z-server?mianwo; ???proxy_pass?http://webserver_mianwo; ??} ??if?(?$flag?=?"03"?){ ???add_header?z-server?bingkuai; ???proxy_pass?http://webserver_bingkuai; ??} ??if?(?$flag?=?"04"?){ ???add_header?z-server?hadoop; ???proxy_pass?http://webserver_hadoop; ??} ?} }
這段配置將不同的 ua 請(qǐng)求反向代理到不同的負(fù)載均衡服務(wù)器,下面看具體的負(fù)載均衡配置。
nginx 負(fù)載均衡配置
這里定義了幾個(gè)負(fù)載均衡配置,每個(gè)負(fù)載均衡配置實(shí)際上只配了一臺(tái)機(jī)器,即本機(jī)的不同端口。
upstream?webserver_mobile{ ?server?127.0.0.1:8900?max_fails=2?weight=2?fail_timeout=10s; } upstream?webserver_dashen{ ?server?127.0.0.1:8901?max_fails=2?weight=2?fail_timeout=10s; } upstream?webserver_mianwo{ ?server?127.0.0.1:8902?max_fails=2?weight=2?fail_timeout=10s; } upstream?webserver_bingkuai{ ?server?127.0.0.1:8903?max_fails=2?weight=2?fail_timeout=10s; } upstream?webserver_hadoop{ ?server?127.0.0.1:8904?max_fails=2?weight=2?fail_timeout=10s; }
那么,還沒結(jié)束,接下來需要做的是,像一個(gè)正常的網(wǎng)站那樣去配置多個(gè) nginx 虛擬主機(jī),不同的是這里需要監(jiān)聽?zhēng)讉€(gè)不同的端口,就需要幾個(gè)虛擬主機(jī)配置,只是網(wǎng)站的目錄不同,如 ua 是 dashen ,對(duì)應(yīng)網(wǎng)站目錄是 /vhosts/example.com/dashen,如 ua 是 mianwo,對(duì)應(yīng)的網(wǎng)站目錄是 /vhosts/example.com/mianwo.
這樣一來,不同的測(cè)試人員,在對(duì)應(yīng)自己 ua 的網(wǎng)站目錄下拉取分支,通過瀏覽器插件配置自己的 ua,就實(shí)現(xiàn)了多人同時(shí)在一臺(tái)機(jī)器上拉取不同的分支,而且訪問同樣的域名,根據(jù) ua 不同實(shí)現(xiàn)網(wǎng)站根目錄分開,而且互不影響。