首頁 > 軟體

Nginx如何設定根據路徑轉發詳解

2022-07-20 14:03:32

先談理解:

1.反向代理:是nginx代理所有的伺服器。而正向代理是vpn代理使用者端!!

反向代理是設定 proxy_pass 可以只設定一個地址如 :

proxy_pass http://127.0.0.1:8081;

也可以設定多個

2.那就是負載均衡

定義負載均衡伺服器:

upstream myserver {
    server        192.168.12.127:8080;
    server        192.168.12.127:8081;
}

修改proxy_pass

proxy_pass http://myserver;

這樣就實現了 反向代理 (proxy_pass)+ 負載均衡(upstream)

1.nginx基本概念

Nginx的概念

  • 正向代理和反向代理:
    • 正向代理:正向代理就是在使用者端設定代理伺服器,通過代理伺服器去進行網際網路操作。(VPN代理使用者端)
    • 反向代理:使用者端傳送請求到反向代理伺服器,由反向代理伺服器去選擇目標伺服器獲取它的資料,在返回給使用者端。此時反向代理伺服器和目標伺服器對外就是一臺伺服器,暴露的是代理伺服器地址,隱藏了真實的伺服器地址。(代理伺服器端)
  • 負載均衡
    • 在多個伺服器的情況下,我們將請求發放到各個伺服器上,將原先請求集中到單個伺服器的情況改為將請求傳送到多個伺服器上,將負載分發到不同的伺服器,也就是負載均衡
  • 動靜分離
    • 簡單理解就是把靜態資源和動態資源分開部署。為了加快網站解析的速度,可以把靜態資源和動態資源部署到不同的伺服器來解析,加快解析速度。降低單個伺服器的壓力!

2.常用命令以及組態檔

Win下nginx的常用命令

  • 前提:需要進入到nginx目錄下在進行操作
  • nginx -v:檢視nginx版本號
  • nginx -s stop:關閉nginx
  • start nginx:啟動nginx
  • nginx -s reload:重新載入nginx
  • nginx -t 檢查預設設定conf
  • taskkill /f /im nginx.exe win殺掉nginx

nginx組態檔

  • 全域性塊
    • 主要設定一些影響nginx伺服器執行的設定指令。主要包括設定執行nginx伺服器的使用者,允許生成的worker process數,程序PID存放路徑,紀錄檔存放路徑和型別以及組態檔的引入等
    • 比如:worker_process 1; 這個就代表nginx伺服器並行處理服務的關鍵設定,它的值越大,表示支援的並行處理量越多,但是會受到硬體,軟體等裝置的約束。
  • events塊
    • events塊主要影響nginx伺服器與使用者的網路連線,是否開啟同時多個網路連線
    • 比如:worker_connections:1024;表示最大連線數為1024個
  • http塊(http塊包含了http全域性塊和server塊)
    • 這時nginx設定最頻繁的部分,代理,快取,紀錄檔等都是在這裡設定。
    • http全域性塊:主要是設定紀錄檔等等的設定
    • server塊:
      • server全域性快:listen:引數對應的是埠號;server_name:地址引數
      • location塊:用來設定響應反向代理的。增加引數proxy_pass 伺服器(反向代理去到的伺服器)地址(比如:127.0.0.1:8080)

3.nginx設定範例之反向代理

1. 實現效果:監聽9000埠。根據不同的路徑跳轉到不同的埠服務中

2. 準備工作

準備好兩個伺服器:8080和8081

在8080tomcat的webapps裡面新增一個shisan01資料夾,編寫一個shisan.html。內容自己定就好,同理8081也是一樣,新增一個shisan02資料夾,編寫一個shisan.html。跑完之後存取不同的服務測試

3. 前往nginx組態檔設定

進入組態檔,如下設定

server {
  listen        9000;
  server_name        192.168.12.127;
  location ~/shisan01/ {
      proxy_pass http://127.0.0.1:8080;
  }
  location ~/shisan02/ {
      proxy_pass http://127.0.0.1:8081;
  }
}

PS:注意要記得開發埠號:8080 8081 9000

PS:location的指令可以百度瞭解一下

4.nginx設定範例之負載均衡

1. 準備工作

同樣是兩個tomcat(8080和8081)伺服器,當然要是你真有兩臺伺服器最好!哈哈哈。條件問題還是模擬。

