一 、 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