Nginx 核心功能之正反代理

目錄

一、Nginx

二、正向代理?

三、反向代理

四、Nginx 緩存

1. 緩存功能的核心原理和緩存類型

2. 代理緩存功能設置

五、Nginx rewrite和正則

(1)Nginx 正則

(2)nginx location

(3)Rewrite

(4)實例:


一、Nginx

概述:Nginx 是一款高性能的?開源 Web 服務器?和?反向代理服務器,以高并發處理、低內存消耗和模塊化架構著稱。

核心功能:

功能說明
靜態資源服務高效處理 HTML、CSS、JS、圖片等靜態文件,支持 Gzip 壓縮和緩存優化。
反向代理將客戶端請求轉發到后端服務器集群,實現負載均衡和高可用。
SSL/TLS 終止處理 HTTPS 加密和解密,減輕后端服務器壓力。
限流與防護支持請求速率限制、IP 黑白名單、防 DDoS 攻擊。
動態內容處理通過 FastCGI 協議與 PHP、Python 等后端語言交互(需配合 PHP-FPM 等工具)。

注意:配置代理前提 nginx的版本必須高些

二、正向代理?

概述:正向代理是?客戶端與目標服務器之間的中間服務器,代表客戶端向外部服務器發送請求。

?

工作流程

  1. 客戶端配置代理服務器(如瀏覽器設置代理 IP 和端口)。

  2. 客戶端發送請求到代理服務器。

  3. 代理服務器轉發請求到目標服務器。

  4. 目標服務器返回響應到代理服務器。

  5. 代理服務器將響應返回給客戶端。

配置步驟:

#正向代理
vim /usr/local/nginx/conf/nginx.conf
......省略部分信息server {listen       8080;resolver 114.114.114.114 8.8.8.8;proxy_connect;proxy_connect_allow 80 443;proxy_connect_connect_timeout 10s;proxy_connect_read_timeout 10s;proxy_connect_send_timeout 10s;server_name  localhost;location / {#    root   html;#    index  index.html index.htm;proxy_pass $scheme://$http_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 "";}nginx -t	##檢查文件配置

三、反向代理

概述:反向代理是?客戶端與后端服務器之間的中間服務器,代表后端服務器接收客戶端請求,隱藏真實服務器信息。

  • 核心優勢

    • 負載均衡:分發請求到多個后端服務器。

    • 安全防護:隱藏后端服務器 IP,防止直接暴露。

    • 緩存加速:緩存靜態內容,減少后端壓力。

配置步驟:

#反向代理(七層代理)
進行反向代理的配置,寫在server外面(準備兩臺httpd網站,兩個網站,兩個網站內容不同,記得關防火墻,啟動httpd)vim /usr/local/nginx/conf/nginx.confupstream myhttp {server 192.168.10.103:80;server 192.168.10.104:80;}#下面這個修改server里面的location location / {# root   html;# index  index.html index.htm;proxy_pass http://myhttp;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}nginx -t	##檢查文件配置(四層反向代理)并不在http里面寫,在ecents下面寫
vim /usr/local/nginx/conf/nginx.confstream {upstream myssh{server 192.168.10.102:22;}server {listen 2222;proxy_pass myssh;proxy_connect_timeout 10s;proxy_timeout 1h;}
}nginx -t	##檢查文件配置

四、Nginx 緩存

Nginx 緩存通過存儲響應內容(靜態或動態)減少后端服務器負載,提升響應速度和并發能力。

1. 緩存功能的核心原理和緩存類型

(1)代理緩存

  • 核心作用:通過緩存后端服務器的響應內容,減少重復請求對后端的壓力,加快客戶端訪問速度。

  • 緩存類型

    • 代理緩存(Proxy Cache):針對反向代理場景,緩存后端服務器的響應(如動態接口、靜態頁面)。

    • 靜態資源緩存:直接緩存靜態文件(如 CSS、JS、圖片),通過?expires?或?Cache-Control?頭控制瀏覽器緩存。

(2)代理緩存原理

  • 緩存鍵(Cache Key):根據請求的 URL、HTTP 方法、請求頭(如?Host)生成唯一標識,用于判斷是否命中緩存。

  • 緩存存儲:將響應內容以文件形式存儲在磁盤(或內存),并通過?proxy_cache_path?配置管理。

  • 緩存有效性

    • 基于 HTTP 響應頭(如?Cache-ControlExpires)自動判斷緩存過期時間。

    • 可手動設置緩存有效期(如?proxy_cache_valid)。

  • 緩存更新:當緩存過期或無效時,向后端服務器重新請求并更新緩存。

2. 代理緩存功能設置

(1)反向代理配置

upstream backend {server 10.0.0.1:80;server 10.0.0.2:80;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;}
}

(2)設置緩存功能

分兩步:定義緩存路徑啟用緩存規則

  1. 定義緩存路徑(在?http?塊中配置):

    http {proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;# 參數說明:# - `/var/cache/nginx`: 緩存文件存儲路徑# - `levels=1:2`: 目錄層級結構(1層子目錄,2位哈希字符)# - `keys_zone=my_cache:10m`: 定義緩存區域名稱和共享內存大小(10MB)# - `max_size=1g`: 最大磁盤緩存空間# - `inactive=60m`: 60分鐘內未被訪問的緩存自動刪除# - `use_temp_path=off`: 禁用臨時文件路徑,直接寫入緩存目錄
    }
  2. 啟用緩存規則(在?location?塊中配置):

    server {location / {proxy_pass http://backend;proxy_cache my_cache;  # 關聯緩存區域proxy_cache_valid 200 302 10m;  # 狀態碼200/302緩存10分鐘proxy_cache_valid 404      1m;  # 狀態碼404緩存1分鐘proxy_cache_key "$scheme$request_method$host$request_uri";  # 定義緩存鍵add_header X-Cache-Status $upstream_cache_status;  # 添加響應頭顯示緩存狀態}
    }

(3)驗證緩存功能

  1. 查看響應頭

    • 通過瀏覽器開發者工具或?curl?檢查響應頭是否包含?X-Cache-Status

      curl -I http://example.com
    • 可能的取值:

      • HIT:緩存命中

      • MISS:未命中,從后端獲取

      • EXPIRED:緩存已過期

      • BYPASS:繞過緩存

  2. 檢查緩存文件

    • 到?/var/cache/nginx?目錄查看是否生成緩存文件(文件名基于哈希值)。

  3. 壓力測試

    • 使用工具(如?ab?或?wrk)模擬高并發請求,觀察后端服務器的負載是否降低。

五、Nginx rewrite和正則

Rewrite 功能通過正則表達式實現 URL 重寫、跳轉和邏輯控制,是 SEO 優化和路由管理的核心工具

Rewrite的應用場景:

  • 路徑美化:將/product/123 轉換為 /index.php?id=123
  • 舊鏈接遷移:將過期URL永久重定向(301)到新地址
  • 強制HTTPS/域名統一:自動跳轉http://到https://,或合并www與非www域名
  • 動態路由:適配單頁應用(SPA),RESTful API 路由
  • 灰度發布:按規則將部分流量導向新版本服務
(1)Nginx 正則
符號含義示例
^匹配字符串開頭^/admin?匹配以?/admin?開頭的路徑
$匹配字符串結尾.html$?匹配以?.html?結尾的 URL
.匹配任意單個字符(除換行符)a.c?匹配?abcaac
\d匹配數字(等價于?[0-9]user/\d+?→?user/123
\w匹配字母、數字、下劃線\w+?匹配?user_123
()分組捕獲,替換時用?$1$2?引用^/(\w+)/(\d+)$ → /$1?id=$2
*匹配前一個字符 0 次或多次a*?匹配空、aaa
+匹配前一個字符 1 次或多次\d+?匹配?1123
?匹配前一個字符 0 次或 1 次https??匹配?http?或?https
{n,m}匹配前一個字符 n 到 m 次a{2,4}?匹配?aaaaaaaaa
[abc]匹配括號內任意一個字符[aeiou]?匹配元音字母
[^abc]匹配不在括號內的任意字符[^0-9]?匹配非數字字符
(2)nginx location
  • location 的語法:
    location [匹配模式] {# 處理邏輯 (如 root, proxy_pass, rewrite 等)
    }

    常用修飾符

    修飾符作用
    =精確匹配(完全相等)
    ^~前綴匹配(優先于正則匹配)
    ~正則匹配(區分大小寫)
    ~*正則匹配(不區分大小寫)
    無修飾符普通前綴匹配(優先級最低)
  • location 的優先級規則:精確匹配 > 精確前綴匹配 > 正則匹配 (~ 和 ~* 同時存在時,文件中物理位置靠上的優先)> 普通前綴匹配 > 通用匹配

  • ?Location 匹配流程

精確匹配:檢查是否有?location =?精確匹配當前 URI,若有則立即使用。

前綴匹配

????????查找最長匹配的普通前綴(無修飾符)。

????????檢查是否有?^~?前綴匹配,若有則停止后續正則匹配。

正則匹配:按配置文件中的順序依次匹配,首次匹配成功后停止。

默認處理:若未匹配任何規則,使用普通前綴匹配的最長路徑

  • location 驗證:

(3)Rewrite

rewrite
語法:rewrite <regex> <replacement> [flag];

regex:正則匹配URL字符串(只能對域名后邊的除去傳遞的參數外的字符串起作用)

replacement: 重寫跳轉后的地址

  • 正則表達式:匹配請求 URI(如?^/old/(.*))。

  • 替換規則:生成新 URI(如?/new/$1)。

  • ?Flag 類型

    Flag作用
    last重寫后重新匹配新 URL 的 location 塊(類似循環,最多 10 次)
    break立即停止處理后續規則,直接返回結果
    redirect返回 302 臨時重定向(瀏覽器地址欄顯示新 URL)
    permanent返回 301 永久重定向(SEO 友好,瀏覽器緩存跳轉)

Nginx 跳轉:

  • 1. server{ } 塊中的 rewrite

執行順序:在請求進入server塊后、匹配location前執行。

作用域:影響該server塊下所有請求(全局生效)。

  • 2. location{ } 塊中的 rewrite

執行順序:在請求匹配到該 location 后執行。

作用域:僅對該 location 匹配的請求生效(局部生效)。

  • 3. if{ } 塊中的 rewrite

執行順序:在滿足 if 條件時觸發。

作用域:依賴 if 表達式所在的上下文(如在server中或location中)

  • rewrite flag 驗證

    驗證方法:查看響應頭:curl -I http://example.com/old-path  
    # 輸出示例(301 重定向):  
    # HTTP/1.1 301 Moved Permanently  
    # Location: http://example.com/new-path  檢查 Nginx 日志:rewrite_log on;  
    error_log /var/log/nginx/error.log notice;  # 查看重寫過程日志  
  • rewrite 中的捕獲組

    小括號()用于定義正則表達式的捕獲組捕獲組“( )”
    在正則表達式中, (pattern)  會匹配 pattern 并捕獲內容,按順序存入 $1,  $2,  $3 等變量中。引用方式
    在 rewrite 的替換字符串中,通過 $1 表示第一個捕獲組,$2 表示第二個,依此類推。[root@ localhost ~]# vim /usr/local/nginx/conf/nginx.conf
    location / category/ {#匹配 / category/ tech/123, 捕獲 tech 到 $1,123 到 $2rewrite ^/ category/(.+)/(\d+)$ /archive/$1/$2 last;
    )
    location /archive/ {#返回捕獲的分類和 IDreturn 200" Category: $1, ID: $2";測試訪問
    [root@ localhost~]# curl http://localhost/category/tech/456
    Category: tech, ID: 456
  • nginx 中的set指令

    語法: set $variable valuevim /usr/local/nginx/conf/nginx.conflocation /demo {set $name "Nginx";        #定義變量 $namereturn 200 "Hello, $name!";        #輸出:Hello,Nginx!
    }測試:
    curl http://localhost/demo
    Hello,Nginx!
(4)實例:

1. 基于域名的跳轉

vim /usr/local/nginx/conf/nginx.conf
if ($host = 'www.kgc.com')
{
rewrite ^/(.*)$ http://www.newkgc.com/$1 permanent;
}

2. 基于客戶端IP訪問跳轉

vim /usr/local/nginx/conf/nginx.conf
set $rewrite true;
if ($remote_addr = "192.168.6.125") {
set $rewrite false;
}
if ($rewrite = true {
rewrite (.+) /maintenance.html;
}
location = /maintenance.html {
root /usr/share/nginx/html;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81658.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81658.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81658.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ssh連接云服務器記錄

文章目錄 1. 背景2. ssh連接2.1 win 下通過終端工具進行連接2.2 Linux下通過ssh指令連接2.3 ssh使用publickey來連接 ssh連接云服務器記錄 1. 背景 最近開始接觸docker技術、mysql技術&#xff0c;加上本人工作基本都在Linux下進行&#xff0c;因此需要一套Linux環境進行練習。…

軟考-軟件設計師中級備考 12、軟件工程

一、軟件工程概述 定義&#xff1a;軟件工程是一門研究用工程化方法構建和維護有效的、實用的和高質量軟件的學科。它涉及到軟件的開發、測試、維護、管理等多個方面&#xff0c;旨在運用一系列科學方法和技術手段&#xff0c;提高軟件的質量和開發效率&#xff0c;降低軟件開…

【多次彈出“獲取打開此tobiieyetracking鏈接的應用”的窗口】解決辦法

使用聯想R9000P突然出現“獲取打開此tobiieyetracking鏈接的應用”的窗口&#xff0c;每隔幾分鐘就彈一次&#xff0c;特別惡心人&#xff0c;解決辦法&#xff1a; 找到【此電腦】&#xff0c;鼠標右鍵【管理】&#xff1b;選擇【服務】&#xff0c;如下所示&#xff0c;找到…

項目選擇的三個核心因素:市場前景、競爭優勢和成本控制

能保持持續增長和賺錢的項目就是好項目。 每個創業者創業之初&#xff0c;遇到的第一個難題就是選擇做什么項目&#xff1f; 俗話說&#xff1a;方向不對&#xff0c;努力白費。 選錯項目&#xff0c;意味著你所有的付出都是打水漂。 能做的項目那么多&#xff0c;在沒有價值…

裸機 Kubernetes 集群負載均衡器:MetalLB 深度解析與實戰指南

一、引言 在云原生架構中&#xff0c;Kubernetes 默認的負載均衡能力依賴于云廠商&#xff08;如 AWS ELB、GCP LB&#xff09;&#xff0c;但在裸機或本地數據中心環境中&#xff0c;這一功能缺失導致 LoadBalancer 類型的 Service 始終處于 Pending 狀態。此時&#xff0c;M…

2025年- H20-Lc128-240. 搜索二維矩陣 II(矩陣)---java版

1.題目描述 2.思路 遍歷矩陣&#xff0c;然后如果遇到矩陣中的值正好等于target&#xff0c;輸出true。否則&#xff0c;輸出false。 3.代碼 public class H240 {public boolean searchMatrix(int[][] matrix, int target) {//1.計算出總的行值&#xff0c;總的列值。int mm…

系統架構設計師:設計模式——行為設計模式

一、行為設計模式 行為模式涉及算法和對象間職責的分配。行為模式不僅描述對象或類的模式&#xff0c;還描述它們之間的通信模式。這些模式刻畫了在運行時難以跟蹤的、復雜的控制流。它們將用戶的注意力從控制流轉移到對象間的聯系方式上來。 行為類模式使用繼承機制在類間分…

java springboot實現MCP Server SSE

參考&#xff1a; https://juejin.cn/post/7491881721278529570 SpringAI 實現 SSE MCP Server項目 - Auler - 博客園 springboot-MCPserver-JUnit: 使用springboot支持mcp項目搭建&#xff0c;同時有著便捷的單元測試來進行敏捷開發對話即服務&#xff1a;Spring BootMCP讓…

LeetCode 熱題 100 48. 旋轉圖像

LeetCode 熱題 100 | 48. 旋轉圖像 大家好&#xff0c;今天我們來解決一道經典的算法題——旋轉圖像。這道題在LeetCode上被標記為中等難度&#xff0c;要求我們將一個 n n 的二維矩陣&#xff08;圖像&#xff09;順時針旋轉90度&#xff0c;并且必須原地修改矩陣&#xff0…

嵌入式按鍵原理、中斷過程與中斷程序設計(鍵盤掃描程序)

按鍵去抖動 ? 通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時&#xff0c;電壓信號波型如下圖。由于機械觸點的彈性作用&#xff0c;一個按鍵開關在閉合時不會馬上穩定地接通&#xff0c;在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動。…

數據結構之哈夫曼樹

8.哈夫曼樹 8.1 哈夫曼編碼 哈夫曼編碼&#xff08;Huffman Coding&#xff09;&#xff0c;又稱霍夫曼編碼&#xff0c;是一種可變字長編碼&#xff08;VLC&#xff09;方式 這種編碼方法完全依據字符出現的概率來構造異字頭的平均長度最短的碼字&#xff0c; 因此有時也被…

機器學習實操 第一部分 機器學習基礎 第5章 支持向量機(SVM)

機器學習實操 第一部分 機器學習基礎 第5章 支持向量機&#xff08;SVM&#xff09; 內容概要 第5章深入介紹了支持向量機&#xff08;SVM&#xff09;&#xff0c;這是一種功能強大且應用廣泛的機器學習模型。SVM適用于線性或非線性分類、回歸以及 novelty detection。本章詳…

Webug4.0靶場通關筆記14- 第18關 文件上傳之Nginx解析缺陷

目錄 第18關 滲透實戰 1.打開靶場 2.構造php腳本 3.源碼分析 &#xff08;1&#xff09;客戶端源碼 &#xff08;2&#xff09;服務的源碼 4.Nginx解析法滲透 &#xff08;1&#xff09;缺陷原因 &#xff08;2&#xff09;缺陷條件 &#xff08;3&#xff09;構造腳…

【QT】QT中的網絡編程(TCP 和 UDP通信)

QT中的網絡編程&#xff08;TCP 和 UDP通信&#xff09; 1.tcp1.1 tcp通信1.1.1 相比linux中tcp通信:1.1.2 QT中的tcp通信: 1.2 tcp通信流程1.2.1 服務器流程&#xff1a;1.2.1.1 示例代碼1.2.1.2 現象 1.2.2 客戶端流程&#xff1a;1.2.2.1 示例代碼1.2.2.2 現象&#xff1a; …

架構思維:使用懶加載架構實現高性能讀服務

文章目錄 一、引言二、讀服務的功能性需求三、兩大基本設計原則1. 架構盡量不要分層2. 代碼盡可能簡單 四、實戰方案&#xff1a;懶加載架構及其四大挑戰五、改進思路六、總結與思考題 一、引言 在任何后臺系統設計中&#xff0c;「讀多寫少」的業務場景占據主流&#xff1a;瀏…

永磁同步電機控制算法--基于PI的位置伺服控制

一、原理介紹 永磁同步伺服系統是包含了電流環、速度環和位置環的三環控制系統。 伺服系統通過電流檢測電路和光電編碼器檢測電動機三相繞組電流和轉子位置θ&#xff0c;通過坐標變換&#xff0c;計算出轉矩電流分量iq和勵磁電流分量id。 位置信號指令與實際轉子位置信號的差…

linux系統線程實現原理淺析

背景 對進程和線程的理解&#xff0c;之前一直都是憑一些零碎不完整的信息在理解&#xff1b; linux的進程和線程基本上一樣&#xff0c;線程是輕量級進程&#xff0c;彼此有關聯又獨立。 得虧內核支持的好&#xff0c;寫用戶態程序可以不依賴于實現的理解&#xff0c;只需要…

MySQL連接報錯處理:1130-host ... is not allowed to connect to this MySql server

在MySQL安裝完成后&#xff0c;很多開發者會遇到這樣一個問題&#xff1a; 錯誤代碼 1130&#xff1a;host xxx.xxx.xxx.xxx is not allowed to connect to this MySql server 這個錯誤通常出現在你嘗試通過遠程工具&#xff08;如 Navicat、DBeaver 等&#xff09;連接 MySQL …

Linux系統之----進程控制

1.進程創建 進程創建部分由于就是fork函數&#xff0c;還有寫時拷貝&#xff0c;在上一篇已經講述過了&#xff0c;這里不在進行贅述&#xff0c;有疑問的讀者可以前往上一篇博文《Linux系統--程序地址空間》中閱讀&#xff01; 這里在多說一嘴寫時拷貝吧 我們可以對比一下寫…

Spring框架的設計目標,設計理念,和核心是什么 ?

Spring框架是一個為簡化企業級應用開發而設計的開源框架&#xff0c;它提供了全面的基礎設施支持&#xff0c;使得Java應用開發更加簡單、快速和可維護。下面我將詳細解釋Spring框架的設計目標、設計理念以及核心組件。 設計目標 簡化Java企業級應用開發&#xff1a;通過提供…