在兩個伺服器裡面的webapps裡面建立一個shisan資料夾,在shisan資料夾裡建立一個shisan.html,新增內容自己定就好

2. 在nginx組態檔中修改設定

在http塊中設定

upstream myserver {
    server        192.168.12.127:8080;
    server        192.168.12.127:8081;
}
server {
    listen        80;
    server_name        192.168.12.127;
    location / {
        proxy_pass        http://myserver;
        root        html;
        index        index.html index.htm;
    }
}

3. nginx分配伺服器的策略

輪詢:預設策略;每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除

權重:指定輪詢機率,weight和存取比率成正比,用於後端伺服器效能不均的情況。

upstream myserver {
    server        192.168.12.127:8080 weight=10;
    server        192.168.12.127:8081 weight=5;
}

IP繫結 ip_hash:每個請求按存取ip的hash結果分配,這樣每個訪客固定存取一個後端伺服器,可以解決session的問題

upstream myserver { 
  ip_hash; 
  server        192.168.12.127:8080;
  server        192.168.12.127:8081;
}

fair:按後端伺服器的響應時間來分配請求,響應時間短的優先分配。

upstream backserver {
    server 192.168.12.127:8080;
    server 192.168.12.127:8081;
    fair;
}

url_hash:按存取url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。

5.nginx設定範例之動靜分離

1. 準備工作

弄好一個動態資源一個靜態資源:比如

  • /shisan/image/01.jpg
  • /shisan/html/01.html

2. 設定nginx檔案

server {
    listen        80;
    server_name        192.168.12.127;
    location /html/ {
        root        /shisan/;
        index        index.html index.htm;
    }
    location /image/ {
        root        /shisan/;
        autoindex        on;            // 列出檔案的目錄,可以自行觀看對比就知道
    }
}

6.nginx設定高可用叢集

1. 因為我這裡環境不允許,可以參考這個文章

Location規則

語法規則: location [=||*|^~] /uri/ {… }

首先匹配 =,其次匹配^~,其次是按檔案中順序的正則匹配,最後是交給 /通用匹配。當有匹配成功時候,停止匹配,按當前匹配規則處理請求。

符號含義
== 開頭表示精確匹配
^~^~開頭表示uri以某個常規字串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)
~~ 開頭表示區分大小寫的正則匹配
~*~ 開頭表示不區分大小寫的正則匹配*
!和!*!和!*分別為區分大小寫不匹配及不區分大小寫不匹配的正則
/使用者所使用的代理(一般為瀏覽器)
$http_x_forwarded_for可以記錄使用者端IP,通過代理伺服器來記錄使用者端的ip地址
$http_referer可以記錄使用者是從哪個連結存取過來的

比這些 location 規則來選擇一個 location,對比的順序可以總結為:

  1. 首先匹配字首匹配(沒有 RE 表示式),針對當前這個請求,每個字首匹配都匹配一遍.
  2. 搜尋=匹配,如果當前請求匹配上了,搜尋將會停止,直接使用這個這個 location.
  3. 如果第二步沒有匹配上,nginx 會按照如下步驟繼續搜尋最長字首匹配:
    3.1 如果最長字首匹配有^~這個modifier,nginx 會停止搜尋並直接使用這個 location.
    3.2 如果沒有使用 ^~,暫存這個 location並且繼續搜尋.
  4. 只要最長字首匹配被暫存和選中,nginx 就會看當前的 location 是否有大小寫敏感的 RE(~和~*),第一個匹配上這種會被當做有效的 location來處理這個請求.
  5. 如果沒有 RE 的 location 匹配上,前面暫存的 location 就會被選中來處理這個請求.

舉例

如下是一些 location 設定的例子,用來詳細描述上面所說的處理順序,你也可以按照具體實際情況來修改這些例子.

location  = / {
  #  只處理請求 /.
}
location /data/ {
  # 所有以 /data/ 匹配,但是還會繼續搜尋.
  # 如果沒有其他 location 匹配上,就用這個處理請求.
}
location ^~ /img/ {
  # 所有以 /img/ 開頭的請求並且會停止搜尋.
}
location ~* .(png|gif|ico|jpg|jpeg)$ {
  # 以png, gif, ico, jpg ,jpeg結尾的請求. 
  # 如果請求是到 /img/ 路徑的話 還是會被上面

IT145.com E-mail:sddin#qq.com