目錄
一、引言
二、正向代理
(一)正向代理基礎概念
(二)Nginx 正向代理安裝配置
(三)正向代理配置與驗證
三、反向代理
(一)反向代理原理與應用場景
(二)配置 Nginx 七層代理
(三)配置 Nginx 四層代理
四、Nginx 緩存
(一)緩存功能的核心原理和緩存類型
(二)代理緩存功能設置
五、Nginx rewrite 和正則
(一)Nginx 正則
(二)nginx location
(三)Rewrite
一、引言
Nginx 是一款在現代 Web 架構中占據重要地位的高性能開源軟件,它集 Web 服務器、反向代理、負載均衡等多種功能于一身。其強大的功能和出色的性能,使得它在各類 Web 應用場景中廣泛應用,從大型網站的流量處理到微服務架構中的服務代理,Nginx 都發揮著關鍵作用。本筆記將深入探討 Nginx 的四大核心功能:正向代理、反向代理、緩存以及 rewrite 和正則表達式的應用,通過理論與實踐相結合的方式,幫助讀者全面掌握 Nginx 的核心技術要點。
二、正向代理
(一)正向代理基礎概念
正向代理是客戶端與目標服務器之間的中間服務器。它的主要作用是代表客戶端向目標服務器發起請求,并將目標服務器的響應返回給客戶端。在實際應用中,正向代理常用于企業內網訪問控制、匿名訪問以及資源緩存加速等場景。例如,企業可以利用正向代理限制員工訪問特定的網站,如社交媒體,以提高工作效率和保障網絡安全;用戶可以通過正向代理隱藏自己的真實 IP 地址,實現匿名訪問互聯網;同時,正向代理還可以緩存公共資源,如軟件包、鏡像文件等,減少外網帶寬的消耗,加快資源的訪問速度。
(二)Nginx 正向代理安裝配置
- 安裝支持軟件:Nginx 的編譯和運行依賴于一些軟件包,如 pcre、zlib 等。在安裝 Nginx 之前,需要先安裝這些軟件的開發包(devel),以提供相應的庫和頭文件。在 CentOS 系統中,可以使用以下命令進行安裝:
[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
這些軟件包分別為 Nginx 提供了不同的功能支持,gcc 和 make 用于編譯 Nginx 源代碼,pcre-devel 提供正則表達式支持,zlib-devel 用于數據壓縮,openssl-devel 用于支持 HTTPS,perl-ExtUtils-MakeMaker 用于構建和安裝 Perl 擴展,git 用于獲取第三方模塊,wget 用于下載文件,tar 用于解壓文件。
- 創建運行用戶、組和日志目錄:為了提高安全性和便于管理,建議為 Nginx 創建專門的用戶和組。創建一個名為 nginx 的用戶,不創建宿主文件夾,并且禁止該用戶登錄到 Shell 環境。同時,創建 Nginx 的日志目錄,并設置相應的權限:
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx:nginx /var/log/nginx
這樣,Nginx 服務將以 nginx 用戶和組的身份運行,降低了安全風險,并且所有的日志文件都將由 nginx 用戶和組進行管理。
- 編譯安裝 Nginx:下載 Nginx 的源代碼包(如 nginx-1.26.3_http_proxy.tar.gz)并解壓,然后進入解壓后的目錄進行配置。在配置過程中,需要指定安裝目錄、運行用戶和組、啟用的模塊等。由于默認的 Nginx 不支持轉發 https 請求,因此需要添加第三方模塊(如 ngx_http_proxy_connect_module)來實現該功能。具體的命令如下:
[root@localhost ~]# tar zxf nginx-1.26.3_http_proxy.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --with-http_gzip_static_module --add-module=./ngx_http_proxy_connect_module
[root@localhost nginx-1.26.3]# make && make install
在上述配置中,各個參數的含義如下:
--prefix=/usr/local/nginx
:指定 Nginx 的安裝目錄為 /usr/local/nginx。--user=nginx
和--group=nginx
:指定 Nginx 的運行用戶和組為 nginx。--with-http_ssl_module
:啟用對 HTTPS 的支持。--with-http_v2_module
:支持 HTTP/2 協議。--with-http_realip_module
:用于獲取客戶端的真實 IP 地址。--with-http_stub_status_module
:可以查看 Nginx 的連接狀態等統計信息。--with-http_gzip_static_module
:啟用對靜態文件的 gzip 壓縮功能,提高傳輸效率。--with-pcre
:支持正則表達式,這在 Nginx 的配置中非常重要,例如在 rewrite 規則中經常會用到。--with-stream
:支持 TCP 和 UDP 反向代理。--with-stream_ssl_module
:為 TCP 反向代理提供 SSL 加密支持。--with-stream_realip_module
:在 TCP 反向代理中獲取客戶端的真實 IP 地址。--add-module=./ngx_http_proxy_connect_module
:添加第三方模塊,以支持 https 請求的轉發。
安裝完成后,為了方便使用,可以為 Nginx 的主程序創建一個鏈接文件,這樣就可以在任意目錄下直接執行 nginx 命令:
[root@localhost nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
- 添加 Nginx 系統服務:為了便于管理 Nginx 服務的啟動、停止、重啟等操作,可以將 Nginx 添加為系統服務。在 CentOS 系統中,可以通過編寫 systemd 服務腳本來實現。創建一個名為 nginx.service 的文件,內容如下:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root[Install]
WantedBy=multi-user.target
上述配置中,[Unit]
部分用于描述服務的基本信息,After=network.target
表示 Nginx 服務在網絡服務啟動之后啟動;[Service]
部分定義了服務的啟動、停止、重啟等操作的命令,ExecStartPre=/usr/local/sbin/nginx -t
用于在啟動前檢查 Nginx 配置文件的語法正確性,ExecStart=/usr/local/sbin/nginx
用于啟動 Nginx 服務,ExecReload=/usr/local/sbin/nginx -s reload
用于重新加載配置文件,ExecStop=/bin/kill -s QUIT $MAINPID
用于停止 Nginx 服務;[Install]
部分定義了服務的安裝信息,WantedBy=multi-user.target
表示該服務在多用戶模式下被啟用。
保存文件后,重新加載 systemd 服務配置,啟動 Nginx 服務,并設置為開機自啟:
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx
(三)正向代理配置與驗證
- 配置正向代理:編輯 Nginx 的主配置文件(/usr/local/nginx/conf/nginx.conf),添加正向代理的相關配置。在配置中,需要指定代理監聽的端口、解析域名的 DNS 服務器、啟用代理 CONNECT 方法(以支持 HTTPS)、設置連接超時時間等。同時,在 location 塊中配置代理轉發規則:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
在文件中添加或修改以下內容:
server {listen 8080; # 代理監聽端口server_name proxy.example.com;resolver 8.8.8.8 1.1.1.1; # 解析域名使用的DNS服務器,多個DNS用空格分隔proxy_connect; # 啟用代理CONNECT方法,支持HTTPSproxy_connect_allow 443 80; # 允許代理到80和443端口proxy_connect_connect_timeout 10s;proxy_connect_read_timeout 10s;proxy_connect_send_timeout 10s;location / {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 "";}
}
在上述配置中,listen
指定了代理監聽的端口為 8080;server_name
指定了代理服務器的域名;resolver
指定了用于解析域名的 DNS 服務器;proxy_connect
啟用了代理 CONNECT 方法,使得代理服務器可以支持 HTTPS 請求;proxy_connect_allow
允許代理到 80 和 443 端口;proxy_connect_connect_timeout
、proxy_connect_read_timeout
和proxy_connect_send_timeout
分別設置了連接、讀取和發送數據的超時時間;在location /
塊中,proxy_pass
指定了代理轉發的目標地址,使用$scheme://$http_host$request_uri
實現了動態協議轉發,proxy_set_header
用于設置請求頭信息,proxy_buffers
和proxy_max_temp_file_size
用于優化緩沖區設置,proxy_http_version
指定了使用的 HTTP 版本,proxy_set_header Connection ""
用于保持連接。
保存配置文件后,檢查配置文件的語法正確性,并重新加載 Nginx 配置:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
- 驗證正向代理:在 Windows 系統中,可以使用火狐瀏覽器進行驗證。打開火狐瀏覽器的設置,找到網絡代理選項,設置 http 和 https 代理為 Nginx 正向代理服務器的 IP 和端口(如 192.168.10.101:8080)。在 Linux 系統中,可以使用 curl 命令進行驗證,指定代理服務器進行訪問測試:
[root@localhost ~]# curl -x http://192.168.10.101:8080 www.baidu.com
通過查看 Nginx 的訪問日志(位于 /var/log/nginx 目錄下),可以確認正向代理功能是否正常。如果日志中記錄了通過代理服務器的訪問請求,并且隱藏了真實 IP 地址,說明正向代理配置成功。
三、反向代理
(一)反向代理原理與應用場景
Nginx 的反向代理分為七層(應用層)反向代理和四層(網絡層)反向代理。七層反向代理基于 HTTP/HTTPS 協議,能夠深入解析應用層的內容,如 URL、Header、Cookie 等,并根據這些信息將客戶端的請求精準地轉發至后端服務器。它在負載均衡、動靜分離、SSL 終端、灰度發布等場景中發揮著重要作用。例如,在負載均衡場景中,七層反向代理可以將流量均勻地分發到多臺后端服務器上,避免單點故障,提高系統的可用性;在動靜分離場景中,靜態資源(如圖片、CSS、JS 文件)可以由 Nginx 直接響應,而動態請求(如 PHP、API 請求)則轉發至后端的 Apache 或 Tomcat 服務器,提高資源的訪問效率;在 SSL 終端場景中,Nginx 可以統一處理 HTTPS 加密和解密,降低后端服務器的計算壓力;在灰度發布場景中,根據請求的特征(如 IP 地址、Header 信息等),可以將部分流量導向新版本的服務,實現服務的平滑升級。
四層反向代理基于 TCP/UDP 協議,直接轉發原始數據流,不解析應用層內容。它適用于對性能和延遲要求較高的傳輸層場景,如數據庫代理、游戲服務器、SSH 跳板機、高可用服務等。例如,在數據庫代理場景中,四層反向代理可以對外暴露統一的端口,內部將請求轉發至 MySQL、Redis 集群,實現對數據庫的統一訪問;在游戲服務器場景中,代理 UDP 協議,實現實時數據包的負載均衡,保障游戲的流暢運行;在 SSH 跳板機場景中,通過端口映射實現安全訪問內網服務器;在高可用服務場景中,實現 TCP 服務(如 MQTT)的主備切換與健康檢查,確保服務的高可用性。
(二)配置 Nginx 七層代理
- 環境準備:在后端服務器(如 192.168.10.102)上,關閉防火墻,安裝 httpd 服務,并創建一個測試頁面:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# dnf install httpd -y
[root@localhost ~]# echo "這是后端主機" > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
上述命令分別停止了防火墻,安裝了 httpd 服務,創建了一個簡單的測試頁面,并啟動了 httpd 服務。
- 配置七層代理轉發:在 Nginx 服務器(如 192.168.10.101)上,編輯 Nginx 的配置文件,定義后端應用服務器的地址池,并配置請求轉發規則。打開 Nginx 配置文件(/usr/local/nginx/conf/nginx.conf),添加或修改以下內容:
http {upstream backend {server 192.168.10.102:80; # 后端主機設置}server {listen 80;server_name example.com;location / {proxy_pass http://backend; # 請求轉發proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}
在上述配置中,upstream backend
定義了后端應用服務器的地址池,server 192.168.10.102:80
指定了后端服務器的 IP 地址和端口;在server
塊中,listen 80
指定了 Nginx 監聽的端口,server_name example.com
指定了域名;在location /
塊中,proxy_pass http://backend
將請求轉發至后端地址池,proxy_set_header Host $host
將請求中的 Host 頭部設置為客戶端請求的主機名,proxy_set_header X-Real-IP $remote_addr
將請求中的 X - Real - IP 頭部設置為客戶端的真實 IP 地址。
保存配置文件后,檢查配置文件的語法正確性,并重新加載 Nginx 配置:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
- 驗證轉發效果:在 Nginx 服務器上,使用 curl 命令訪問 Nginx 的 IP 地址,驗證請求是否成功轉發至后端 httpd 服務:
[root@localhost ~]# curl 192.168.10.101
如果返回 “這是后端主機”,說明七層代理轉發配置成功。后端地址池中還可以定義多臺主機,實現負載均衡,相關內容將在后續進一步學習。
(三)配置 Nginx 四層代理
- 配置四層代理:以代理 SSH 請求至后端服務器為例,在 Nginx 服務器(如 192.168.10.101)上編輯 Nginx 配置文件。打開 Nginx 配置文件(/usr/local/nginx/conf/nginx.conf),添加或修改以下內容:
stream {upstream ssh_cluster {server 192.168.10.102:22; # 后端地址和服務端口}server {listen 2222;proxy_pass ssh_cluster;proxy_connect_timeout 5s; # 連接超時時間proxy_timeout 1h; # 長連接保持時間}
}
在上述配置中,stream
模塊用于配置四層代理,upstream ssh_cluster
定義了后端地址池,server 192.168.10.102:22
指定了后端 SSH 服務器的 IP 地址和端口;在server
塊中,listen 2222
指定了 Nginx 監聽的端口,proxy_pass ssh_cluster
將請求轉發至后端地址池,proxy_connect_timeout 5s
設置了連接超時時間,proxy_timeout 1h
設置了長連接保持時間。
需要注意的是,stream
模塊需要與http
模塊平級,不能在http
模塊中嵌套。保存配置文件后,檢查配置文件的語法正確性,并重新加載 Nginx 配置,同時檢查端口監聽情況:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
[root@localhost ~]# ss -nlpt | grep 2222
- 驗證四層代理:在本地使用 ssh 命令連接 Nginx 服務器的代理端口(如 2222),驗證是否能成功登錄到后端服務器:
[root@localhost ~]# ssh root@192.168.10.101 -p2222
登錄后,使用 ifconfig 命令查看網絡配置,確認是否登錄到了正確的后端服務器。如果能成功登錄并看到后端服務器的網絡配置,說明四層代理配置成功。
四、Nginx 緩存
(一)緩存功能的核心原理和緩存類型
- 代理緩存:在反向代理場景下,Nginx 從后端服務器(如 Tomcat、Apache)獲取響應內容并緩存。當客戶端首次請求數據時,Nginx 若發現緩存中沒有該數據,會向后端服務器請求,獲取數據后返回給客戶端并緩存。后續客戶端再次請求相同數據時,Nginx 直接從緩存中讀取并返回,減少后端服務器負載和響應時間。
- FastCGI 緩存:主要用于緩存通過 FastCGI 協議處理的動態內容,像 PHP、Python 等語言生成的頁面數據。使用時通常需配合 PHP - FPM 等 FastCGI 進程管理器,提升動態內容的訪問速度。
- uWSGI/SCGI 緩存:與 FastCGI 緩存類似,針對使用 uWSGI 或 SCGI 協議的后端應用,為這類應用提供緩存加速。
- 靜態資源緩存:通過 expires 指令設置客戶端瀏覽器緩存靜態資源(如圖片、CSS、JS 文件)的時間。這并非服務端緩存,而是讓客戶端在指定時間內直接從本地緩存讀取資源,減少對服務端的請求。
(二)代理緩存功能設置
- 反向代理配置:首先要配置好七層反向代理,確保 Nginx 能正確轉發請求到后端服務器。這部分配置與之前七層反向代理的配置類似,在 Nginx 配置文件中定義后端地址池和請求轉發規則:
http {upstream backend {server 192.168.10.102:80;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}
- 設置緩存功能:創建緩存目錄并設置權限,然后在 Nginx 配置文件中定義緩存路徑、參數、緩存鍵、緩存有效期等。
- 創建緩存目錄并設置權限:
[root@localhost ~]# mkdir -p /data/nginx/cache
[root@localhost ~]# chown nginx:nginx /data/nginx/cache -R
- 編輯 Nginx 配置文件添加緩存相關配置:
http {proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g use_temp_path=off;server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_cache my_cache;proxy_cache_key "$scheme$request_method$host$request_uri";proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;proxy_cache_valid any 5s;add_header X-Cache-Status $upstream_cache_status;}}
}
- 關鍵配置解析:
proxy_cache_path
:定義緩存文件存儲路徑為/data/nginx/cache
。levels=1:2
:表示緩存目錄層級結構,將緩存文件按特定規則分布在不同層級目錄,提高查找效率。keys_zone=my_cache:10m
:定義名為my_cache
的共享內存區域,大小為 10m,用于存儲緩存鍵和元數據(如過期時間)。每 1MB 共享內存大約可存儲 8000 個鍵。inactive=60m
:設置緩存內容的閑置有效期為 60 分鐘。若 60 分鐘內緩存內容未被訪問,將被自動刪除。max_size=1g
:限制緩存目錄最大磁盤空間為 1GB。當緩存量達到 1GB 時,Nginx 啟動 LRU(最近最少使用)算法清理舊緩存,為新緩存騰出空間。use_temp_path=off
:推薦設置為 off,使臨時文件與緩存文件存儲在同一目錄,減少磁盤 I/O 操作,提升性能。
- 驗證緩存功能:使用 curl 命令驗證緩存功能。首次請求時,查看響應頭中的
X - Cache - Status
字段,應為MISS
,表示未命中緩存;再次請求時,該字段應為HIT
,表示命中緩存。同時,可查看緩存目錄(/data/nginx/cache
)確認數據已被緩存:
[root@localhost ~]# curl -I 192.168.10.101
[root@localhost ~]# curl -I 192.168.10.101
[root@localhost ~]# ls /data/nginx/cache
五、Nginx rewrite 和正則
(一)Nginx 正則
- 常用正則表達式元字符:在學習 Nginx 的 Rewrite 模塊前,需要熟悉正則表達式。常用的正則表達式元字符如下:
^
:匹配輸入字符串的起始位置。例如,^hello
表示匹配以hello
開頭的字符串。$
:匹配輸入字符串的結束位置。例如,world$
表示匹配以world
結尾的字符串。*
:匹配前面的字符零次或多次。例如,go*
能匹配g
、go
、goo
等。+
:匹配前面的字符一次或多次。例如,go+
能匹配go
、goo
,但不能匹配g
。?
:匹配前面的字符零次或一次。例如,colou?r
能匹配color
或colour
。.
:匹配除\n
之外的任何單個字符。若要匹配包括\n
在內的任意字符,可使用[\s\S]
。\
:將后面接著的字符標記為一個特殊字符、原義字符或向后引用。例如,\n
匹配一個換行符,\\
匹配\
。\d
:匹配純數字。例如,\d+
能匹配一個或多個數字組成的字符串。{n}
:重復 n 次。例如,a{3}
匹配aaa
。{n,}
:重復 n 次或更多次。例如,a{3,}
匹配aaa
、aaaa
等。[c]
:匹配單個字符c
。例如,[abc]
匹配a
、b
或c
。[a - z]
:匹配a - z
小寫字母的任意一個。例如,[a - z]+
匹配由小寫字母組成的字符串。[a - zA - Z]
:匹配a - z
小寫字母或A - Z
大寫字母的任意一個。
- 應用場景:Nginx 正則表達式在 Rewrite 規則中廣泛應用,如路徑美化(將
/product/123
轉換為/index.php?id=123
)、舊鏈接遷移(將過期 URL 永久重定向到新地址)、強制 HTTPS / 域名統一(自動跳轉http://
到https://
,合并www
與非www
域名)、動態路由(適配單頁應用、RESTful API 路由)、灰度發布(按規則將部分流量導向新版本服務)等場景。
(二)nginx location
- 語法與匹配模式:location 是 Nginx 中用于匹配請求 URI(路徑,僅對域名后邊除去傳遞參數外的字符串起作用)的核心指令,用于根據請求路徑定義不同的處理邏輯。其語法為
location [匹配模式] {處理邏輯(如root, proxy_pass, rewrite等)}
,匹配模式類型包括:location /uri
:普通前綴匹配,匹配以指定路徑開頭的 URI。例如,location /static/
匹配以/static/
開頭的 URI。location = /
:精確匹配,僅匹配完全相同的 URI,優先級最高。例如,location = /index.html
只匹配/index.html
。location ~
:區分大小寫的正則表達式匹配。例如,location ~ \.jpg$
匹配以.jpg
結尾的 URI。location ~*
:不區分大小寫的正則表達式匹配。例如,location ~* \.jpg$
匹配以.jpg
或.JPG
結尾的 URI。location ^~
:精確前綴匹配,匹配前綴路徑后,不再檢查正則匹配,優先級高于正則。例如,location ^~ /static/
匹配以/static/
開頭的 URI,且不再進行正則匹配。location /
:通用匹配,默認方式,優先級最低,其他方式匹配不到時匹配。
- 優先級規則:精確匹配 > 精確前綴匹配 > 正則匹配(
^~
和~
/~*
同時存在時,文件中物理位置靠上的優先) > 普通前綴匹配 > 通用匹配。 - 驗證示例:編輯 Nginx 配置文件進行 location 驗證:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
添加如下內容:
location / {return 200 "通用匹配";
}
location /abc {return 200 "普通前綴匹配";
}
location ~ /test/abcdef {return 200 "區分大小寫正則";
}
location ~* /test/abc {return 200 "不區分大小寫正則";
}
location ^~ /abcdef {return 200 "精確前綴匹配";
}
location = /abc {return 200 "精確匹配";
}
保存并重新加載 Nginx 配置:
[root@localhost ~]# nginx -s reload
使用 curl 命令測試不同的 URI:
[root@localhost ~]# curl 192.168.10.101/abc
每次請求192.168.10.101/abc
后,按優先級順序依次注釋配置文件中的 location,會發現每次的響應內容發生變更。使用正則模式時,URI 部分可以使用正則表達式,例如:
location ~ \. (jpg|png|gif)$ {# 處理圖片請求的邏輯
}
(三)Rewrite
- 語法與執行順序:Rewrite 用于對 URL 進行重寫,其語法為
rewrite <regex><replacement> [flag];
。其中,regex
是用于正則匹配 URL 字符串的表達式(僅對域名后邊除去傳遞參數外的字符串起作用),replacement
是重寫跳轉后的地址,flag
有以下幾種類型:last
:重寫后的 URI 會重新觸發 location 匹配,并執行新匹配到的 location 塊中的指令,是默認類型。break
:重寫后的 URI 不會重新匹配 location,直接在當前 location 中處理,且后續的 rewrite 指令不再執行。redirect
:返回 302 臨時重定向,瀏覽器地址會顯示跳轉后的 URL 地址,爬蟲不會更新 url(因為是臨時)。permanent
:返回 301 永久重定向,瀏覽器地址欄會顯示跳轉后的 URL 地址,爬蟲更新 url。- Rewrite 可以放在
server{}
、if{}
、location{}
配置段中,在不同配置段中的執行順序和作用域不同:server{}
中的 rewrite:在請求進入 server 塊后、匹配 location 前執行,影響該 server 塊下所有請求(全局生效)。location{}
塊中的 rewrite:在請求匹配到該 location 后執行,僅對該 location 匹配的請求生效(局部生效)。if{}
塊中的 rewrite:在滿足 if 條件時觸發,作用域依賴 if 表達式所在的上下文(如在 server 中或 location 中)。
- flag 驗證示例:編輯 Nginx 配置文件進行 flag 驗證:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
添加如下內容進行last
標記驗證:
default_type text/plain;
location /abc {rewrite ^/ /def last;
}
location /def {return 200 "this is def";
}
保存并重新加載 Nginx 配置,使用瀏覽器請求,會發現響應內容是this is def
,說明last
標記后繼續向下匹配 location。
修改配置文件進行break
標記驗證:
default_type text/plain;
location /abc {rewrite ^/ /def break;
}
location /def {return 200 "this is def";
}
重新加載配置后使用瀏覽器請求,會發現請求頁面未找到,說明break
標記使用當前結果不繼續向下匹配了。
類似地,對redirect
和permanent
標記進行驗證,修改配置文件:
default_type text/plain;
location /abc {rewrite ^/ /def redirect;
}
location /def {return 200 "this is def";
}
重新加載配置后使用瀏覽器請求,會發現請求頁面 302 跳轉,并且地址欄顯示的是跳轉后的地址。
將redirect
改為permanent
進行驗證,會發現請求頁面 301 跳轉,并且地址欄顯示的是跳轉后的地址。
3.?捕獲組與引用:在 Nginx 的 rewrite 指令中,小括號()
用于定義正則表達式的捕獲組(Capture Group)。捕獲的文本可以通過$1
、$2
、$3
等變量在重寫后的 URI 中引用。例如:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
添加如下內容:
location /category/ {rewrite ^/category/(.+)/(\d+)$ /archive/$1/$2 last;
}
location /archive/ {return 200 "Category: $1, ID: $2";
}
測試訪問:
[root@localhost ~]# curl http://localhost/category/tech/456
會返回Category: tech, ID: 456
,說明捕獲組正常工作。
4.?set 指令:在 Nginx 中,set
指令用于定義變量并賦值,這些變量可以用于后續的條件判斷、日志記錄、重寫規則等場景。語法為set $variable value;
。例如:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
添加如下內容:
location /demo {set $name "Nginx";return 200 "Hello, $name!";
}
測試訪問:
[root@localhost ~]# curl http://localhost/demo
會返回Hello, Nginx!
,說明set
指令正常工作。