問題提出場景:
1、nginx做反向代理,靜態資源過大或者響應多,如果存在被代理機器,影響效率;
2、某URL爲了達到安全性等目的,需要代理機代理到特定的被代理機處理;
解決方案:nginx反向代理配置;
假設環境:
代理機ip爲ip0,被代理機ip爲ip1;
目錄
1、分發至特定被代理機配置
其中如果“jpg”等文件也想配置就將“mp4”改成“mp4|jpg|xxx”;
location ~* .(mp4)$ {
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_pass http://ip1; #這個是重點,其它參數隨你自己的需求添加
if (-f $request_filename) {
expires max;
break;
}
}
示例:如果客戶訪問ip爲"ip0/test/test.mp4",那麼代理機就會直接訪問"ip1/test/test.mp4"
2、分發至本地路徑配置
location ~* .(mp4)$ {
root /html; #本地特定的路徑
if (-f $request_filename) {
expires max;
break;
}
}
示例: 如果客戶訪問ip爲"ip0/test/test.mp4",那麼代理機就會直接訪問本地html目錄,並以"html"文件夾爲根目錄;
3、特定的url分發至特定的被代理機配置
location ~* xxx.php$ {
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_pass http://ip1;
}
示例: 如果客戶訪問ip爲"ip0/test/xxx.php",那麼代理機就會直接訪問"ip1/test/xxx.php";
4、某文件夾分發至被代理機配置[1]
location ^~ /static_js/ {
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_pass http://ip1/;
}
如果請求的url是http://ip0/static_js/test.html,會被代理成http://ip1/test.html;特別注意的是,如果ip後面不加"/",那麼會代理成http://ip1/static_js/test.htm
5、某文件夾下某後綴文件發送至被代理機配置[1]
location ~^/project/.*.action$ {
rewrite ^/project/(.*).action /$1.action break;
proxy_pass http://ip1;
}
把http://ip0/project/test.action 反向代理到 http://ip1/test.action。
基本上的功能有這5個場景,然後自己去挖掘就可以了;
擴展功能
裏面涉及了另外幾個有意思的知識點,學了能讓你配置反向代理更遊刃有餘:
6.1 "$"的意義[2]
Nginx中,set $para $1,$1表示路徑中正則表達式匹配的第一個參數。
以下是一個示例,用以實驗$1,$2。如:
location ~/abc/(.*)/(.*) {
set $para1 $1
set $para2 $2
content_by_lua_block {
ngx.say(ngx.var.para1)
ngx.say(ngx.var.para2)
}
}
此時,若訪問路徑爲localhost:8080/abc/qwe/asd時,則瀏覽器會輸出"qwe"與"asd";
6.2 rewrite重寫
6.3 nginx正則表達式書寫
參考資料: