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