Nginx正反向代理與正則表達(dá)式詳解
Nginx作為一款高性能的開源Web服務(wù)器和反向代理工具,憑借其輕量級、高并發(fā)處理能力和靈活的模塊化設(shè)計,已成為現(xiàn)代Web架構(gòu)的基石。從全球頂尖網(wǎng)站到微服務(wù)架構(gòu),Nginx在負(fù)載均衡、緩存加速、安全防護(hù)等場景中扮演著關(guān)鍵角色。
一:正向代理
正向代理(Forward Proxy)是一種位于客戶端和原始服務(wù)器之間的代理服務(wù)器,其主要作用是將客戶端的請求轉(zhuǎn)發(fā)給目標(biāo)服務(wù)器,并將響應(yīng)返回給客戶端Nginx 的 正向代理 充當(dāng)客戶端的“中間人”,代表用戶訪問外部資源并隱藏真實 IP。它是企業(yè)內(nèi)網(wǎng)管控、安全審計與加速訪問的核心工具。用于場景一般是:
- 內(nèi)網(wǎng)訪問空制:限制員工訪問特定網(wǎng)站
- 匿名訪問:通過代理服務(wù)器隱藏用戶真實身份
- 資源緩存加速:緩存公共資源,減少外網(wǎng)帶寬消耗
1.編譯安裝nginx
(1)安裝支持軟件
Nginx 的配置及運(yùn)行需要 pcre、zlib 等軟件包的支持,因此應(yīng)預(yù)先安裝這些軟件的開發(fā)包(devel),以便提供相應(yīng)的庫和頭文件,確保 Nginx 的安裝順利完成。
(2)創(chuàng)建運(yùn)行用戶,組和日志目錄
(3)編譯安裝nginx
參數(shù)說明:
- --user=nginx 指定nginx運(yùn)行用戶
- --group=nginx 指定nginx運(yùn)行組
- --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轉(zhuǎn)發(fā)(默認(rèn)nginx不支持https轉(zhuǎn)發(fā),需要添加第三方模塊)
(2)驗證正向代理
用一臺新主機(jī),使用curl命令,并指定代理服務(wù)器進(jìn)行測試
二:反向代理
Nginx的七層(應(yīng)用層)反向代理基于 HTTP/HTTPS 協(xié)議,深度解析應(yīng)用層內(nèi)容(如 URL、Header、Cookie),將客戶端請求精準(zhǔn)轉(zhuǎn)發(fā)至后端服務(wù)器。作為企業(yè)級架構(gòu)的“智能調(diào)度器”,它實現(xiàn)了負(fù)載均衡、安全隔離與性能優(yōu)化的核心能力。應(yīng)用場景一般是:
- 負(fù)載均衡:將流量分發(fā)至多臺后端服務(wù)器,避免單點故障。
- 動靜分離:靜態(tài)資源(圖片、CSS/JS)由Nginx直接響應(yīng),動態(tài)請求(PHP、API)轉(zhuǎn)發(fā)至 Apache/Tomcat。
- SSL 終端:統(tǒng)一處理 HTTPS 加密/解密,降低后端服務(wù)器計算壓力。
- 灰度發(fā)布:根據(jù)請求特征(如IP、Header)將部分流量導(dǎo)向新版本服務(wù)。
Nginx的四層(網(wǎng)絡(luò)層)反向代理基于 TCP/UDP 協(xié)議,直接轉(zhuǎn)發(fā)原始數(shù)據(jù)流不解析應(yīng)用層內(nèi)容。它專為高性能、低延遲的傳輸層場景設(shè)計,是數(shù)據(jù)庫、游戲服務(wù)器等非 HTTP 服務(wù)的理想選擇。應(yīng)用場景一般是:
- 數(shù)據(jù)庫代理:對外暴露統(tǒng)一端口,內(nèi)部轉(zhuǎn)發(fā)至 MySQL、Redis 集群。
- 游戲服務(wù)器:代理 UDP 協(xié)議,實現(xiàn)實時數(shù)據(jù)包負(fù)載均衡
- SSH 跳板機(jī):通過端口映射安全訪問內(nèi)網(wǎng)服務(wù)器
- 高可用服務(wù):TCP服務(wù)(如 MQTT)的主備切換與健康檢查。
反向代理,指的是瀏覽器/客戶端并不知道自己要訪問具體哪臺目標(biāo)服務(wù)器只知道去訪問代理服務(wù)器 ,代理服務(wù)器再通過反向代理 +負(fù)載均衡實現(xiàn)請求分發(fā)到應(yīng)用服務(wù)器的一種代理服務(wù)。
反向代理服務(wù)的特點是代理服務(wù)器 代理的對象是應(yīng)用服務(wù)器,也就是對于瀏覽器/客戶端 來說應(yīng)用服務(wù)器是隱藏的。
操作系統(tǒng) | 配置 | ip | 服務(wù) |
OpenEuler | 2C4G | 192.168.10.101 | Nginx |
OpenEuler | 2C4G | 192.168.10.102 | Httpd |
1.配置nginx七層代理
(1)環(huán)境安裝
192.168.102上操作:
(2)配置nginx七層代理轉(zhuǎn)發(fā)
192.168.10.101上操作:
上述配置中,使用upstream定義后端應(yīng)用服務(wù)器的地址池“backend”,在1ocation塊中,使用proxy_pass,轉(zhuǎn)發(fā)請求至后端地址池,proxyset headerHost $host:將請求中的Host頭部設(shè)置為客戶端請求的主機(jī)名,proxy_set header X-Real-IP $remote addr:將請求中的 X-Real-IP 頭部設(shè)置為客戶端的真實 IP 地址。
驗證轉(zhuǎn)發(fā)效果
2.配置nginx四層代理
192.168.10.101上操作:
(2)驗證四層代理
通過101的2222端口登陸后,實際登陸的是102的服務(wù)器
三:nginx 緩存
Nginx的緩存功能是其核心能力之一,主要用于加速內(nèi)容響應(yīng)和降低后端服務(wù)器負(fù)載。它的緩存功能主要基于反向代理(Proxy Cache),但也可用于其他場景(如 FastCGI 緩存)。以下是詳細(xì)解析:
1.緩存功能的核心原理和緩存類型
緩存類型 | 作用場景 |
代理緩存 | 反向代理模式下緩存后端服務(wù)器(如 Tomcat、Apache)的響應(yīng)內(nèi)容。 |
FastCGI 緩存 | 緩存 PHP/Python 等通過 FastCGI 協(xié)議處理的動態(tài)內(nèi)容(需配FastCGI 緩存合 PHP-FPM 使用)。 |
uWSGI/SCGI 緩存 | 似 FastCGI,用于其他后端協(xié)議。 |
靜態(tài)資源緩存 | 通過 expires指令設(shè)置客戶端瀏覽器緩存(非服務(wù)端緩存) |
代理緩存:
代理緩存原則:
第一步:客戶端第一次向Nginx請求數(shù)據(jù)A;
第二步:當(dāng)Nginx發(fā)現(xiàn)緩存中沒有數(shù)據(jù)A時,會向服務(wù)端請求數(shù)據(jù)A;
第三步:服務(wù)端接收到Nginx發(fā)來的請求,則返回數(shù)據(jù)A到Nginx,并且緩存在Nginx;
第四步:Nginx返回數(shù)據(jù)A給客戶端應(yīng)用;
第五步:客戶端第二次向Nginx請求數(shù)據(jù)A;
第六步:主當(dāng)Nginx發(fā)現(xiàn)緩存中存在數(shù)據(jù)A時,則不會請求服務(wù)端:
第七步:Nginx把緩存中的數(shù)據(jù)A返回給客戶端應(yīng)用。
2.代理緩存功能設(shè)置
因代理緩存功能需在反向代理模式下緩存后端服務(wù)器(如 Tomcat、Apache)的響應(yīng)內(nèi)容。需要先配置七層反向代理
(2)設(shè)置緩存能
進(jìn)入/usr/local/nginx/conf/nginx.conf 配置文件
(3)驗證緩存功能
四:nginx rewrite 和正則表達(dá)式
在云計算與分布式架構(gòu)的時代,Nginx憑借其高性能、高并發(fā)處理能力以及模塊化設(shè)計,已成為現(xiàn)代Web服務(wù)的核心組件之一。它不僅是負(fù)載均衡、反向代理的首選工具,更是實現(xiàn)流量調(diào)度、安全防護(hù)和動態(tài)路由的關(guān)鍵樞紐。而在這其中,Rewrite模塊作為Nginx的“規(guī)則引擎”,扮演著至關(guān)重要的角色--它賦子開發(fā)者精準(zhǔn)控制URL的能力,讓請求的流轉(zhuǎn)不再受限于物理路徑,而是通過邏輯規(guī)則靈活適配業(yè)務(wù)需求。
Rewrite的應(yīng)用場景:
路徑美化:將/product/123 轉(zhuǎn)換為/index.php?id=123
舊鏈接遷移:將過期URL永久重定向(301)到新地址
強(qiáng)制HTTPS/域名統(tǒng)一:自動跳轉(zhuǎn)http://到https://,或合并www與非www域
名
動態(tài)路由:適配單頁應(yīng)用(SPA)、RESTfu1API路由
灰度發(fā)布:按規(guī)則將部分流量導(dǎo)向新版本服務(wù)
1.Nginx正則
字符 | 描述 |
^ | 匹配輸入字符串的起始位置 |
$ | 匹配輸入字符串的結(jié)束位置 |
* | 匹配前面的字符零次或多次。如“ol*"能匹配"o”及“ol”、“ol!” |
+ | 匹配前面的字符一次或多次。如“ol+”能匹配"o|"及“o|!”、“ol”,但不能匹配"o” |
? | 匹配前面的字符零次或一次,例如“do(es)?"能匹配“do"或者“does","?"等效于”{0,1}” |
. | 匹配除“n"之外的任何單個字符,若要匹配包括“"n"在內(nèi)的任意字符,請使用諸如“[.\n]”之類的模式 |
\ | 將后面接著的字符標(biāo)記為一個特殊字符或一個原義字符或一個向后引用。如“\n"匹配一個換行符,而“S"則匹配“S” |
\d | 匹配純數(shù)字 |
{n} | 重復(fù)n次 |
{n,} | 重復(fù)n次或更多次 |
{c} | 匹配單個字符c |
{a-z} | 匹配 a-z 小寫字母的任意一個 |
{a-zA-Z} | 匹配 a-z 小寫字母或 A-Z 大寫字母的任意一個 |
2.nginx location
在學(xué)習(xí)rewrite前還要了解下location,因為rewrite 通常會與 location結(jié)合使用,但并非絕對。
二者的協(xié)作能實現(xiàn)更精細(xì)的路徑控制,location是Nginx中用于匹配請求URI(路徑:只能對域名后邊的除去傳遞的參數(shù)外的字符串起作用,例如 http://www.kgc.com/index.php?id=1 只匹配/index.php )的核心指令,用于根據(jù)請求路徑定義不同的處理邏輯(如靜態(tài)資源服務(wù)、反向代理、重定向等)
模式 | 說明 |
llocation = / | 精確匹配:僅匹配完全相同的URI(優(yōu)先級最高)。 |
location ~ | 正則匹配:區(qū)分大小寫的正則表達(dá)式匹配。 |
location ~* | 正則匹配:不區(qū)分大小寫的正則表達(dá)式匹配。 |
location ~~ | 精確前綴匹配:匹配前綴路徑后,不再檢查正則匹配(優(yōu)先級高于正則) |
location / | 通用匹配:默認(rèn)方式,優(yōu)先級最低,其他方式匹配不到時匹配 |
location 的優(yōu)先級規(guī)則:
精確匹配 >精確前綴匹配 >正則匹配( 和~*同時存在時,文件中物理位置靠上的優(yōu)先)>普通前綴匹配 >通用匹配。
3.Rewrite 語法
regex:正則匹配URL字符串
只能對域名后邊的除去傳遞的參數(shù)外的字符串起regex:作用,例如 http://www.kgc.com/index.php?id=1 只對/index.php 重寫)
replacement:重寫跳轉(zhuǎn)后的地址
flag類型:
last:重寫后的 URI 會重新觸發(fā)location 匹配,并執(zhí)行新匹配到的location塊中的指令,是默認(rèn)類型
break:重寫后的 URI 不會重新匹配location,直接在當(dāng)前 location 中處理,且后續(xù)的rewrite 指令不再執(zhí)行
redirect:返回302臨時重定向,瀏覽器地址會顯示跳轉(zhuǎn)后的URL地址,爬蟲不會更新url(因為是臨時)
permanent:返回301永久重定向,瀏覽器地址欄會顯示跳轉(zhuǎn)后的URL地址:爬蟲更新url。
在實際工作的應(yīng)用中,Nginx跳轉(zhuǎn)需求有三種方式可實現(xiàn)。可以直接用rewrite 進(jìn)行匹配跳轉(zhuǎn),也可以使用 if 匹配全局變量后跳轉(zhuǎn)。另外,還可以使用location 匹配再跳轉(zhuǎn)。所以rewrite 只能放在 servert}、if{}、location{}配置段中:
server{} 塊中的 rewrite
執(zhí)行順序:在請求進(jìn)入server塊后、匹配location前執(zhí)行。
作用域:影響該server塊下所有請求(全局生效)。
location{} 塊中的rewrite
執(zhí)行順序:在請求匹配到該 location 后執(zhí)行。
作用域:僅對該 location 匹配的請求生效(局部生效)
if{} 塊中的 rewrite
執(zhí)行順序:在滿足 if 條件時觸發(fā)
作用域:依賴 if 表達(dá)式所在的上下文
(2)rewrite flag 驗證
配置完成后驗證
使用瀏覽器請求,發(fā)現(xiàn)內(nèi)容是 this is def 說明last 標(biāo)記后繼續(xù)向下匹配
將標(biāo)記改為break測試:
改為后,發(fā)現(xiàn)請求為找到頁面,說明使用break 后不繼續(xù)向下匹配
將標(biāo)記改為permanent 測試
該為permanent后,發(fā)現(xiàn)瀏覽器直接顯示跳轉(zhuǎn)后的地址
(3)rewrite 中的捕獲組
在 Nginx的 rewrite 指令中,小括號 ()用于定義正則表達(dá)式的捕獲組(Capture Group),捕獲的文本可以通過 $1,$2,$3 等變量在重寫后的 URI中引用
捕獲組“()”
在正則表達(dá)式中,(pattern)并捕獲內(nèi)容,按順序存會匹配 pattern 并捕獲內(nèi)容 ,按順序存入 $1 $2 $3 等變量中。
引用方式
在 rewrite 的替換字符中,通過 $1 表示第一個捕獲組,然后第二個,以此類推
測試訪問
(4)nginx中的set指令
在 Nginx 中,set 指令用于定義變量并賦值,這些變量可以用于后續(xù)的條件判斷、日志記錄、重寫規(guī)則等場景。它提供了靈活的動態(tài)配置能力,尤其在處理復(fù)雜的請求邏輯時非常有用。
測試訪問
到此這篇關(guān)于Nginx正反向代理與正則表達(dá)式的文章就介紹到這了,更多相關(guān)nginx正反向代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx配置proxy_pass代理轉(zhuǎn)發(fā)時報404問題
這篇文章主要介紹了nginx配置proxy_pass代理轉(zhuǎn)發(fā)時報404問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Nginx記錄分析響應(yīng)慢的請求及替換網(wǎng)站響應(yīng)內(nèi)容的配置
這篇文章主要介紹了Nginx記錄分析響應(yīng)慢的請求及替換網(wǎng)站響應(yīng)內(nèi)容的配置,分別用到了ngx_http_log_request_speed模塊和ngx_http_sub_module模塊,需要的朋友可以參考下2016-01-01nginx實現(xiàn)靜態(tài)文件的token認(rèn)證過程
這篇文章主要介紹了nginx實現(xiàn)靜態(tài)文件的token認(rèn)證過程,2024-06-06Nginx配置server_name為域名后無法訪問的問題解決
在Nginx的配置文件中增加服務(wù)器,其server_name設(shè)置為域名時,該網(wǎng)址不能正常訪問,所以本文給大家介紹了Nginx配置server_name為域名后無法訪問的問題解決,需要的朋友可以參考下2024-01-01nginx配置訪問圖片路徑以及html靜態(tài)頁面的調(diào)取方法
這篇文章主要介紹了詳解nginx配置訪問圖片路徑以及html靜態(tài)頁面的調(diào)取方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。2016-12-12Kubernetes中Nginx服務(wù)啟動失敗排查流程分析(Error:?ImagePullBackOff)
這篇文章主要介紹了Kubernetes中Nginx服務(wù)啟動失敗排查流程(Error:?ImagePullBackOff),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03