Nginx技術方案【學習記錄】

文章目錄

  • 1. 需求分析
    • 1.1 應用場景
    • 1.2 實現目標
  • 2. Nginx反向代理與實現均衡負載
    • 2.1 部署架構
    • 2.2 架構描述
      • 2.2.1 Nginx代理服務器
      • 2.2.2 API服務器與API服務器(Backup)
      • 2.2.3 `nginx.conf`配置文件
      • 2.2.4 測試方法
  • 3. 高速會話緩存技術
    • 3.1 問題背景
    • 3.2 使用 Redis 存儲 Session
      • 3.2.1 優勢
      • 3.2.2 部署架構圖
      • 3.2.3 后端配置

1. 需求分析

1.1 應用場景

  1. 經典的接口服務(API)訪問場景:需要在多臺后端服務器之間實現負載均衡,同時通過 Nginx 實現反向代理來對外統一出口
  2. 兩臺進行主負載均衡, 一臺作為備用服務器(只有主服務器都不可用時才啟用)

1.2 實現目標

  1. 多臺 API 服務器之間實現請求均衡分發,提高服務并發能力
  2. 使用 Nginx 作為統一訪問入口,隱藏后端結構
  3. 保證接口請求的響應速度和可靠性

2. Nginx反向代理與實現均衡負載

2.1 部署架構

image-20250425160444911

2.2 架構描述

2.2.1 Nginx代理服務器

需要有一個獨立的前置 Nginx 服務器,用于接收所有客戶端請求并進行反向代理和負載均衡。這個服務器不參與接口服務本身,而是作為網關服務器存在。

(單獨一臺機器或輕量容器,部署在公網可訪問或局域網的前端位置)

2.2.2 API服務器與API服務器(Backup)

部署在內網的三臺后端服務器,監聽特定端口。其中Backup作為后備服務器,在請求訪問主API服務器時啟動。

2.2.3 nginx.conf配置文件

Nginx配置示例:


http {upstream api_backend {# 主服務器(輪詢)server 192.168.1.101:5000 max_fails=3 fail_timeout=30s;server 192.168.1.102:5000 max_fails=3 fail_timeout=30s;# 后備服務器,僅在主服務器全部不可用時啟用server 192.168.1.103:5000 backup;}server {listen 80;  # 對外暴露的portserver_name api.example.com;  # 對外暴露的hostlocation / {proxy_pass http://api_backend;# 常規頭設置proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 連接優化proxy_connect_timeout 5;proxy_send_timeout 30;proxy_read_timeout 30;}}
}

Nginx配置項說明:


配置項說明
upstream api_backend上游服務器池
max_fails最大失敗次數
fail_timeout最大失敗等待時間
proxy_connect_timeout連接后端服務器的超時時間(TCP 三次握手時間限制)
proxy_send_timeoutNginx 向后端服務器發送請求的超時時間
proxy_read_timeout等待后端服務器響應的最大時間

主服務器輪詢機制:


  • 默認輪詢(Round Robin)

    每個請求依次分發給后端服務器,不考慮服務器性能或連接數。

    upstream api_backend {server 192.168.1.101:5000;server 192.168.1.102:5000;
    }
    
  • 權重輪詢(Weighted Round Robin)

    根據每臺服務器的性能分配不同權重,權重越高,請求越多。

    upstream api_backend {server 192.168.1.101:5000 weight=3;server 192.168.1.102:5000 weight=1;
    }
    
  • 最少連接數(Least Connections)

    將請求分發給當前連接數最少的服務器。

    upstream api_backend {least_conn;server 192.168.1.101:5000;server 192.168.1.102:5000;
    }
    
  • IP 哈希(IP Hash)

    根據客戶端 IP 分發請求,同一 IP 總是轉發給同一臺后端服務器,適合需要會話保持的情況。

    upstream api_backend {ip_hash;server 192.168.1.101:5000;server 192.168.1.102:5000;
    }
    

    注:ip_hash 不支持 backup 參數

算法特點適用場景
Round Robin簡單依次轉發默認,性能相近的服務器
Weight按性能分配負載部分服務器性能較強
Least Conn優先連接少的服務器請求耗時長/負載不均
IP Hash同 IP 請求同一服務器需要 Session 保持

后備服務器生效機制(Backup)


Nginx 會自動探測主服務器失敗(例如連接超時、502、503等),如果全部主節點失敗,則自動切換到 backup 節點處理請求。

2.2.4 測試方法

  1. 正常訪問時,輪詢 Server1 和 Server2
  2. 停止 Server1 和 Server2,再訪問接口,請求會自動落到 Server3
  3. 恢復主節點后,訪問會自動回歸主服務器

3. 高速會話緩存技術

3.1 問題背景

在使用 Nginx 做負載均衡時,請求會被分發到不同的后端服務器,而如果會話(Session)信息保存在單臺服務器上,會導致以下問題:

  • 登錄狀態丟失
  • 用戶需要重復登錄
  • 無法維持用戶上下文信息

3.2 使用 Redis 存儲 Session

3.2.1 優勢

  • 快速、共享、可橫向擴展
  • 多個后端節點可以訪問同一份 Session 數據

3.2.2 部署架構圖

image-20250425171927386

3.2.3 后端配置

在 Flask / Django / Spring Boot 等應用中配置:

  • 將用戶 Session 保存在 Redis 中(而非本地內存)
  • 各服務器通過 Redis 獲取 Session 數據

Flask示例:

# Flask 示例(使用 Flask-Session)
from flask import Flask, session
from flask_session import Sessionapp = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.Redis(host='localhost', port=6379)
Session(app)

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

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

相關文章

Ubuntu22.04怎么退出Emergency Mode(緊急模式)

1.使用nano /etc/fstab命令進入fstab文件下; 2.將掛載項首行加#注釋掉,修改完之后使用ctrlX退出; 3.重啟即可退出緊急模式!

Unity 紅點系統

首先明確一個,即紅點系統的數據結構是一顆樹,并且紅點的數據結構的初始化需要放在游戲的初始化中,之后再是對應的紅點UI側的注冊,對應的紅點UI在銷毀時需要注銷對紅點UI的顯示回調注冊,但是不銷毀數據側的紅點注冊 - …

極新攜手火山引擎,共探AI時代生態共建的破局點與增長引擎

在生成式AI與行業大模型的雙重驅動下,人工智能正以前所未有的速度重構互聯網產業生態。從內容創作、用戶交互到商業決策,AI技術滲透至產品研發、運營的全鏈條,推動效率躍升與創新模式變革。然而,面對AI技術迭代的爆發期&#xff0…

【Redis】SDS結構

目錄 1、背景2、SDS底層實現 1、背景 redis作為高性能的內存數據庫,對字符串操作(如鍵、值的存儲)有極高的要求。c語言原生字符串(以\0結尾的字符串數據)有一些缺點:長度計算需要遍歷(O(n)時間…

STM32硬件I2C驅動OLED屏幕

本文基于STM32硬件I2C驅動SSD1306 OLED屏幕,提供完整的代碼實現及關鍵注意事項,適用于128x32或128x64分辨率屏幕。代碼通過模塊化設計,支持顯示字符、數字、漢字及位圖,并優化了顯存刷新機制。 零、完整代碼 完整代碼: 1&#x…

鴻蒙 PC 發布之后,想在技術上聊聊它的未來可能

最近鴻蒙 PC 剛發布完,但是發布會沒公布太多技術細節,基本上一些細節都是通過自媒體渠道獲取,首先可以確定的是,鴻蒙 PC 本身肯定是無法「直接」運行 win 原本的應用,但是可以支持手機上「原生鴻蒙」的應用&#xff0c…

【JAVA】抽象類與接口:設計模式中的應用對比(16)

核心知識點詳細解釋 Java抽象類和接口的定義、特點和使用場景 抽象類 抽象類是使用 abstract 關鍵字修飾的類。它不能被實例化,主要用于作為其他類的基類,提供一些通用的屬性和方法。抽象類可以包含抽象方法和具體方法。抽象方法是使用 abstract 關鍵…

HTML 顏色全解析:從命名規則到 RGBA/HSL 值,附透明度設置與場景應用指南

一、HTML 顏色系統詳解 HTML 中的顏色可以通過多種方式定義,包括顏色名稱、RGB 值、十六進制值、HSL 值等,同時支持透明度調整。以下是詳細分類及應用場景: 1. 顏色名稱(預定義關鍵字) HTML 預定義了 140 個標準顏色名…

LVS負載均衡群集和keepalive

目錄 一. 集群概述 1.1 集群的定義 1.2 集群的分類 1. 高可用集群 HA 2. 高性能運輸群集 HPC 3.負載均衡群集 LB 4. 分布式存儲集群 二. LVS概述 2.1 LVS的定義 2.2 LVS的工作原理 2.3 LVS 的三種工作模式 2.4 LVS 三種工作模式的對比 2.5 LVS 調度算法 1. 靜態…

ZTE 7551N 中興小鮮60 遠航60 努比亞小牛 解鎖BL 刷機包 刷root 展訊 T760 bl

ZTE 7551N 中興小鮮60 遠航60 努比亞小牛 解鎖BL 刷機包 刷root 3款機型是一個型號,包通用, ro.product.system.modelZTE 7551N ro.product.system.nameCN_P720S15 #################################### # from generate-common-build-props # Th…

單片機-STM32部分:12、I2C

飛書文檔https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh 一、簡介 IIC協議,又稱I2C協議,是由PHILP公司在80年代開發的兩線式串行總線,用于連接微控制器及其外圍設備,IIC屬于半雙工同步通信方式。 IIC是一種同步…

Virtualized Table 虛擬化表格 el-table-v2 表頭分組 多級表頭的簡單示例

注意添加這個屬性,會影響到有多少個層級的表頭: :header-height“[50, 40]”,即后面的columnIndex 如果有fix的列CustomizedHeader會被調用多次,如果有多個層級的表頭,也會被調用多次, 實際被調用次數是(fix數 1 * 表頭層級數量) 以下代碼均刪除了JSX TS版本代碼 <templ…

防御保護-----第十二章:VPN概述

文章目錄 第二部分&#xff0c;數據安全第十二章&#xff1a;VPN概述VPN概述VPN分類VPN關鍵技術隧道技術身份認證技術加解密技術數據認證技術 數據的安全傳輸密碼學發展史 對稱加密算法 --- 傳統密碼算法密鑰解釋流加密分組加密 --- 塊加密算法填充算法PKCS7算法分組模式 公鑰密…

前端項目打包部署流程j

1.打包前端項目(運行build這個文件) 2.打包完成后&#xff0c;控制臺如下所示:(沒有報錯即代表成功) 3.左側出現dist文件夾 4.準備好我們下載的nginx(可以到官網下載一個),然后在一個沒有中文路徑下的文件夾里面解壓。 5.在繼承終端內打開我們的項目&#xff0c;找到前面打包好…

Go語言標識符

文章目錄 標識符的組成規則Go語言關鍵字預定義標識符標識符命名慣例 特殊標識符標識符訪問權限控制 在Go語言中&#xff0c;標識符(Identifier)是用來命名變量、函數、類型、常量等程序實體的名稱。 標識符的組成規則 1、必須以字母或下劃線(_)開頭&#xff1a; 字母包括Unico…

CST軟件對OPERACST軟件聯合仿真汽車無線充電站對人體的影響

上海又收緊了新能源車的免費上牌政策。所以年前一些伙伴和我探討過買新能源汽車的問題&#xff0c;小伙伴們基本糾結的點是買插電還是純電&#xff1f;我個人是很抗拒新能源車的&#xff0c;也開過坐過。個人有幾個觀點&#xff1a; 溢價過高&#xff0c;不保值。實際并不環保…

吳恩達機器學習筆記:多變量梯度下降

1.多維特征 之前我們探討了單變量/特征的回歸模型&#xff0c;現在我們對房價模型增加更多的特征&#xff0c;例如房間數樓層等&#xff0c;構成一個含有多個變量的模型&#xff0c;模型中的特征為 &#xff08; x 1 &#xff0c; x 2 &#xff0c; x 3... x n &#xff09; &…

【Linux Nano Vim快捷鍵大全】

Nano 快捷鍵大全 常用高頻操作 功能描述快捷鍵組合替代按鍵/備注使用頻率顯示幫助CtrlGF1高保存文件CtrlOF3高退出編輯器CtrlXF2高剪切當前行CtrlKF9高粘貼內容CtrlUF10高搜索文本CtrlWF6高替換文本Ctrl\AltR高撤銷操作AltU無中重做操作AltE無中跳轉到行號Ctrl_AltG中插入文件…

uniapp vue 沉浸式窗體如何獲取并排除外部手機瀏覽器底部菜單欄工具欄高度

這個問題可以簡稱為&#xff1a;uniapp vue 獲取可視窗口高度 第一種方案&#xff0c;只改變css樣式 /* 不考慮瀏覽器UI的最小視口高度 */ .element {height: 100svh; /* small viewport height */ }/* 考慮瀏覽器UI變化的動態視口高度 */ .element {height: 100dvh; /* dyna…

React Native告別圖標體積大手動更換慢的噩夢:讓圖標更新像修改文字一樣簡單

寫在前面:凌晨三點的圖標戰爭 “所有圖標都要換成圓角風格,明天上線!”——產品經理這條消息彈出時,我的保溫杯差點從手中滑落。掃了一眼項目中的347個圖標文件,我知道今晚又是個不眠夜。但就在絕望之際,同事發來一個GIF:他只是在終端輸入了iconfont-rn --update,所有…