Nginx下的location,upstream,rewrite 和 proxy_pass使用總計大全

一 、 location: 顧名思義-->地址,也叫路由。

nginx服務器很是核心的配置,通常nginx運維人員在修改nginx配置時,大部分也是圍繞着location這個配置進行修改。html

下面看一下一個簡單的location配置:前端

location / {
     root   home/;
     index  index.html;
}
複製代碼

這個配置表示任何一個路徑訪問nginx服務器,都跳轉到home目錄下的index.html頁面中。nginx

下面來詳細說一下location 路徑匹配規則,location匹配分爲3種匹配方式 。正則表達式

一、絕對匹配,徹底相等 「=」 號 ,好比:跨域

##當訪問地址端口後面的地址等於/login/demo.html時,就會直接走這個location地址。
location = /login/demo.html {
       *******
}
複製代碼

二、正則匹配 ~ 或者 ~* 。前一個區分大小寫,後一個不區分大小寫瀏覽器

location ^~ /images/ {
# 匹配任何已/images/開頭的任何查詢而且中止搜索。任何正則表達式將不會被測試。
}
 
location ~* .(gif|jpg|jpeg)$ {
# 匹配任何已.gif、.jpg 或 .jpeg 結尾的請求
}
 
複製代碼

三、通常匹配 無符號 ,無符號匹配就算匹配中,也不會break,還會繼續向下匹配下去,若是發現正則或者徹底匹配的狀況,則直接使用。服務器

總結一下: = 嚴格匹配。若是這個查詢匹配,那麼將中止搜索並當即處理此請求。 ~ 爲區分大小寫匹配(可用正則表達式) !~爲區分大小寫不匹配 ~* 爲不區分大小寫匹配(可用正則表達式) !~*爲不區分大小寫不匹配 ^~ 若是把這個前綴用於一個常規字符串,那麼告訴nginx 若是路徑匹配那麼不測試正則表達式。運維


2、proxy_pass 反向代理

1:當咱們遇到跨域問題,並且客戶端沒法支持 CORS 時,最好的辦法就是讓服務器來作代理。在前端頁面所在的服務器 nginx 配置上開一個路由,而後使用 proxy 去請求另外一個域名下的資源。 2:先後臺分離後,前端獨立開發後也能夠經過proxy_pass來反向代理到後臺服務,或者服務器部署地址不方便暴露也能夠用proxy作反向代理。測試

簡單到例子:url

location /login {
     proxy_pass   http://www.sohu.com/
} 
複製代碼

當咱們訪問 http://192.168.0.101:8080/login就會直接跳轉到搜狐首頁。說明當前訪問地址爲搜狐網的代理地址。

須要特別注意的是:proxy後面的地址有沒有斜槓:

在這裏插入圖片描述
若是咱們訪問到地址是: http://192.168.0.101:8080/login/index.html 有斜槓:絕對地址,最終跳轉到:www.sohu.com/index.html 沒有斜槓:相對地址,最終跳轉到:www.sohu.com/login/index…


3、rewrite從新路由,rewrite有5中命令模式

rewrite 的做用是修改 uri,但要注意 rewrite 要有個從新匹配 location 的反作用。因爲 proxy_pass 的處理階段比 location 處理更晚,因此須要 break 掉,以防止 rewrite 進入下一次 location 匹配而丟失 proxy_pass。

一、break; 以下:

#這個指令表示,若是/login匹配成功,則直接在home路徑中查找demo.html文件
#而後跳轉到demo.html。注意這是內部跳轉,瀏覽器上的地址url不會變,仍是以/login結尾。
location  /login {
       rewrite  ^/  /demo.html  break;
       root  home/;
}
複製代碼

二、redirect ; 以下

#和break差很少,不過這個表示外部跳轉,也會跳轉到demo.html頁面,不過瀏覽器地址會自動變成demo.html
location  /login {
       rewrite  ^/  /demo.html  redirect;
       root  home/;
}
複製代碼

三、permanent ; 和redirect做用相似。

四、last; 若是是last修飾的話,nginx會將/demo.html地址和其餘location的地址進行匹配,而後找到匹配的地址,繼續執行下去。這裏他會執行到 /demo.html 的location中,而後內部跳轉到/demo.html頁面,以下:

location  /login {
       rewrite  ^/  /demo.html  last;
       root  home/;
}
 
location  /demo.html {
       rewrite  ^/  /demo.html  break;
       root  home/;
}
複製代碼

五、沒有修飾,就是無任何修飾。能夠看到這個rewrite後面沒有任何修飾。當沒有任何修飾的狀況下,匹配中location後,不會中止,會繼續想下面的location繼續匹配下去。知道匹配到最後一個,使用最後一個匹配到的。。以下

location  /login {
       rewrite  ^/  /demo.html ;
       root  home/;
}
複製代碼

4、upstream , 負載配置

upstream 用以配置負載的策略,nginx自帶的有:輪詢/權重/ip_hash。特殊需求可用第三方策略(使用較少)。

upstream test{
    server 192.168.0.101:8081;
    server 192.168.0.102:8081;
}
 
upstream test1 {
    server 192.168.0.101:8081 weight=2;
    server 192.168.0.102:8081 weight=1;
}
 
upstream test2 {
    ip_hash
    server 192.168.0.101:8081;
    server 192.168.0.102:8081;
}
 
server{
   listen   80;
   server_name  localhost;
 
   location /login {
       proxy_pass   http://test/
   } 
}
複製代碼

當訪問:http://localhost/login時,nginx就會在server 192.168.0.101:8081; server 192.168.0.102:8081這兩個服務之間輪詢訪問。

upstream test1 表示上面的服務訪問2次,下面的服務訪問1次

upstream test2 表示更具客戶端ip地址的hash值來進行區分訪問那個服務,這種設置後,同一個客戶端訪問的服務通常是不會變的。


參考: blog.csdn.net/zhanglei082… www.cnblogs.com/lianxuan176…

相關文章
相關標籤/搜索