目錄
一:正向代理
1:編譯安裝nginx
(1)安裝支持軟件
(2)創建運行用戶、組和日志目錄
(3)編譯安裝nginx
(4)添加nginx系統服務
2:配置正向代理
(1)編輯主配置文件添加正向代理相關配置
(2)驗證正向代理
二:反向代理
1:配置nginx七層代理
(1)環境安裝
(2)配置nginx七層代理轉發
(3)驗證轉發效果
2:配置nginx四層代理
(1)配置四層代理
(2)驗證四層代理
三:Nginx緩存
1:緩存功能的核心原理和緩存類型
2:代理緩存功能設置
(1)反向代理配置
(2)設置緩存功能
(3)驗證緩存功能
四:Nginx rewrite和正則
1:nginx正則
2:nginx? location
(1)location 的語法:
(2)location 驗證
3:Rewrite
一:正向代理
正向代理(Forward Proxy)是一種位于客戶端和原始服務器之間的代理服務器,其主要作用是將客戶端的請求轉發給目標服務器,并將響應返回給客戶端Nginx的正向代理充當客戶端的"中間人",代表用戶訪問外部資源并隱藏真實IP。它是企業內網管控、安全審計與加速訪問的核心工具。
用于場景一般是:
>內網訪問控制:限制員工訪問特定網站(如社交媒體)
>匿名訪問:通過代理服務器隱藏用戶真實身份。
>資源緩存加速:緩存公共資源(如軟件包、鏡像文件)減少外網帶寬消耗.
1:編譯安裝nginx
(1)安裝支持軟件
(1)安裝支持軟件
Nginx的配置及運行需要pcre、zlib等軟件包的支持,因此應預先安裝這些軟
件的開發包(devel),以便提供相應的庫和頭文件,確保Nginx的安裝順利完成。
[root@localhost ^]# dnf install -y gcc make pcre-devel z]ib-developenssl-devel perl-ExtUtils-MakeMaker git wget tar
(2)創建運行用戶、組和日志目錄
Nginx服務程序默認以nobody身份運行,建議為其創建專門的用戶賬號,以便更準確地控制其訪問權限,增加靈活性、降低安全風險。例如,創建一個名為nginx的用戶,不建立宿主文件夾,也禁止登錄到Shell環境。
[root@localhostuseradd -M -s /sbin/nologin nginx
[root@localhost ^]# mkdir -p /var/log/nginx
[root@localhost ^]# chown -R nginx:nginx/var/log/nginX
(3)編譯安裝nginx
配置Nginx的編譯選項時,將安裝目錄設為/usr/local/nginx,運行用戶和組均
設為nginx;
啟用http_stub_status_module模塊以支持狀態統計,便于查看服務器的連接
信息。具體選項根據實際需要來定,配置前可參考"./configure--help"給出的說明。
[root@localhost`]# tar zxf nginx-1.26.3_http_proxy.tar.gz
[root@localhost~]# cd nginx-1.26.3
[root@localhost `]# git clone
https://github.com/chobits/ngx_http_proxy_connect_module.git#(默認nginx不支持轉發https)下載第三方模塊,用以支持正向代理https發,提供的源碼目錄已提前放置該模塊,這里無需下載,僅作為介紹
[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_staticmodule
--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
參數說明:
#指定nginx運行用戶????????--user=nginx
#指定nginx運行組????????--group=nginx
#支持https://????????????????--with-http_ssl_module
#支持http版本2????????????????--with-http_v2_module
#支持ip透傳????????????????--with-http_realip_module
#支持狀態頁面????????????????--with-http_stub_status_module? ? ? ?
#支持壓縮????????????????--with-http_gzip_static_module? ? ? ?
#支持正則????????????????--with-pcre
#支持tcp反向代理????????????????--with-stream
#支持tcp的ssl加密????????????????--with-stream_ssl_module
#支持tcp的透傳ip????????????????--with-stream_realip_module
--add-module=./ngx_http_proxy_connect_module????????#支持https轉發默認nginx不支持https轉發,需要添加第三方模塊
為了使Nginx服務器的運行更加方便,可以為主程序nginx創建鏈接文件,以便管理員直接執行"nginx"命令就可以調用 Nginx的主利星序。
[root@localhost nginx-1.26.3]# 1n -s /usr/local/nginx/sbin/nginx/usr/local/sbin/
(4)添加nginx系統服務
為了使Nginx服務的啟動、停止、重載等操作更加方便,可以編寫Nginx朋務腳本,并使用chkconfig和systemctl工具來進行管理。
[root@localhost ^]# vi /lib/systemd/system/nginx. service
[Unit]
Description=The NGINX HTTP and reverse proxy servver
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
[root@localhost ^]# systemctl daemon-reload
[root@localhost^]# systemctl start nginx
[root@localhost ^]# systemctl enable nginx
2:配置正向代理
(1)編輯主配置文件添加正向代理相關配置
[root@localhost ^]# vi /usr/local/nginx/conf/nginx.cont?
server? ?{
????????listen 8080;????????????????#代理監聽端口
????????server_name proxy.example.com;#解析域名使用的DNS
resolver 8.8.8.8 1.1.1.1;????????#多個DNS用空格分隔
#啟用代理CONNECT方法(支持HTTPS)
proxy_connect;
proxy_connect_allow 443 80;????????#允許代理到80和443端口
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
#處理HTTP/HTTPS請求
location? ? /? {
????????proxy_pass $scheme://shttp_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? ? ? ? }
}
[root@localhost "~]#nginx -t
[root@localhost ^]#nginx -s reload
(2)驗證正向代理
Linux中驗證,使用curl命令,并指定代理服務器進行訪問測試
[root@localhost ^]curl -x http://192.168.10.202:8080www.baidu.com
二:反向代理
Nginx的七層(應用層)反向代理基于HTTP/HTTPS協議,深度解析應用層內容
(如URL、Header、Cookie),將客戶端請求精準轉發至后端服務器。作為企業級架構的"智能調度器",它實現了負載均衡、安全隔離與與性能優化的核心能力。應用場景一般是:
>負載均衡:將流量分發至多臺后端服務器,避免單點故障。
>動靜分離:靜態資源(圖片、CSS/JS)由Nginx直接響應,動態請求(PHP、API)轉發至Apache/Tomcat。
>SSL終端:統一處理HTTPS加密/解密,降低后端服務器計算壓力。
>灰度發布:根據請求特征(如IP、Header)將部分流量導向新版本服務。
Nginx的四層(網絡層)反向代理基于TCP/UDP協議,直接轉發原始數據流,不解析應用層內容。它專為高性能、低延遲的傳輸層場景設計,是數據庫、游戲服務器等非HTTP服務的理想選擇。應用場景一般是:
>數據庫代理:對外暴露統一端口,內部轉發至MySQL、Redis集群。
>游戲服務器:代理UDP協議,實現實時數據包負載均衡。
>SSH跳板機:通過端口映射安全訪問內網服務器。
>高可用服務:TCP服務(如MQTT)的主備切換與健康檢查E。
反向代理,指的是瀏覽器/客戶端并不知道自己要訪問具體哪臺目標服務器,只知道去訪問代理服務器,代理服務器再通過反向代理+負載均衡實現請求分發到應用服務器的一種代理服務。
反向代理服務的特點是代理服務器代理的對象是應用服務器,也就是對于瀏覽器/客戶端 來說應用服務器是隱藏的。
1:配置nginx七層代理
(1)環境安裝
192.168.10.201上操作:
[root@localhost~]#systemctl stop firewalld
[root@localhost~]#dnf install httpd -y
[root@localhost~]#echo"這是后端主機">/var/www/html/index.html
[root@localhost~]#systemctl start httpd
(2)配置nginx七層代理轉發
192.168.10.202上操作:
[root@localhost^]# vi /usr/local/nginx/conf/nginx.conf
http {
????????upstream backend????????#后端地址池設置
????????????????server 192.168.10.201:80;????????#后端主機設置
? ? ? }? ??????server? ?{
????????????????listen 80;
????????????????server_name example.com;
????????????????location/{
????????????????????????proxy_passhttp://backend;#動態請求轉發
????????????????????????proxy_set_header Host $host;
????????????????????????proxy_set_header X-Real-IP $remote_addr;}
????????location /static/ {
????????????????root/data/www;????????#靜態資源直接響應
????????????????expires 30d;????????????????#客戶端緩存30天? ? ? ? ? ?}
? ? ? }
}
[root@localhost#nginx -t
[root@localhost#nginx -s reload
上述配置中,使用upstream定義后端應用服務器的地址池"backend",在location塊中,使proxy_pass,轉發請求至后端地址池,proxy_set_headerHost$host:將請求中的Host頭部設置為客戶端請求的主機名6,proxy_set_header X-Real-IP$remote_addr:將請求中的X-Real-IP頭部設置為客戶端的真實IP地址。
(3)驗證轉發效果
[root@localhost ^]# curl 192.168.10.202
這是后端主機
2:配置nginx四層代理
SSH協議是基于TCP協議的,配置nginx的四層代理,實現代理ssh請求至后端服務器,用以登錄內網服務器場
(1)配置四層代理
192.168.10.202上操作:
[root@localhost~]#vi /usr/local/nginx/conf/nginx.conf
stream? ? ? ? {
????????upstream ssh cluster? {????????????????#定義后端地址池
????????server 192.168.10.201:22;?????? ? ? #設置后端地址和服務端口}
server? ? ? ? {
????????listen 2222;
????????proxy_pass ssh_cluster;
????????proxy_connect_timeout 5s;????????連接超時時間
????????proxy_timeout lh;????????長連接保持時間
[root@localhost]#nginx -t
[root@localhost^]#nginx -s reload
[root@localhost~]#ss -nlpt | grep 2222
LISTEN O????????511????????0.0.0.0:2222????????0.0.0.0:*
users:(("nginx",pid=8404, fd=6), ("nginx",pid=8403, fd=6))?
(2)驗證四層代理
[root@localhost ^]# ssh root@192.168.10.202 -p2222
[root@localhost ^]#ifconfig
ens33: flags=4163<UP, BROADCAST, RUNNING, MULTICAST>????????mtu 1500
????????inet 192.168.10.201 netmask 255.255.255.0 broadcast192.168.10.255
????????inet6 fe80::20c:29ff:fe9f:del5 prefixlen 64 sccopeid0x20<link>
????????ether 00:0c:29:9f:de:15 txqueuelen 1000 (Ethernet)
????????RX packets 389822 bytes 511828164 (488.1 MiB)
? ? ? ? RX errors 0 dropped 0 overruns 0 frame 0
????????TX packets 104614 bytes 8588675 (8.1 MiB)
????????TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
通過以上操作驗證發現,通過202的2222端口登陸后,實際上是登錄到201服務器上
三:Nginx緩存
1:緩存功能的核心原理和緩存類型
? ? ? ? ? ?緩存類型????????????????????????????????作用場景
? ?代理緩存? ? ? ? ? ? ? ? ? ? ? ?? ??? ? 反向代理模式下緩存后端服務器(如Tomcat、Apache)的響應內容。
?? FastCGI緩存? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????緩存PHP/Python等通過FastCGI協議處理的? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 動態內容 (需配FastCGI緩存合PHP-FPM使用)。uWSGI/SCGI 緩存????????????????????????????????????????類似FastCGI,用于其他后端協議。
靜態資源緩存?????????????????????????????????????????? ? 通過expires 指令設置客戶端瀏覽器緩存(非服務端緩存)
代理緩存:
代理緩存原理:
第一步:客戶端第一次向Nginx請求數據A;
第二步:當Nginx發現緩存中沒有數據A時,會向服務端請求數據A;
第三步:服務端接收到Nginx發來的請求,則返回數據A到Nginx,并且緩存在Nginx;
第四步:Nginx返回數據A給客戶端應用;
第五步:客戶端第二次向Nginx請求數據A;
第六步:當Nginx發現緩存中存在數據A時,則不會請求服務端;
第七步:Nginx把緩存中的數據A返回給客戶端應用。
2:代理緩存功能設置
(1)反向代理配置
[root@localhost ^]#/usr/local/nginx/conf/nginx.conf
http {
????????upstream backend {????????????????#后端地址池設置
????????????????server 192.168.10.201:80;????????#后端主機設置}
????????server? ?{
????????????????listen 80;
????????????????server_name example.com;
????????????????location /? ? {
????????????????????????proxy_passhttp://backend;????????#動態請求轉發
????????????????????????proxy_set_header Host $host;
????????????????????????proxy_set_header X-Real-IP $remote_addr;? ? ? ? }
location /static/ {
????????root/data/www;????????????????#靜態資源直接響應expires 30d;????????????????#客戶端緩存30天
}
? ? ? ? }
}
[root@localhost#nginx -t
[root@localhost#nginx -s reload
(2)設置緩存功能
[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 {
????????#定義緩存路徑和參數
????????proxy_cache_path /data/nginx/cache levels=1:2
keys_zone=my_cache:10m inactive=60m_max_size=lg_use_temp_path=off;
????????server? ? ? ? {
????????????????listen 80;
????????????????server_name example.com;????????????????location / {
????????????????????????proxy_pass http://backend;
????????????????????????#啟用緩存區
????????????????????????proxy_cache my_cache;
????????????????????????#定義緩存鍵(URL+請求方法+協議)
????????????????????????proxy_cache_key
"$scheme$request_method$host$request_uri";
????????????????????????#緩存有效期(不同狀態碼不同時間)
????????????????????????proxy_cache_valid 200 302 10m; ????????#200/302狀態碼緩存10分分鐘
? ? ? ? ? ? ? ? ? ? ? ? proxy_cache_valid 404? ? ? ? ? ?1m;?????????? ? ??#404緩存1分鐘? ? ? ? ? ? ? ??
????????????????????????proxy_cache_valid any? ? ? ? ? ?5s;???????????????????? ? #其他狀態碼緩存5秒
????????????????????????#添加緩存狀態頭(調試用)
????????????????????????add_header X-Cache-Status $upstream_cache_status;? ? ? ? ? ? ? ? }
? ? ? ? }
}
關鍵配置解析:
>proxy_cache_path:定義緩存文件的存儲路徑
>levels=1:2:定義緩存目錄的層級結構,levels=N:M,表示緩存文件路徑的層級深度,
>keys_zone=my_cache:10m:定義共享內存區域,用于存儲緩存鍵(key)和元數據(如過期時間),10m:共享內存區大小(通常每1MB可存儲約8000個鍵
>inactive=60m:定義緩存內容的閑置有效期。60分鐘內未被訪問,將被自動刪除
>max_size=lg:定義緩存目錄的最大磁盤空間。當緩存量i達到1GB時,Nginx啟動LRU(最近最少使用)算法清理舊緩存。
>use_temp_path=off:控制臨時文件的存儲位置,推薦值:off(減少磁盤操作,提升性能)
(3)驗證緩存功能
[root@localhost~]# curl -I 192.168.10.202
HTTP/1.1 200 OK
Server: nginx/1.26.3
Date: Tue, 04 Mar 2025 12:45:44 GMT
Content-Type: text/html
Content-Length: 19
Connection: keep-alive
Last-Modified: Mon, 03 Mar 2025 12:39:32 GMT
ETag: "67c5a304-13"
X-Cache-Status: MISS????????#MISS表示沒有命中緩存
Accept-Ranges: bytes
[root@localhost ^]# curl -I 192.168.10.202
HTTP/1.1 200 OK
Server: nginx/1.26.3
Date: Tue, 04 Mar 2025 12:45:50 GMT
Content-Type: text/html
Content-Length: 19
Connection: keep-alive
Last-Modified: Mon, 03 Mar 2025 12:39:32 GMT
ETag: "67c5a304-13"X-Cache-Status:HIT????????#再次請求發現已經命中,說明數據已經被緩存
Accept-Ranges: bytes
[root@localhost ^]#ls /data/nginx/cache
查看緩存目錄發現已緩存數據
四:Nginx rewrite和正則
1:nginx正則
常用的正則表達式元字符:
字符 | 描述 |
^ | 匹配輸入字符串的起始位置。 |
$ | 匹配輸入字符串的結束位置。 |
* | 匹配前面的字符零次或多次。 |
+ | 匹配前面的字符一次或多次。 |
? | 匹配前面的字符零次或一次。 |
. | 匹配初“\n”之外的任何單個字符。 |
\ | 將后面接著的字符標記為一個特殊字符或一個原義字符或一個向后引用 |
\d | 匹配純數字 |
{n} | 重復n次 |
{n,} | 重復n次或更多次 |
[c] | 匹配單個字符c |
[a-z] | 匹配a-z小寫字母的任意一個 |
[a-zA-Z] | 匹配a-z小寫字母或A-Z大寫字母的任意一個 |
2:nginx? location
(1)location 的語法:
模式 | 說明 |
location/uri? ?普通前綴匹配 | 匹配已指定路徑開頭的URI |
location = /?精確匹配 | 僅匹配完全相同的URI(優先級最高)。 |
location ~?正則匹配 | 區分大小寫的正則表達式匹配。 |
location ~*??正則匹配 | 不區分大小寫的正則表達式匹配。 |
location ^ ~?精確前綴匹配 | 匹配前綴路徑后,不再檢查正則匹配(優先級高于正則 |
location /?通用匹配 | 認方式,優先級最低,其他方式匹配不到時匹配 |
location 的優先級規則:
精確匹配>精確前綴匹配>正則匹配(~和~*同時存在時,文件中物理位置靠上的優先)>普通前綴匹配>通用匹配。
(2)location 驗證
[root@localhost ^]# vim /usr/local/nginx/conf/nginx.coonf
location? /? {
????????return200"通用匹配":#其他方式匹配不到時匹配? ? ? ? }
location /abc {
????????return200"普通前綴匹配";#uri必須是/abc開頭(和精確前級四
配功能類似,但是優先級要低很多? ? ? ? }
location? ~? /test/abcdef? ?{
????????return200"區分大小寫正則";#uri中必須包含/abc????????}
location? ~? * /test/abc? ?{
????????return 200"不區分大小寫正則";#uri中必須包含/abc或/ABC
location? ^~? /abcdef? ?{
????????return 200"精確前綴匹配";#uri必須是/abc開頭
location = /abc {
????????return 200"精確匹配";#uri必須等于/abc
[root@localhost ^]# nginx -s reload
[root@localhost ^]# curl 192.168.10.202/abc
精確匹配
每次請求192.168.10.202/abc后,按優先級順序依次注釋配置了文件中的location,會發現每次的響應內容發生變更了。PS:使用正則模式時,URI部分可以使用正則表達式
3:Rewrite
Rewrite語法
rewrite <regex><replacement>[flag];
regex:正則匹配URL字符串(只能對域名后邊的除去傳遞的參數外的字符串起作用,例如http://www.kgc.com/index.php?id=l只對/inddex.php重寫)replacement:重寫跳轉后的地址
flag類型:
?????????last:重寫后的URI會重新觸發location匹配,并執行新匹配到的location塊中的指令,是默認類型
????????????????break:重寫后的URI不會重新匹配location,直接在當前 location中處理,且后續的指令不再執行
????????redirect:返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址,爬蟲不會更新url(因為是臨時)
????????permanent:返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址,爬蟲更新url。
在實際工作的應用中,Nginx跳轉需求有三種方式可實現。i可以直接用rewrite進行匹配跳轉,也可以使用 if匹配全局變量后跳轉。另外,還可以使用location匹配再跳轉。所以rewrite只能放在server{}、if{}、location{}
配置段中
1.server{} 塊中的 rewrite
執行順序:在請求進入server塊后、匹配location前執行。
作用域:影響該server塊下所有請求(全局生效)。
2.location{}塊中的rewrite
執行順序:在請求匹配到該location后執行。
作用域:僅對該location匹配的請求生效(局部生效)。
3.if{}塊中的rewrite
執行順序:在滿足if條件時觸發。
作用域:依賴if表達式所在的上下文(如在server中或location中)。