關于nginx,負載均衡是什么?它能給我們的業務帶來什么?怎么去配置它?

User
關于nginx,我還想知道,負載均衡是什么?它能為我的業務帶來什么?怎么去配置它?


Assistant
負載均衡是 Nginx 另一個非常強大的功能,也是構建高可用、高性能應用的關鍵技術之一。我們來詳細了解一下。

1. 什么是負載均衡 (Load Balancing)?

想象一下一個超市只有一個收銀臺,高峰期肯定會排起長隊。負載均衡就像是超市增開了多個收銀臺,并有一個調度員指揮顧客去當前最空閑或下一個可用的收銀臺結賬。

在網絡世界里:

  • 負載均衡 是一種將網絡請求(比如來自用戶瀏覽器的 HTTP 請求)分發多個后端服務器上的技術。
  • 這些后端服務器都運行著相同的應用程序或服務(比如你的 FastAPI 應用)。
  • Nginx 可以扮演這個“調度員”的角色,接收所有進來的請求,然后根據一定的策略(算法)將請求轉發給后端服務器集群(也稱為“上游服務器組”或 “Upstream”)中的某一臺服務器。

核心目的:

  • 防止單點過載: 避免所有請求都壓在單一服務器上,導致其性能下降甚至崩潰。
  • 提高處理能力: 多個服務器協同工作,可以處理比單個服務器大得多的并發請求量。
  • 提升可用性: 如果后端集群中的某臺服務器發生故障,負載均衡器可以檢測到并停止向其發送請求,將請求轉發給其他健康的服務器,從而保證服務的持續可用。

2. 負載均衡能為你的業務帶來什么?

為你的 Vue + FastAPI 項目引入 Nginx 負載均衡,可以帶來顯著的好處:

  • 高可用性 (High Availability):
    • 這是最重要的好處之一。如果你的 FastAPI 應用部署在多臺服務器上(或者同一臺服務器的多個端口上運行多個實例),當其中一個實例因為維護、更新或意外崩潰而宕機時,Nginx 會自動將新的請求發送給其他健康的實例。用戶幾乎不會察覺到服務中斷(或者中斷時間極短),大大提高了應用的穩定性和可靠性。
  • 提升性能和響應速度:
    • 通過將請求分散到多個后端服務器,減輕了單個服務器的壓力。每臺服務器可以更快地處理分配給它的請求,從而縮短用戶的等待時間,提升整體體驗。
  • 更好的可伸縮性 (Scalability):
    • 當你的用戶量增長,請求壓力增大時,你不需要去升級單臺服務器的硬件(垂直擴展,成本高且有上限)。你可以簡單地在后端集群中增加更多的應用實例(水平擴展),然后在 Nginx 的 upstream 配置中添加這些新實例即可。Nginx 會自動將負載分配到這些新加入的服務器上,輕松應對流量增長。
  • 簡化維護:
    • 你需要更新后端應用版本或進行服務器維護時,可以先將某臺服務器從 Nginx 的負載均衡池中平滑移除(或標記為 down),Nginx 不再向其發送新請求。等現有請求處理完畢后,你就可以安全地對其進行操作,完成后再加回池中。整個過程對用戶是透明的,服務不中斷。

3. 如何配置 Nginx 負載均衡?

配置 Nginx 負載均衡主要涉及兩個部分:upstream 塊和修改 location 塊中的 proxy_pass

