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


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

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

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

location / {
     root   home/;
     index  index.html;
}

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

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

1、絕對匹配,完全相等 “=” 號 ,比如:

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

2、正則匹配 ~ 或者 ~* 。前一個區分大小寫,后一個不區分大小寫

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

3、一般匹配 無符號 ,無符號匹配就算匹配中,也不會break,還會繼續向下匹配下去,如果發現正則或者完全匹配的情況,則直接使用。

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


二、proxy_pass 反向代理

1:當我們遇到跨域問題,而且客戶端無法支持 CORS 時,最好的辦法就是讓服務器來做代理。在前端頁面所在的服務器 nginx 配置上開一個路由,然后使用 proxy 去請求另一個域名下的資源。
2:前后台分離后,前端獨立開發后也可以通過proxy_pass來反向代理到后台服務,或者服務器部署地址不方便暴露也可以用proxy做反向代理。

簡單到例子:

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
有斜杠:絕對地址,最終跳轉到:http://www.sohu.com/index.html
沒有斜杠:相對地址,最終跳轉到:http://www.sohu.com/login/index.html


三、rewrite重新路由,rewrite有5中命令模式

rewrite 的作用是修改 uri,但要注意 rewrite 要有個重新匹配 location 的副作用。由於 proxy_pass 的處理階段比 location 處理更晚,所以需要 break 掉,以防止 rewrite 進入下一次 location 匹配而丟失 proxy_pass。

1、break; 如下:

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

2、redirect ; 如下

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

3、permanent ; 和redirect作用類似。

4、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/;
}

5、沒有修飾,就是無任何修飾。可以看到這個rewrite后面沒有任何修飾。當沒有任何修飾的情況下,匹配中location后,不會停止,會繼續想下面的location繼續匹配下去。知道匹配到最后一個,使用最后一個匹配到的。。如下

location  /login {
       rewrite  ^/  /demo.html ;
       root  home/;
}

四、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值來進行區分訪問那個服務,這種設置后,同一個客戶端訪問的服務一般是不會變的。


參考:
https://blog.csdn.net/zhanglei082319/article/details/88830606
https://www.cnblogs.com/lianxuan1768/p/8383804.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM