Nginx正反向代理與正則表達式詳解
Nginx作為一款高性能的開源Web服務器和反向代理工具,憑借其輕量級、高并發(fā)處理能力和靈活的模塊化設計,已成為現代Web架構的基石。從全球頂尖網站到微服務架構,Nginx在負載均衡、緩存加速、安全防護等場景中扮演著關鍵角色。
一:正向代理
正向代理(Forward Proxy)是一種位于客戶端和原始服務器之間的代理服務器,其主要作用是將客戶端的請求轉發(fā)給目標服務器,并將響應返回給客戶端Nginx 的 正向代理 充當客戶端的“中間人”,代表用戶訪問外部資源并隱藏真實 IP。它是企業(yè)內網管控、安全審計與加速訪問的核心工具。用于場景一般是:
- 內網訪問空制:限制員工訪問特定網站
- 匿名訪問:通過代理服務器隱藏用戶真實身份
- 資源緩存加速:緩存公共資源,減少外網帶寬消耗

1.編譯安裝nginx
(1)安裝支持軟件
Nginx 的配置及運行需要 pcre、zlib 等軟件包的支持,因此應預先安裝這些軟件的開發(fā)包(devel),以便提供相應的庫和頭文件,確保 Nginx 的安裝順利完成。

(2)創(chuàng)建運行用戶,組和日志目錄

(3)編譯安裝nginx


參數說明:
- --user=nginx 指定nginx運行用戶
- --group=nginx 指定nginx運行組
- --with-http _ssl module 支持https://
- --with-http v2 module 支持http版本2
- --with-http realip_module 支持ip透傳
- --with-http stub status module 支持狀態(tài)頁面
- --with-http_gzip_static module 支持壓縮
- --with-pcre 支持正則
- --with-stream 支持tcp反向代理
- --with-stream ssl module 支持tcp的ssl加密
- --with-stream realip module 支持tcp的透傳ip
- --add-module=./ngx http proxy connect module #支持https轉發(fā)(默認nginx不支持https轉發(fā),需要添加第三方模塊)



(2)驗證正向代理
用一臺新主機,使用curl命令,并指定代理服務器進行測試

二:反向代理
Nginx的七層(應用層)反向代理基于 HTTP/HTTPS 協(xié)議,深度解析應用層內容(如 URL、Header、Cookie),將客戶端請求精準轉發(fā)至后端服務器。作為企業(yè)級架構的“智能調度器”,它實現了負載均衡、安全隔離與性能優(yōu)化的核心能力。應用場景一般是:
- 負載均衡:將流量分發(fā)至多臺后端服務器,避免單點故障。
- 動靜分離:靜態(tài)資源(圖片、CSS/JS)由Nginx直接響應,動態(tài)請求(PHP、API)轉發(fā)至 Apache/Tomcat。
- SSL 終端:統(tǒng)一處理 HTTPS 加密/解密,降低后端服務器計算壓力。
- 灰度發(fā)布:根據請求特征(如IP、Header)將部分流量導向新版本服務。
Nginx的四層(網絡層)反向代理基于 TCP/UDP 協(xié)議,直接轉發(fā)原始數據流不解析應用層內容。它專為高性能、低延遲的傳輸層場景設計,是數據庫、游戲服務器等非 HTTP 服務的理想選擇。應用場景一般是:
- 數據庫代理:對外暴露統(tǒng)一端口,內部轉發(fā)至 MySQL、Redis 集群。
- 游戲服務器:代理 UDP 協(xié)議,實現實時數據包負載均衡
- SSH 跳板機:通過端口映射安全訪問內網服務器
- 高可用服務:TCP服務(如 MQTT)的主備切換與健康檢查。

反向代理,指的是瀏覽器/客戶端并不知道自己要訪問具體哪臺目標服務器只知道去訪問代理服務器 ,代理服務器再通過反向代理 +負載均衡實現請求分發(fā)到應用服務器的一種代理服務。
反向代理服務的特點是代理服務器 代理的對象是應用服務器,也就是對于瀏覽器/客戶端 來說應用服務器是隱藏的。
| 操作系統(tǒng) | 配置 | ip | 服務 |
| OpenEuler | 2C4G | 192.168.10.101 | Nginx |
| OpenEuler | 2C4G | 192.168.10.102 | Httpd |
1.配置nginx七層代理
(1)環(huán)境安裝
192.168.102上操作:


(2)配置nginx七層代理轉發(fā)
192.168.10.101上操作:


上述配置中,使用upstream定義后端應用服務器的地址池“backend”,在1ocation塊中,使用proxy_pass,轉發(fā)請求至后端地址池,proxyset headerHost $host:將請求中的Host頭部設置為客戶端請求的主機名,proxy_set header X-Real-IP $remote addr:將請求中的 X-Real-IP 頭部設置為客戶端的真實 IP 地址。

驗證轉發(fā)效果

2.配置nginx四層代理
192.168.10.101上操作:



(2)驗證四層代理


通過101的2222端口登陸后,實際登陸的是102的服務器
三:nginx 緩存
Nginx的緩存功能是其核心能力之一,主要用于加速內容響應和降低后端服務器負載。它的緩存功能主要基于反向代理(Proxy Cache),但也可用于其他場景(如 FastCGI 緩存)。以下是詳細解析:
1.緩存功能的核心原理和緩存類型
| 緩存類型 | 作用場景 |
| 代理緩存 | 反向代理模式下緩存后端服務器(如 Tomcat、Apache)的響應內容。 |
| FastCGI 緩存 | 緩存 PHP/Python 等通過 FastCGI 協(xié)議處理的動態(tài)內容(需配FastCGI 緩存合 PHP-FPM 使用)。 |
| uWSGI/SCGI 緩存 | 似 FastCGI,用于其他后端協(xié)議。 |
| 靜態(tài)資源緩存 | 通過 expires指令設置客戶端瀏覽器緩存(非服務端緩存) |
代理緩存:

代理緩存原則:
第一步:客戶端第一次向Nginx請求數據A;
第二步:當Nginx發(fā)現緩存中沒有數據A時,會向服務端請求數據A;
第三步:服務端接收到Nginx發(fā)來的請求,則返回數據A到Nginx,并且緩存在Nginx;
第四步:Nginx返回數據A給客戶端應用;
第五步:客戶端第二次向Nginx請求數據A;
第六步:主當Nginx發(fā)現緩存中存在數據A時,則不會請求服務端:
第七步:Nginx把緩存中的數據A返回給客戶端應用。
2.代理緩存功能設置
因代理緩存功能需在反向代理模式下緩存后端服務器(如 Tomcat、Apache)的響應內容。需要先配置七層反向代理


(2)設置緩存能
進入/usr/local/nginx/conf/nginx.conf 配置文件


(3)驗證緩存功能

