將不同的HTTP User Agent請求轉(zhuǎn)發(fā)到特定的后端服務(wù)器
假設(shè)我這里有大量圖像、CSS、javascript等靜態(tài)文件,分別放在后端服務(wù)器 192.168.1.5 和 192.168.1.6上,那么我如何利用nginx的反向代理功能將不同的 http_user_agent 請求發(fā)送到指定的服務(wù)器上呢?如 "Mozilla" 轉(zhuǎn)發(fā)到 192.168.1.5 ,MSIE 轉(zhuǎn)發(fā)到 192.168.1.6 。
Nginx web 服務(wù)器支持if條件表達式,由此來跳轉(zhuǎn)或者使用不同的配置變量。在本文中需要使用 $http_user_agent 變量,它標記了用戶瀏覽器的類別,版本以及操作系統(tǒng)的一些信息,語法如下:
do_something
}
if ( $http_user_agent = "wget" ){
do_something
}
if ( $http_user_agent ~ MSIE ){
return 403;
}
if指令會就檢查后面表達式的值是否為真(true),如果為真,則執(zhí)行后面大括號中的內(nèi)容。以下是一些條件表達式的比較方法:
1、變量的完整比較可以使用=或!=操作符
2、 部分匹配可以使用正則表達式來表示,~或~*
3、~表示區(qū)分大小寫
4、~*表示不區(qū)分大小寫(firefox與FireFox是一樣的)
5、!~與!~* 是取反操作,也就是不匹配的意思
6、檢查文件是否存在使用 -f 或 !-f 操作符
7、檢查目錄是否存在使用-d或!-d操作符
8、檢查文件,目錄或符號連接是否存在使用-e或!-e操作符
9、檢查文件是否可執(zhí)行使用-x或!-x操作符
10、正則表達式的部分匹配可以使用括號,匹配的部分在后面可以用$1~$9變量代替,這些和apache一致。
例子:
編輯 /usr/local/nginx/conf/nginx.conf 文件
#vi /usr/local/nginx/conf/nginx.conf
設(shè)置upstream服務(wù)器:
server 192.168.1.1;
server 192.168.1.2;
server 192.168.1.3;
server 192.168.1.4;
}
upstream msiebackend {
server 192.168.1.6;
}
upstream mozillabackend {
server 192.168.1.5;
}
更新虛擬主機配置文件
access_log logs/access.log;
error_log logs/error.log;
index index.html;
listen 202.54.1.5:80 default;
root /usr/local/nginx/html;
server_name example.com www.example.com 0.example.com;
## PROXY - Web
location / {
proxy_pass http://myproxybackend;
if ($http_user_agent ~ MSIE ) {
proxy_pass http://msiebackend;
}
if ($http_user_agent ~ Mozilla ) {
proxy_pass http://mozillabackend;
}
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
# many more...
# many more...
}
最后重啟/重新載入nginx
#/usr/local/nginx/sbin/nginx -s reload