Nginx的核心功能--正向代理、反向代理、緩存和Rewrite
Nginx作為一款高性能的開源Web服務(wù)器和反向代理工具,憑借其輕量級(jí)、高并發(fā)處理能力和靈活的模塊化設(shè)計(jì),已成為現(xiàn)代Web架構(gòu)的基石。從全球頂尖網(wǎng)站到微服務(wù)架構(gòu),Nginx在負(fù)載均衡、緩存加速、安全防護(hù)等場(chǎng)景中扮演著關(guān)鍵角色。本文聚焦Nginx的四大核心功能--反向代理(七層/四層)、正向代理、緩存機(jī)制和正則表達(dá)式匹配,通過理論解析與場(chǎng)景化案例,深入掌握其設(shè)計(jì)思想與實(shí)踐技巧,為構(gòu)建高效、穩(wěn)定的Web服務(wù)莫定堅(jiān)實(shí)基礎(chǔ)。
一、正向代理
正向代理(Forward Proxy)是一種位于客戶端和原始服務(wù)器之間的代理服務(wù)器,其主要作用是將客戶端的請(qǐng)求轉(zhuǎn)發(fā)給目標(biāo)服務(wù)器,并將響應(yīng)返回給客戶端Nginx 的 正向代理 充當(dāng)客戶端的“中間人”,代表用戶訪問外部資源并隱藏真實(shí) IP。它是企業(yè)內(nèi)網(wǎng)管控、安全審計(jì)與加速訪問的核心工具。用于場(chǎng)景一般是:
內(nèi)網(wǎng)訪問控制:限制員工訪問特定網(wǎng)站(如社交媒體)
匿名訪問:通過代理服務(wù)器隱藏用戶真實(shí)身份。
資源緩存加速:緩存公共資源(如軟件包、鏡像文件),減少外網(wǎng)帶寬消耗。
1.編譯安裝Nginx
(1)安裝支持軟件
Nginx 安裝文件可以從官方網(wǎng)站 http://www.nginx.org/下載。
Nginx 的配置及運(yùn)行需要 pcre、zlib 等軟件包的支持,因此應(yīng)預(yù)先安裝這些軟件的開發(fā)包(devel),以便提供相應(yīng)的庫和頭文件,確保 Nginx 的安裝順利完成。
[root@localhost ~]# dnf -y install gcc* pcre-devel zlib-devel openssl-devel
(2)創(chuàng)建運(yùn)行用戶、組和日志目錄
Nginx 服務(wù)程序默認(rèn)以 nobody 身份運(yùn)行,建議為其創(chuàng)建專門的用戶賬號(hào),以便更準(zhǔn)確地控制其訪問權(quán)限,增加靈活性、降低安全風(fēng)險(xiǎn)。例如,創(chuàng)建一個(gè)名為nginx 的用戶,不建立宿主文件夾,也禁止登錄到She11 環(huán)境。
[root@localhost ~]# useradd -M-s /sbin/nologin nginx [root@localhost ~]# mkdir -p /var/log/nginx [root@localhost ~]# chown-R nginx:nginx /var/log/nginx
(3)編譯安裝 Nginx
配置Nginx的編譯選項(xiàng)時(shí),將安裝目錄設(shè)為/usr/local/nginx,運(yùn)行用戶和組均設(shè)為nginx:啟用 http_stub_status module 模塊以支持狀態(tài)統(tǒng)計(jì),便于查看服務(wù)器的連接信息。具體選項(xiàng)根據(jù)實(shí)際需要來定,配置前可參考“./configure--help”給出的說明。
[root@localhost ~]# tar zxf nginx-1.26.3_http_proxy.tar.gz [root@localhost ~]# cd nginx-1.26.3 [root@localhost ~]# ./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
--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)?/p>
--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的透?jìng)鱥p
--add-module=./ngx http_proxy_connect_module:支持https轉(zhuǎn)發(fā)(默認(rèn)nginx不支持https轉(zhuǎn)發(fā),需要添加第三方模塊)
為了使 Nginx 服務(wù)器的運(yùn)行更加方便,可以為主程序 nginx 創(chuàng)建鏈接文件,以便管理員直接執(zhí)行“nginx”命令就可以調(diào)用 Nginx 的主程序。
[root@localhost nginx-1.26.3]# ln-s /usr/local/nginx/sbin/nginx /usr/local/sbin/
(4)添加Nginx系統(tǒng)服務(wù)
為了使 Nginx 服務(wù)的啟動(dòng)、停止、重載等操作更加方便,可以編寫 Nginx 服務(wù)腳本,并使用 chkconfig 和 systemct1 工具來進(jìn)行管理。
[root@localhost ~]# vi /lib/systemd/system/nginx.service [Unit] Description=The NGINX HTTP and reverse proxy server After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/sbin/nginx ExecReload=/usr/local/sbin/nginx-s reload ExecStop=/usr/local/sbin/nginx -s stop [Instal1] WantedBy=multi-user.target
[root@localhost ~]# systemctl daemon-reload [root@localhost ~]# systemctl start nginx [root@localhost ~]# systemctl enable nginx
2.配置正向代理
(1)編輯主配置文件添加正向代理相關(guān)配置:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf server { listen 8080; #代理監(jiān)聽端口 resolver 114.114.114.114 8.8.8.8; #解析域名使用的DNS #多個(gè)DNS用空格分隔 proxy_connect; #啟用代理CONNECT方法(支持HTTPS) proxy_connect_allow 80 443; #允許代理到80和443端口 proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; #處理HTTP/HTTPS請(qǐng)求 location / { proxy_pass $scheme://$http_host$request_uri; #動(dòng)態(tài)協(xié)議 proxy_set_header Host $http_host; #優(yōu)化緩沖區(qū) proxy_buffers 256 4k; proxy_max_temp_file_size 0; #保持連接 proxy_http_version 1.1; proxy_set_header Connection ""; }
[root@localhost ~]# nginx -t [root@localhost ~]# nginx -s reload
(2)驗(yàn)證正向代理:
Windows中驗(yàn)證,使用火狐瀏覽器,設(shè)置http和https代理即可:
Linux中驗(yàn)證,使用curl命令,并指定代理服務(wù)器進(jìn)行訪問測(cè)試
[root@localhost ~]# curl -x http://192.168.10.101:8080 www.baidu.com
在101上查看日志
[root@localhost ~]# cat /usr/local/nginx/logs/access.log
二、反向代理
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)容。它專為高性能、低延遲的傳輸層場(chǎng)景設(shè)計(jì),是數(shù)據(jù)庫、游戲服務(wù)器等非 HTTP 服務(wù)的理想選擇。應(yīng)用場(chǎng)景一般是:
數(shù)據(jù)庫代理:對(duì)外暴露統(tǒng)一端口,內(nèi)部轉(zhuǎn)發(fā)至 MySQL、Redis 集群,
游戲服務(wù)器:代理 UDP 協(xié)議,實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)包負(fù)載均衡。
SSH 跳板機(jī):通過端口映射安全訪問內(nèi)網(wǎng)服務(wù)器。
高可用服務(wù):TCP 服務(wù)(如 MQTT)的主備切換與健康檢查
反向代理,指的是瀏覽器/客戶端并不知道自己要訪問具體哪臺(tái)目標(biāo)服務(wù)器,只知道去訪問代理服務(wù)器,代理服務(wù)器再通過反向代理 +負(fù)載均衡實(shí)現(xiàn)請(qǐng)求分發(fā)到應(yīng)用服務(wù)器的一種代理服務(wù)。
反向代理服務(wù)的特點(diǎn)是代理服務(wù)器 代理的對(duì)象是應(yīng)用服務(wù)器,也就是對(duì)于瀏覽器/客戶端 來說應(yīng)用服務(wù)器是隱藏的。
資源清單
本實(shí)驗(yàn)需要兩臺(tái)主機(jī)
操作系統(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.10.102上操作:
[root@localhost ~]# systemctl stop firewalld [root@localhost ~]# dnf -y install httpd [root@localhost ~]# echo "這是后端主機(jī)" >/var/www/html/index.html [root@localhost ~]# systemctl start httpd
(2)配置nginx七層代理轉(zhuǎn)發(fā)
192.168.10.101上的操作:
[root@localhost ]# vi /usr/local/nginx/conf/nginx.conf http { upstream backend # 后端地址池設(shè)置 server 192.168.10.102:80; #后端主機(jī)設(shè)置 server { listen 80; server name example.com; location / { proxy_pass http://backend; #請(qǐng)求轉(zhuǎn)發(fā) proxy set header Host $host : proxy set header X-Real-IP $remote addr; } } } [root@localhost]# nginx -t [root@localhost]# nginx -s reload
上述配置中,使用upstream定義后端應(yīng)用服務(wù)器的地址池“backend”,在location塊中,使用proxy_pass,轉(zhuǎn)發(fā)請(qǐng)求至后端地址池,proxy_set header Host $host:將請(qǐng)求中的Host頭部設(shè)置為客戶端請(qǐng)求的主機(jī)名,proxy_set header X-Real-IP Sremote addr:將請(qǐng)求中的 X-Real-IP 頭部設(shè)置為客戶端的真實(shí) IP 地址。
(3)驗(yàn)證轉(zhuǎn)發(fā)效果
2.配置nginx四層代理
SSH協(xié)議是基于TCP協(xié)議的,配置nginx的四層代理,實(shí)現(xiàn)代理ssh請(qǐng)求后至后端服務(wù)器,可以登錄內(nèi)網(wǎng)服務(wù)器場(chǎng)景
(1)配置四層代理
192.168.10.101上操作:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf stream { upstream ssh_cluster { #定義后端地址池 server 192.168.10.102:22; #設(shè)置后端地址和服務(wù)端口 } server { listen 2222; proxy_pass ssh_cluster; proxy_connect_timeout 5s; #連接超時(shí)時(shí)間 proxy_timeout 1h; #長連接保持時(shí)間 } }
注意: stream需要與http{ }模塊平級(jí),不能在http{ }中嵌套
(2)驗(yàn)證四層代理
通過上面的驗(yàn)證發(fā)現(xiàn),通過102的2222端口登錄后,實(shí)際上是登錄到101服務(wù)器。
三、Nginx緩存
Nginx 的緩存功能是其核心能力之一,主要用于加速內(nèi)容響應(yīng)和降低后端服務(wù)器負(fù)載。它的緩存功能主要基于反向代理(Proxy Cache),但也可用于其他場(chǎng)景(如 FastCGI 緩存)。以下是詳細(xì)解析:
1.緩存功能的核心原理和緩存類型
緩存類型 | 作用場(chǎng)景 |
代理類型 | 反向代理模式下緩存后端服務(wù)器(如 Tomcat、Apache)的響應(yīng)內(nèi)容。 |
FastCGI 緩存 | 緩存 PHP/Python 等通過 FastCGl 協(xié)議處理的動(dòng)態(tài)內(nèi)容(需配合 PHP-FPM使用)。 |
uWSGI/SCGI緩存 | 類似 FastCG,用于其他后端協(xié)議。 |
靜態(tài)資源緩存 | 通過 expires 指令設(shè)置客戶端瀏覽器緩存(非服務(wù)端緩存)。 |
代理緩存原理:
第一步:客戶端第一次向Nginx請(qǐng)求數(shù)據(jù)A;
第二步:當(dāng)Nginx發(fā)現(xiàn)緩存中沒有數(shù)據(jù)A時(shí),回想服務(wù)端請(qǐng)求數(shù)據(jù)A;
第三步:服務(wù)端接收到Ningx發(fā)來的請(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)容。
需要先配置七層反向代理
(1)反向代理配置
[root@localhost ]# vi /usr/local/nginx/conf/nginx.conf http { upstream backend # 后端地址池設(shè)置 server 192.168.10.102:80; #后端主機(jī)設(shè)置 server { listen 80; server name example.com; location / { proxy_pass http://backend; #請(qǐng)求轉(zhuǎn)發(fā) proxy set header Host $host : proxy set header X-Real-IP $remote addr; } } } [root@localhost]# nginx -t [root@localhost]# nginx -s reloa
(2)設(shè)置緩存功能
[root@localhost ~]# mkdir -p /data/nginx/cache [root@localhost ~]# chown nginx:nginx /data/nginx/cache -R [root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf http { # 定義緩存路徑和參數(shù) 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; #啟用緩存區(qū) proxy_cache my_cache; #定義緩存鍵(URL +請(qǐng)求方法 +協(xié)議) proxy_cache_key "$scheme$request_method$host$request_uri"; #緩存有效期(不同狀態(tài)碼不同時(shí)間) proxy_cache_valid 200 302 10m; #200/302 狀態(tài)碼緩存10分鐘 proxy_cache_valid 404 1m; #404 緩存1分鐘 proxy_cache_valid any 5s; #其他狀態(tài)碼緩存5秒 #添加緩存狀態(tài)頭(調(diào)試用) add_header X-Cache-Status $upstream_cache_status; } } }
關(guān)鍵配置解析:
proxy_cache path:定義緩存文件的存儲(chǔ)路徑
levels=1:2:定義緩存目錄的層級(jí)結(jié)構(gòu),1eve1s=N:M,表示緩存文件路徑的層級(jí)深度,
keys zone=my cache:10m :定義共享內(nèi)存區(qū)域,用于存儲(chǔ)緩存鍵(key)和元數(shù)據(jù)(如過期時(shí)間),10m:共享內(nèi)存區(qū)大小(通常每1MB 可存儲(chǔ)約 8000 個(gè)鍵)
inactive=60m :定義緩存內(nèi)容的閑置有效期。60分鐘 內(nèi)未被訪問,將被自動(dòng)刪除
max size=1g:定義緩存目錄的最大磁盤空間。當(dāng)緩存量達(dá)到1GB 時(shí),Nginx 啟動(dòng) LRU(最近最少使用)算法清理舊緩存。
use_temp path=off :控制臨時(shí)文件的存儲(chǔ)位置,推薦值:off(減少磁盤操作,提升性能)
(3)驗(yàn)證緩存功能
四、Nginx rewrite和正則
在云計(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)重要的角色--它賦予開發(fā)者精準(zhǔn)控制URL的能力,讓請(qǐng)求的流轉(zhuǎn)不再受限于物理路徑,而是通過邏輯規(guī)則靈活適配業(yè)務(wù)需求。
Rewrite的應(yīng)用場(chǎng)景
路徑美化:將/product/123轉(zhuǎn)換為/index.php"h24">1.Nginx正則
字符 | 描述 |
^ | 匹配輸入字符串的起始位置 |
$ | 匹配輸入字符串的結(jié)束位置 |
* | 匹配前面的字符零次或多次。如“o1““能匹配“o“及“o!”、"ol" |
+ | 匹配前面的字符一次或多次。如“ol+"能匹配"o1"及"oI"、"o”,但不能匹配"o” |
? | 匹配前面的字符零次或一次,例如"do(es)?"能匹配"do"或者“does","?等效于“{0,1}" |
` | 匹配除"\n"之外的任何單個(gè)字符,若要匹配包括“\n"在內(nèi)的任意字符,請(qǐng)使用諸如[.\n]之類的模式 |
\ | 將后面接著的字符標(biāo)記為一個(gè)特殊字符或一個(gè)原義字符或一個(gè)向后引用。如“\n"匹配個(gè)換行符,而“$"則匹配“$” |
\d | 匹配純數(shù)字 |
{n} | 重復(fù)n次 |
{n,} | 重復(fù)n次或更多次 |
{c} | 匹配單個(gè)字符c |
[a-z] | 匹配 a-z小寫字母的任意一個(gè) |
[a-zA-Z] | 匹配 a-z 小寫字母或 A-Z 大寫字母的任意一個(gè) |
1.nginx location
rewrite 通常會(huì)與 location 結(jié)合使用,但并非絕對(duì)。二者的協(xié)作能實(shí)現(xiàn)更精細(xì)的路徑控制,1ocation是Nginx中用于匹配請(qǐng)求URI(路徑:只能對(duì)域名后邊的除去傳遞的參數(shù)外的字符串起作用,例如http://www.kgc.com/index.php?id=1 只匹配/index.php)的核心指令,用于根據(jù)請(qǐng)求路徑定義不同的處理邏輯(如靜態(tài)資源服務(wù)、反向代理、重定向等)
(1)location的語法:
location [匹配模式] { # 處理邏輯 (如 root,proxy_pass,rewrite等) }
匹配模式類型:
模式 | 說明 | |
location /uri | 普通前綴匹配 | 匹配以指定路徑開頭的URI |
location = / | 精確匹配 | 僅匹配完全相同的URI(優(yōu)先級(jí)最高) |
location ~ | 正則匹配 | 區(qū)分大小寫的正則表達(dá)式匹配 |
location ~* | 正則匹配 | 不區(qū)分大小寫的正則表達(dá)式匹配 |
location ^~ | 精確前綴匹配 | 匹配前綴路徑后,不再檢查正則匹配(優(yōu)先高于正則) |
location / | 通用匹配 | 默認(rèn)方式,優(yōu)先級(jí)最低,其他方式匹配不到時(shí)匹配 |
loction 的優(yōu)先級(jí)規(guī)則:
精確匹配 > 精確前綴匹配 > 正則匹配(~和~*同時(shí)存在時(shí),文件中物理位置靠上的優(yōu)先)>普通前綴匹配>通用匹配
(2)location驗(yàn)證
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf location / { return 200 "通用匹配"; } location /abc { return 200 "普通前綴匹配"; } location ~ /test/abcdef { return 200 "區(qū)分大小寫正則"; } location ~* /test/abc { return 200 "不區(qū)分大小寫正則"; } location ^~ /abcdef { return 200 "精確前綴匹配"; } location = /abc { return 200 "精確匹配"; }
每次請(qǐng)求192.168.10.101/abc后,按優(yōu)先級(jí)順序依次注釋配置文件中的location,會(huì)發(fā)現(xiàn)每次的響應(yīng)內(nèi)容發(fā)生變更了。PS:使用正則模式時(shí),URI部分可以使用正則表達(dá)式
例如:location ~\.(jpglpnglgif)$ {
}
2.Rewrite
(1)Rewrite語法
rewrite <regex> <replacement> [flag];
regex:正則匹配URL字符串(只能對(duì)域名后邊的除去傳遞的參數(shù)外的字符串起作用,例如http://www.kgc.com/index.php"background-color: rgb(231, 243, 237); padding: 1px 3px; border-radius: 4px; overflow-wrap: break-word; text-indent: 0px; display: inline-block;">replacement:重寫跳轉(zhuǎn)后的地址
flag類型:
last:重寫后的 URI 會(huì)重新觸發(fā) 1ocation 匹配,并執(zhí)行新匹配到的location塊中的指令,是默認(rèn)類型
break:重寫后的 URI 不會(huì)重新匹配 location,直接在當(dāng)前 location 中處理,且后續(xù)的 rewrite 指令不再執(zhí)行
redirect:返回302臨時(shí)重定向,瀏覽器地址會(huì)顯示跳轉(zhuǎn)后的 URL 地址,爬蟲不會(huì)更新url(因?yàn)槭桥R時(shí))
permanent:返回301永久重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的 URL地址,爬蟲更新url
在實(shí)際工作的應(yīng)用中,Nginx跳轉(zhuǎn)需求有三種方式可實(shí)現(xiàn)。可以直接用 rewrite 進(jìn)行匹配跳轉(zhuǎn),也可以使用 if 匹配全局變量后跳轉(zhuǎn)。另外,還可以使用1ocation 匹配再跳轉(zhuǎn)。所以rewrite 只能放在 server{}、if{}、locationt{}配置段中
1.servert{ } 塊中的 rewrite
執(zhí)行順序:在請(qǐng)求進(jìn)入server塊后、匹配location前執(zhí)行。
作用域:影響該server塊下所有請(qǐng)求(全局生效)。
2.location{}塊中的rewrite
執(zhí)行順序:在請(qǐng)求匹配到該 location 后執(zhí)行
作用域:僅對(duì)該 1ocation 匹配的請(qǐng)求生效(局部生效)。
3.if{} 塊中的 rewrite
執(zhí)行順序:在滿足if 條件時(shí)觸發(fā)。
作用域:依賴 if 表達(dá)式所在的上下文(如在server中或location中)。(2)rewrite flag驗(yàn)證
(2)rewrite flag驗(yàn)證
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf default_type text/plain; #使用瀏覽器驗(yàn)證時(shí),為防止瀏覽器請(qǐng)求時(shí)直接下載return的內(nèi)容,而不是在頁面展示內(nèi)容 location /abc { rewrite ^/ /def last; } location /def { return 200 "this is def"; } [root@localhost conf]# nginx -s reload
使用瀏覽器請(qǐng)求,發(fā)現(xiàn)相應(yīng)內(nèi)容是:this is def ,說明last標(biāo)記后繼續(xù)向下匹配location了
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf default_type text/plain; #使用瀏覽器驗(yàn)證時(shí),為防止瀏覽器請(qǐng)求時(shí)直接下載return的內(nèi)容,而不是在頁面展示內(nèi)容 location /abc { rewrite ^/ /def ; } location /def { return 200 "this is def"; } [root@localhost conf]# nginx -s reload
改成break標(biāo)記,使用瀏覽器請(qǐng)求,發(fā)現(xiàn)請(qǐng)求頁面未找到(因?yàn)榫W(wǎng)頁代碼目錄確實(shí)不存在/def的內(nèi)容)說明break標(biāo)記使用當(dāng)前結(jié)果不繼續(xù)向下匹配了
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf default_type text/plain; #使用瀏覽器驗(yàn)證時(shí),為防止瀏覽器請(qǐng)求時(shí)直接下載return的內(nèi)容,而不是在頁面展示內(nèi)容 location /abc { rewrite ^/ /def permanent; } location /def { return 200 "this is def"; } [root@localhost conf]# nginx -s reload
改成permanent標(biāo)記,使用瀏覽器請(qǐng)求,發(fā)現(xiàn)請(qǐng)求頁面301跳轉(zhuǎn),并且地址欄顯示的是跳轉(zhuǎn)后的地址
(3)rewrite中的捕獲組
在 Nginx 的 rewrite 指令中,小括號(hào) ()用于定義正則表達(dá)式的捕獲組(CaptureGroup),捕獲的文本可以通過 $1,$2,$3 等變量在重寫后的 URI 中引用
捕獲組“()”
在正則表達(dá)式中,(pattern)會(huì)匹配pattern 并捕獲內(nèi)容,按順序存入$1,$2,$3 等變量中。
引用方式
在 rewrite 的替換字符串中,通過 81 表示第一個(gè)捕獲組,$2 表示第二個(gè),依此類推。
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf location /category/ { #匹配/category/tech/123,捕獲tech到$1,123到$2 rewrite ^/category/(.+)/(\d+)$ /archive/$1/$2 last; } location /archive { #返回捕獲的分類和ID return 200 "Category:$1,ID:$2"; } [root@localhost conf]# nginx -s reload
測(cè)試訪問
(4)nginx中的set指令
在 Nginx 中,set 指令用于定義變量并賦值,這些變量可以用于后續(xù)的條件判斷、日志記錄、重寫規(guī)則等場(chǎng)景。它提供了靈活的動(dòng)態(tài)配置能力,尤其在處理復(fù)雜的請(qǐng)求邏輯時(shí)非常有用。
語法:set $variable value;
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf location /demo { set $name "Nginx"; return 200 "Hello,$name!"; } [root@localhost conf]# nginx -s reload
測(cè)試訪問
到此這篇關(guān)于Nginx的核心功能--正向代理、反向代理、緩存和Rewrite的文章就介紹到這了,更多相關(guān)Nginx的正向代理、反向代理、緩存和Rewrite內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決國內(nèi)k8s的ingress-nginx鏡像無法正常pull拉取問題
本文主要介紹了解決國內(nèi)k8s的ingress-nginx鏡像無法正常pull拉取問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03Nginx解決Http慢攻擊(Slow HTTP Attack)的方法
緩慢的HTTP拒絕服務(wù)攻擊是一種專門針對(duì)于Web的應(yīng)用層拒絕服務(wù)攻擊,本文給大家介紹了Nginx解決Http慢攻擊(Slow HTTP Attack)的方法,需要的朋友可以參考下2024-02-02解讀Nginx和Apache的特點(diǎn)與區(qū)別
這篇文章主要介紹了解讀Nginx和Apache的特點(diǎn)與區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Nginx下修改WordPress固定鏈接導(dǎo)致無法訪問的問題解決
這篇文章主要介紹了Nginx下修改WordPress固定鏈接導(dǎo)致無法訪問的問題解決,同時(shí)作者也給出了官方關(guān)于修改固定鏈接的方法,需要的朋友可以參考下2015-07-07使用nginx部署前端項(xiàng)目的實(shí)現(xiàn)
前端項(xiàng)目的部署以前一直是把靜態(tài)資源放到后端工程中,隨后端部署一起部署,本文主要介紹了使用nginx部署前端項(xiàng)目的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10