四:nginx rewrite 和正則表達式
在云計算與分布式架構的時代,Nginx憑借其高性能、高并發(fā)處理能力以及模塊化設計,已成為現代Web服務的核心組件之一。它不僅是負載均衡、反向代理的首選工具,更是實現流量調度、安全防護和動態(tài)路由的關鍵樞紐。而在這其中,Rewrite模塊作為Nginx的“規(guī)則引擎”,扮演著至關重要的角色--它賦子開發(fā)者精準控制URL的能力,讓請求的流轉不再受限于物理路徑,而是通過邏輯規(guī)則靈活適配業(yè)務需求。
Rewrite的應用場景:
路徑美化:將/product/123 轉換為/index.php?id=123
舊鏈接遷移:將過期URL永久重定向(301)到新地址
強制HTTPS/域名統(tǒng)一:自動跳轉http://到https://,或合并www與非www域
名
動態(tài)路由:適配單頁應用(SPA)、RESTfu1API路由
灰度發(fā)布:按規(guī)則將部分流量導向新版本服務
1.Nginx正則
| 字符 | 描述 |
| ^ | 匹配輸入字符串的起始位置 |
| $ | 匹配輸入字符串的結束位置 |
| * | 匹配前面的字符零次或多次。如“ol*"能匹配"o”及“ol”、“ol!” |
| + | 匹配前面的字符一次或多次。如“ol+”能匹配"o|"及“o|!”、“ol”,但不能匹配"o” |
| ? | 匹配前面的字符零次或一次,例如“do(es)?"能匹配“do"或者“does","?"等效于”{0,1}” |
| . | 匹配除“n"之外的任何單個字符,若要匹配包括“"n"在內的任意字符,請使用諸如“[.\n]”之類的模式 |
| \ | 將后面接著的字符標記為一個特殊字符或一個原義字符或一個向后引用。如“\n"匹配一個換行符,而“S"則匹配“S” |
| \d | 匹配純數字 |
| {n} | 重復n次 |
| {n,} | 重復n次或更多次 |
| {c} | 匹配單個字符c |
| {a-z} | 匹配 a-z 小寫字母的任意一個 |
| {a-zA-Z} | 匹配 a-z 小寫字母或 A-Z 大寫字母的任意一個 |
2.nginx location
在學習rewrite前還要了解下location,因為rewrite 通常會與 location結合使用,但并非絕對。
二者的協(xié)作能實現更精細的路徑控制,location是Nginx中用于匹配請求URI(路徑:只能對域名后邊的除去傳遞的參數外的字符串起作用,例如 http://www.kgc.com/index.php?id=1 只匹配/index.php )的核心指令,用于根據請求路徑定義不同的處理邏輯(如靜態(tài)資源服務、反向代理、重定向等)

| 模式 | 說明 |
| llocation = / | 精確匹配:僅匹配完全相同的URI(優(yōu)先級最高)。 |
| location ~ | 正則匹配:區(qū)分大小寫的正則表達式匹配。 |
| location ~* | 正則匹配:不區(qū)分大小寫的正則表達式匹配。 |
| location ~~ | 精確前綴匹配:匹配前綴路徑后,不再檢查正則匹配(優(yōu)先級高于正則) |
| location / | 通用匹配:默認方式,優(yōu)先級最低,其他方式匹配不到時匹配 |
location 的優(yōu)先級規(guī)則:
精確匹配 >精確前綴匹配 >正則匹配( 和~*同時存在時,文件中物理位置靠上的優(yōu)先)>普通前綴匹配 >通用匹配。
3.Rewrite 語法

regex:正則匹配URL字符串
只能對域名后邊的除去傳遞的參數外的字符串起regex:作用,例如 http://www.kgc.com/index.php?id=1 只對/index.php 重寫)
replacement:重寫跳轉后的地址
flag類型:
last:重寫后的 URI 會重新觸發(fā)location 匹配,并執(zhí)行新匹配到的location塊中的指令,是默認類型
break:重寫后的 URI 不會重新匹配location,直接在當前 location 中處理,且后續(xù)的rewrite 指令不再執(zhí)行
redirect:返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址,爬蟲不會更新url(因為是臨時)
permanent:返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址:爬蟲更新url。
在實際工作的應用中,Nginx跳轉需求有三種方式可實現??梢灾苯佑胷ewrite 進行匹配跳轉,也可以使用 if 匹配全局變量后跳轉。另外,還可以使用location 匹配再跳轉。所以rewrite 只能放在 servert}、if{}、location{}配置段中:
server{} 塊中的 rewrite
執(zhí)行順序:在請求進入server塊后、匹配location前執(zhí)行。
作用域:影響該server塊下所有請求(全局生效)。
location{} 塊中的rewrite
執(zhí)行順序:在請求匹配到該 location 后執(zhí)行。
作用域:僅對該 location 匹配的請求生效(局部生效)
if{} 塊中的 rewrite
執(zhí)行順序:在滿足 if 條件時觸發(fā)
作用域:依賴 if 表達式所在的上下文
(2)rewrite flag 驗證



配置完成后驗證

使用瀏覽器請求,發(fā)現內容是 this is def 說明last 標記后繼續(xù)向下匹配
將標記改為break測試:


改為后,發(fā)現請求為找到頁面,說明使用break 后不繼續(xù)向下匹配
將標記改為permanent 測試

該為permanent后,發(fā)現瀏覽器直接顯示跳轉后的地址
(3)rewrite 中的捕獲組
在 Nginx的 rewrite 指令中,小括號 ()用于定義正則表達式的捕獲組(Capture Group),捕獲的文本可以通過 $1,$2,$3 等變量在重寫后的 URI中引用
捕獲組“()”
在正則表達式中,(pattern)并捕獲內容,按順序存會匹配 pattern 并捕獲內容 ,按順序存入 $1 $2 $3 等變量中。
引用方式
在 rewrite 的替換字符中,通過 $1 表示第一個捕獲組,然后第二個,以此類推

測試訪問

(4)nginx中的set指令
在 Nginx 中,set 指令用于定義變量并賦值,這些變量可以用于后續(xù)的條件判斷、日志記錄、重寫規(guī)則等場景。它提供了靈活的動態(tài)配置能力,尤其在處理復雜的請求邏輯時非常有用。


測試訪問

到此這篇關于Nginx正反向代理與正則表達式的文章就介紹到這了,更多相關nginx正反向代理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Kubernetes部署Springboot或Nginx的詳細教程
這篇文章主要介紹了用Kubernetes部署Springboot或Nginx的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
Nginx HttpMemcModule和直接訪問memcached效率對比測試
2013-09-09
云服務器使用寶塔搭建Python環(huán)境,運行django程序
本文詳細講解了在云服務器使用寶塔搭建Python環(huán)境,運行django程序的方法。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-12-12

