目錄
一、Nginx
二、正向代理?
三、反向代理
四、Nginx 緩存
1. 緩存功能的核心原理和緩存類型
2. 代理緩存功能設置
五、Nginx rewrite和正則
(1)Nginx 正則
(2)nginx location
(3)Rewrite
(4)實例:
一、Nginx
概述:Nginx 是一款高性能的?開源 Web 服務器?和?反向代理服務器,以高并發處理、低內存消耗和模塊化架構著稱。
核心功能:
功能 | 說明 |
---|---|
靜態資源服務 | 高效處理 HTML、CSS、JS、圖片等靜態文件,支持 Gzip 壓縮和緩存優化。 |
反向代理 | 將客戶端請求轉發到后端服務器集群,實現負載均衡和高可用。 |
SSL/TLS 終止 | 處理 HTTPS 加密和解密,減輕后端服務器壓力。 |
限流與防護 | 支持請求速率限制、IP 黑白名單、防 DDoS 攻擊。 |
動態內容處理 | 通過 FastCGI 協議與 PHP、Python 等后端語言交互(需配合 PHP-FPM 等工具)。 |
注意:配置代理前提 nginx的版本必須高些
二、正向代理?
概述:正向代理是?客戶端與目標服務器之間的中間服務器,代表客戶端向外部服務器發送請求。
?
工作流程:
-
客戶端配置代理服務器(如瀏覽器設置代理 IP 和端口)。
-
客戶端發送請求到代理服務器。
-
代理服務器轉發請求到目標服務器。
-
目標服務器返回響應到代理服務器。
-
代理服務器將響應返回給客戶端。
配置步驟:
#正向代理
vim /usr/local/nginx/conf/nginx.conf
......省略部分信息server {listen 8080;resolver 114.114.114.114 8.8.8.8;proxy_connect;proxy_connect_allow 80 443;proxy_connect_connect_timeout 10s;proxy_connect_read_timeout 10s;proxy_connect_send_timeout 10s;server_name localhost;location / {# root html;# index index.html index.htm;proxy_pass $scheme://$http_host$request_uri;proxy_set_header Host $http_host;proxy_buffers 256 4k;proxy_max_temp_file_size 0;proxy_http_version 1.1;proxy_set_header Connection "";}nginx -t ##檢查文件配置
三、反向代理
概述:反向代理是?客戶端與后端服務器之間的中間服務器,代表后端服務器接收客戶端請求,隱藏真實服務器信息。
-
核心優勢:
-
負載均衡:分發請求到多個后端服務器。
-
安全防護:隱藏后端服務器 IP,防止直接暴露。
-
緩存加速:緩存靜態內容,減少后端壓力。
-
配置步驟:
#反向代理(七層代理)
進行反向代理的配置,寫在server外面(準備兩臺httpd網站,兩個網站,兩個網站內容不同,記得關防火墻,啟動httpd)vim /usr/local/nginx/conf/nginx.confupstream myhttp {server 192.168.10.103:80;server 192.168.10.104:80;}#下面這個修改server里面的location location / {# root html;# index index.html index.htm;proxy_pass http://myhttp;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}nginx -t ##檢查文件配置(四層反向代理)并不在http里面寫,在ecents下面寫
vim /usr/local/nginx/conf/nginx.confstream {upstream myssh{server 192.168.10.102:22;}server {listen 2222;proxy_pass myssh;proxy_connect_timeout 10s;proxy_timeout 1h;}
}nginx -t ##檢查文件配置
四、Nginx 緩存
Nginx 緩存通過存儲響應內容(靜態或動態)減少后端服務器負載,提升響應速度和并發能力。
1. 緩存功能的核心原理和緩存類型
(1)代理緩存
-
核心作用:通過緩存后端服務器的響應內容,減少重復請求對后端的壓力,加快客戶端訪問速度。
-
緩存類型:
-
代理緩存(Proxy Cache):針對反向代理場景,緩存后端服務器的響應(如動態接口、靜態頁面)。
-
靜態資源緩存:直接緩存靜態文件(如 CSS、JS、圖片),通過?
expires
?或?Cache-Control
?頭控制瀏覽器緩存。
-
(2)代理緩存原理
-
緩存鍵(Cache Key):根據請求的 URL、HTTP 方法、請求頭(如?
Host
)生成唯一標識,用于判斷是否命中緩存。 -
緩存存儲:將響應內容以文件形式存儲在磁盤(或內存),并通過?
proxy_cache_path
?配置管理。 -
緩存有效性:
-
基于 HTTP 響應頭(如?
Cache-Control
、Expires
)自動判斷緩存過期時間。 -
可手動設置緩存有效期(如?
proxy_cache_valid
)。
-
-
緩存更新:當緩存過期或無效時,向后端服務器重新請求并更新緩存。
2. 代理緩存功能設置
(1)反向代理配置
upstream backend {server 10.0.0.1:80;server 10.0.0.2:80;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;}
}
(2)設置緩存功能
分兩步:定義緩存路徑和啟用緩存規則。
-
定義緩存路徑(在?
http
?塊中配置):http {proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;# 參數說明:# - `/var/cache/nginx`: 緩存文件存儲路徑# - `levels=1:2`: 目錄層級結構(1層子目錄,2位哈希字符)# - `keys_zone=my_cache:10m`: 定義緩存區域名稱和共享內存大小(10MB)# - `max_size=1g`: 最大磁盤緩存空間# - `inactive=60m`: 60分鐘內未被訪問的緩存自動刪除# - `use_temp_path=off`: 禁用臨時文件路徑,直接寫入緩存目錄 }
-
啟用緩存規則(在?
location
?塊中配置):server {location / {proxy_pass http://backend;proxy_cache my_cache; # 關聯緩存區域proxy_cache_valid 200 302 10m; # 狀態碼200/302緩存10分鐘proxy_cache_valid 404 1m; # 狀態碼404緩存1分鐘proxy_cache_key "$scheme$request_method$host$request_uri"; # 定義緩存鍵add_header X-Cache-Status $upstream_cache_status; # 添加響應頭顯示緩存狀態} }
(3)驗證緩存功能
-
查看響應頭:
-
通過瀏覽器開發者工具或?
curl
?檢查響應頭是否包含?X-Cache-Status
:curl -I http://example.com
-
可能的取值:
-
HIT
:緩存命中 -
MISS
:未命中,從后端獲取 -
EXPIRED
:緩存已過期 -
BYPASS
:繞過緩存
-
-
-
檢查緩存文件:
-
到?
/var/cache/nginx
?目錄查看是否生成緩存文件(文件名基于哈希值)。
-
-
壓力測試:
-
使用工具(如?
ab
?或?wrk
)模擬高并發請求,觀察后端服務器的負載是否降低。
-
五、Nginx rewrite和正則
Rewrite 功能通過正則表達式實現 URL 重寫、跳轉和邏輯控制,是 SEO 優化和路由管理的核心工具。
Rewrite的應用場景:
- 路徑美化:將/product/123 轉換為 /index.php?id=123
- 舊鏈接遷移:將過期URL永久重定向(301)到新地址
- 強制HTTPS/域名統一:自動跳轉http://到https://,或合并www與非www域名
- 動態路由:適配單頁應用(SPA),RESTful API 路由
- 灰度發布:按規則將部分流量導向新版本服務
(1)Nginx 正則
符號 | 含義 | 示例 |
---|---|---|
^ | 匹配字符串開頭 | ^/admin ?匹配以?/admin ?開頭的路徑 |
$ | 匹配字符串結尾 | .html$ ?匹配以?.html ?結尾的 URL |
. | 匹配任意單個字符(除換行符) | a.c ?匹配?abc 、aac |
\d | 匹配數字(等價于?[0-9] ) | user/\d+ ?→?user/123 |
\w | 匹配字母、數字、下劃線 | \w+ ?匹配?user_123 |
() | 分組捕獲,替換時用?$1 、$2 ?引用 | ^/(\w+)/(\d+)$ → /$1?id=$2 |
* | 匹配前一個字符 0 次或多次 | a* ?匹配空、a 、aa |
+ | 匹配前一個字符 1 次或多次 | \d+ ?匹配?1 、123 |
? | 匹配前一個字符 0 次或 1 次 | https? ?匹配?http ?或?https |
{n,m} | 匹配前一個字符 n 到 m 次 | a{2,4} ?匹配?aa 、aaa 、aaaa |
[abc] | 匹配括號內任意一個字符 | [aeiou] ?匹配元音字母 |
[^abc] | 匹配不在括號內的任意字符 | [^0-9] ?匹配非數字字符 |
(2)nginx location
- location 的語法:
location [匹配模式] {# 處理邏輯 (如 root, proxy_pass, rewrite 等) }
常用修飾符:
修飾符 作用 =
精確匹配(完全相等) ^~
前綴匹配(優先于正則匹配) ~
正則匹配(區分大小寫) ~*
正則匹配(不區分大小寫) 無修飾符 普通前綴匹配(優先級最低) -
location 的優先級規則:精確匹配 > 精確前綴匹配 > 正則匹配 (~ 和 ~* 同時存在時,文件中物理位置靠上的優先)> 普通前綴匹配 > 通用匹配
-
?Location 匹配流程
精確匹配:檢查是否有?
location =
?精確匹配當前 URI,若有則立即使用。前綴匹配:
????????查找最長匹配的普通前綴(無修飾符)。
????????檢查是否有?
^~
?前綴匹配,若有則停止后續正則匹配。正則匹配:按配置文件中的順序依次匹配,首次匹配成功后停止。
默認處理:若未匹配任何規則,使用普通前綴匹配的最長路徑
-
location 驗證:
(3)Rewrite
rewrite :
語法:rewrite <regex> <replacement> [flag];
regex:正則匹配URL字符串(只能對域名后邊的除去傳遞的參數外的字符串起作用)
replacement: 重寫跳轉后的地址
-
正則表達式:匹配請求 URI(如?
^/old/(.*)
)。 -
替換規則:生成新 URI(如?
/new/$1
)。 -
?Flag 類型:
Flag 作用 last
重寫后重新匹配新 URL 的 location 塊(類似循環,最多 10 次) break
立即停止處理后續規則,直接返回結果 redirect
返回 302 臨時重定向(瀏覽器地址欄顯示新 URL) permanent
返回 301 永久重定向(SEO 友好,瀏覽器緩存跳轉)
Nginx 跳轉:
- 1. server{ } 塊中的 rewrite
執行順序:在請求進入server塊后、匹配location前執行。
作用域:影響該server塊下所有請求(全局生效)。
- 2. location{ } 塊中的 rewrite
執行順序:在請求匹配到該 location 后執行。
作用域:僅對該 location 匹配的請求生效(局部生效)。
- 3. if{ } 塊中的 rewrite
執行順序:在滿足 if 條件時觸發。
作用域:依賴 if 表達式所在的上下文(如在server中或location中)
-
rewrite flag 驗證
驗證方法:查看響應頭:curl -I http://example.com/old-path # 輸出示例(301 重定向): # HTTP/1.1 301 Moved Permanently # Location: http://example.com/new-path 檢查 Nginx 日志:rewrite_log on; error_log /var/log/nginx/error.log notice; # 查看重寫過程日志
-
rewrite 中的捕獲組
小括號()用于定義正則表達式的捕獲組捕獲組“( )” 在正則表達式中, (pattern) 會匹配 pattern 并捕獲內容,按順序存入 $1, $2, $3 等變量中。引用方式 在 rewrite 的替換字符串中,通過 $1 表示第一個捕獲組,$2 表示第二個,依此類推。[root@ localhost ~]# vim /usr/local/nginx/conf/nginx.conf location / category/ {#匹配 / category/ tech/123, 捕獲 tech 到 $1,123 到 $2rewrite ^/ category/(.+)/(\d+)$ /archive/$1/$2 last; ) location /archive/ {#返回捕獲的分類和 IDreturn 200" Category: $1, ID: $2";測試訪問 [root@ localhost~]# curl http://localhost/category/tech/456 Category: tech, ID: 456
-
nginx 中的set指令
語法: set $variable valuevim /usr/local/nginx/conf/nginx.conflocation /demo {set $name "Nginx"; #定義變量 $namereturn 200 "Hello, $name!"; #輸出:Hello,Nginx! }測試: curl http://localhost/demo Hello,Nginx!
(4)實例:
1. 基于域名的跳轉
vim /usr/local/nginx/conf/nginx.conf
if ($host = 'www.kgc.com')
{
rewrite ^/(.*)$ http://www.newkgc.com/$1 permanent;
}
2. 基于客戶端IP訪問跳轉
vim /usr/local/nginx/conf/nginx.conf
set $rewrite true;
if ($remote_addr = "192.168.6.125") {
set $rewrite false;
}
if ($rewrite = true {
rewrite (.+) /maintenance.html;
}
location = /maintenance.html {
root /usr/share/nginx/html;
}