步驟:

  1. 準備多個后端實例: 首先,你需要確保你的后端服務(FastAPI 應用)有多個正在運行的實例。這些實例可以:

    • 同一臺服務器的不同端口上運行(例如:127.0.0.1:8080, 127.0.0.1:8081, 127.0.0.1:8082)。
    • 不同的服務器上運行(例如:192.168.1.10:8080, 192.168.1.11:8080)。
  2. 定義 upstream 塊:

    • 在 Nginx 配置文件 (nginx.conf 或相關的虛擬主機配置文件) 的 http 上下文內(通常在 server之前),定義一個 upstream 塊。這個塊用來列出所有提供相同服務的后端服務器。
    • 給這個 upstream 塊起一個名字,比如 my_backend_serversapi_cluster
    http {# ... 其他 http 配置 ...# 定義后端 API 服務器集群upstream backend_api_servers {# Nginx 會輪流將請求發往這些服務器 (默認 Round Robin 策略)server 120.78.7.226:8080;       # 你的第一個 FastAPI 實例# 假設你在同一臺機器的 8081 端口啟動了第二個實例server 120.78.7.226:8081;# 如果有第三個實例...# server 120.78.7.226:8082;# 如果實例在其他機器上...# server backend_server_ip_2:8080;}server {listen 80;server_name 120.78.7.226 _;root /www/wwwroot/dist;index index.html index.htm;# ... 其他 server 配置 ...# API 請求的 location 塊location /api/ {# 將 proxy_pass 指向 upstream 塊的名稱proxy_pass http://backend_api_servers/; # 注意這里的名稱和 upstream 塊一致,末尾斜杠用于去除 /api/ 前綴# 其他代理設置保持不變或按需添加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_set_header X-Forwarded-Proto $scheme;proxy_connect_timeout 60s;proxy_send_timeout 60s;proxy_read_timeout 60s;}# ... 其他 location 塊 ...}
    }
    
  3. 修改 location 塊的 proxy_pass:

    • 找到之前處理 API 請求的 location /api/ 塊。
    • proxy_pass 指令的值,從指向單個后端服務器地址 (http://120.78.7.226:8080/) 修改為指向你剛剛定義的 upstream 塊的名稱 (http://backend_api_servers/)。 注意: 這里的 http:// 不能省略,并且如果你想讓 Nginx 去掉 /api/ 前綴,目標 upstream 名稱后面仍然需要加上斜杠 /
  4. 選擇負載均衡策略 (可選):

    • Nginx 默認使用輪詢 (Round Robin) 策略:按順序將請求依次分配給后端服務器。
    • 你可以在 upstream 塊中指定其他策略:
      • least_conn;: 將請求分配給當前活動連接數最少的服務器。適合處理耗時不同的請求。
      • ip_hash;: 根據客戶端的 IP 地址進行哈希計算,確保來自同一客戶端的請求總是被發送到同一臺后端服務器。這對于需要保持會話狀態(Session)但又沒有使用共享 Session 機制的應用很有用。但可能導致負載不均。
      • hash $request_uri consistent; (需要 Nginx 1.7.2+): 基于某個 key (如請求 URI) 進行哈希,consistent 參數保證后端服務器增減時,只有少量 key 的映射會改變。
    upstream backend_api_servers {least_conn; # 使用最少連接策略server 120.78.7.226:8080;server 120.78.7.226:8081;
    }
    
  5. 配置健康檢查 (可選但推薦):

    • 為了讓 Nginx 能夠自動剔除故障服務器,可以在 server 指令后面添加參數:
      • max_fails=number: 在 fail_timeout 時間內,嘗試連接后端服務器失敗多少次后,就認為該服務器宕機。默認為 1。
      • fail_timeout=time: 服務器被標記為宕機后,多長時間內 Nginx 不會再嘗試向其發送請求。同時也是 max_fails 的統計時間窗口。默認 10 秒。
    • Nginx 開源版本只提供被動的健康檢查(即請求失敗時才發現)。Nginx Plus(商業版)或使用第三方模塊可以實現主動健康檢查(定期發送探測請求)。
    upstream backend_api_servers {server 120.78.7.226:8080 max_fails=3 fail_timeout=30s; # 30秒內失敗3次則標記為宕機30秒server 120.78.7.226:8081 max_fails=3 fail_timeout=30s;
    }
    
  6. 測試并重載配置:

    • 修改完配置后,務必先用 nginx -t 測試語法是否正確。
    • 如果測試通過,使用 nginx -s reload (或在寶塔面板點擊重載/重啟) 使新配置生效。

現在,Nginx 就會根據你選擇的策略,將所有發往 /api/ 的請求分發給你在 upstream 塊中定義的多個后端 FastAPI 實例了。

總結:

負載均衡是 Nginx 作為反向代理核心能力的重要延伸。通過簡單的 upstreamproxy_pass 配置,你就能為你的應用帶來高可用、高性能和高可伸縮性,是現代 Web 服務架構中不可或缺的一環。

如果你打算在生產環境中正式部署,強烈建議考慮使用負載均衡。即使初期只有少量用戶,它也能為你未來的擴展和維護提供極大的便利。

相關文章

  • Nginx 反向代理,啥是“反向代理“啊,為啥叫“反向“代理?而不叫“正向”代理?它能干哈?-CSDN博客

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

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

相關文章

前端如何優雅地對接后端

作為一名前端開發者,與后端對接是我們日常工作中不可避免的一部分。從API設計的理解到錯誤處理的優雅實現,前端需要的不只是調用接口的代碼,更是一種協作的藝術。本文將從Vue 3項目出發,分享如何與后端高效協作,減少聯…

PYTHON用幾何布朗運動模型和蒙特卡羅MONTE CARLO隨機過程模擬股票價格可視化分析耐克NKE股價時間序列數據

原文鏈接:http://tecdat.cn/?p27099 金融資產/證券已使用多種技術進行建模。該項目的主要目標是使用幾何布朗運動模型和蒙特卡羅模擬來模擬股票價格。該模型基于受乘性噪聲影響的隨機(與確定性相反)變量(點擊文末“閱讀原文”獲取…

頭歌之動手學人工智能-機器學習 --- PCA

目錄 第1關:維數災難與降維 第2關:PCA算法流程 任務描述 編程要求 測試說明 第3關:sklearn中的PCA 任務描述 編程要求 測試說明 第1關:維數災難與降維 第2關:PCA算法流程 任務描述 本關任務:補充…

IOMUXC_SetPinMux的0,1參數解釋

IOMUXC_SetPinMux(IOMUXC_ENET1_RX_DATA0_FLEXCAN1_TX, 0); 這里的第二個參數 0 實際上傳遞給了 inputOnfield,它控制的是 SION(Software Input On)位。 當 inputOnfield 為 0 時,SION 關閉,此時引腳的輸入/輸出方向由…

express響應設置 以及redirect,download,json.sendFdile

Express 中常用響應方法 的整理,包括設置響應頭、重定向、下載、發送 JSON、發送文件等👇 📤 一、設置響應頭與狀態碼 設置狀態碼 res.status(404).send(Not Found);設置響應頭 res.set(Content-Type, text/plain); // 設置內容類型 res.s…

深度學習-數值穩定性和模型初始化

到目前為止,我們實現的每個模型都是根據某個預先制定的分布來初始化模型的參數,有人會認為初始化方案時理所當然的,忽略了如何做出這些選擇的細節,甚至有人可能會覺得,初始化方案的選擇并不是特別重要,實際…

SFINAE(Substitution Failure Is Not An Error)

C 中的 SFINAE(替換失敗并非錯誤) SFINAE(Substitution Failure Is Not An Error)是 C 模板元編程的核心機制之一,允許在編譯時根據類型特性選擇不同的模板實現。以下通過代碼示例和底層原理,逐步解析 SFI…

【Python筆記 04】輸入函數、轉義字符

一、Input 輸入函數 prompt是提示,會在控制臺顯示,用作提示函數。 name input("請輸入您的姓名:") print (name)提示你輸入任意信息: 輸入input test后回車,他輸出input test 二、常用的轉義字符 只講…

什么是量子計算?它能做什么?

拋一枚硬幣。要么正面朝上,要么反面朝上,對吧?當然,那是在我們看到硬幣落地的結果之后。但當硬幣還在空中旋轉時,它既不是正面也不是反面,而是正面和反面都有一定的可能性。 這個灰色地帶就是量子計算的簡…

入門 Go 語言

本專欄的 Go 語言學習參考了B站UP 軟件工藝師的視頻 本節需要: Go 語言環境VSCode 安裝環境 下載 Go 環境,并安裝下載 VSCode,安裝。在 VSCode 中安裝 Go 擴展: 接下來就可以編寫 Go 語言了 第一條 Go Go 語言是一種編譯型…

Oracle EBS R12.2 漢化

一、前言 在使用oracle ebs時,使用中文會更好的理解整個ebs流程,以下介紹oracle r12中文補丁的方式 如果你的系統除了支持英語外,還支持其他語言,比如中文,那你在下載補丁的時候除了下載Generic Platform版本外&#…

參考文獻新國標GB/T 7714-2025的 biblatex 實現

參考文獻新國標GB/T 7714-2025的biblatex實現 新版 GB/T 7714 目前正在修訂和征求意見(https://std.samr.gov.cn/gb/search/gbDetailed?id14CA9D282EB75AC8E06397BE0A0AEA2E)。 根據已經呈現的草案,初步實現了biblatex樣式(詳見biblatex-gb…

Discuz!與DeepSeek的深度融合:打造智能網址導航新標桿

引言 在數字化信息爆炸的時代,網址導航網站作為用戶獲取優質資源、高效瀏覽互聯網的重要入口,其信息篩選能力、用戶體驗和商業化潛力成為了決定其競爭力的核心要素。Discuz!作為國內應用廣泛的社區論壇系統,以其強大的功能擴展性和用戶管理能…

Linux424 chage密碼信息 gpasswd 附屬組

https://chat.deepseek.com/a/chat/s/e55a5e85-de97-450d-a19e-2c48f6669234

【低配置電腦預訓練minimind的實踐】

低配置電腦預訓練minimind的實踐 概要 minimind是一個輕量級的LLM大語言模型,項目的初衷是拉低LLM的學習門檻,讓每個人都能從理解每一行代碼開始, 從零開始親手訓練一個極小的語言模型。對于很多初學者而言,電腦配置僅能夠滿足日…

docker部署Ollama并簡單調用模型

Ollama簡介 Ollama 是一個開源的大型語言模型(LLM)平臺,旨在讓用戶能夠輕松地在本地運行、管理和與大型語言模型進行交互。 Ollama 提供了一個簡單的方式來加載和使用各種預訓練的語言模型,支持文本生成、翻譯、代碼編寫、問答等…

Redis安裝及入門應用

應用資料:https://download.csdn.net/download/ly1h1/90685065 1.獲取文件,并在該文件下執行cmd 2.輸入redis-server-lucifer.exe redis.windows.conf,即可運行redis 3.安裝redis客戶端軟件 4.安裝后運行客戶端軟件,輸入鏈接地址…

《重塑AI應用架構》系列: Serverless與MCP融合創新,構建AI應用全新智能中樞

在人工智能飛速發展的今天,數據孤島和工具碎片化問題一直是阻礙AI應用高效發展的兩大難題。由于缺乏統一的標準,AI應用難以無縫地獲取和充分利用數據價值。 為了解決這些問題,2024年AI領域提出了MCP(Model Context Protocol模型上…

從入門到精通【MySQL】視圖與用戶權限管理

文章目錄 📕1. 視圖??1.1 視圖的基本概念??1.2 試圖的基本操作🔖1.2.1 創建視圖🔖1.2.2 使用視圖🔖1.2.3 修改數據🔖1.2.4 刪除視圖 ??1.3 視圖的優點 📕2. 用戶與權限管理??2.1 用戶🔖…

輸入捕獲模式測頻率

前提工作: PA6、PA0通過跳線相連,PA6測試PA0的輸出頻率 本來只有下列函數,改變占空比 但是我們需要測試頻率,需要動態改變頻率。 void PWM_SetCompare1(uint16_t Compare) {TIM_SetCompare1(TIM2, Compare); //設置CCR1的值 }…