目錄
負載平衡介紹
什麼是負載平衡
為什麼需要負載平衡
首頁 運維 Nginx Nginx怎麼使用ngx_http_upstream_module實現負載平衡功能

Nginx怎麼使用ngx_http_upstream_module實現負載平衡功能

May 18, 2023 pm 07:01 PM
nginx

    負載平衡介紹

    什麼是負載平衡

    負載平衡(Load Balance),意思是將負載(工作任務,訪問請求)進行平衡、分攤到多個操作單元(伺服器,元件)上執行。

    為什麼需要負載平衡

    當單一web伺服器直接面向用戶,可能要承載著大量的並發請求,單一伺服器可能難以負荷,我們需要使用多台web伺服器組成一個集群,利用Nginx負載平衡功能,將請求分發給不同的後端伺服器,實現負載的流量分發,提升整體效能、以及系統的容災能力。

    • 負載平衡與代理有什麼區別

    #代理程式是代理一台伺服器基於URI調度,調度到不同功能的應用節點

    負載平衡是將客戶端請求透過proxy_pass代理到一組upstream資源池

    • #實作負載平衡場景

    ##實現負載均衡功能需要使用兩個模組:

    • proxy_pass:代理模組

    • upstream:虛擬資源池

    範例:一個官方的負載平衡展示

    upstream backend {
        server backend1.example.com       weight=5;
        server backend2.example.com:8080;
        server unix:/tmp/backend3;
    
        server backup1.example.com:8080   backup;
        server backup2.example.com:8080   backup;
    }
    
    server {
        location / {
            proxy_pass http://backend;
        }
    }
    登入後複製

    範例:自己完成一個小例子

    upstream node {
        server 192.168.10.3:80;
        server 192.168.10.4:80;
    }
    server {
        listen 80;
        server_name www.yyang.com;
        location / {
            proxy_pass http://node;
            include prxoy_params;
        }
    }
    登入後複製

    負載平衡調度演算法

    輪詢調度

    依序逐一分配到不同的後端節點,也是預設演算法。 (簡單來說就是1:1:1)

    加權輪詢考慮到不同伺服器的效能不同,給予節點不同的權值,使其接收對應的權值請求數

    server 192.168.10.3:80 weight=3;
    server 192.168.10.4:80 weight=1;
    登入後複製

    以上這個例子是說每4個請求會分配給10.3三個,10.4一個,以此循環。

    ip_hash

    根據使用者請求的IP,對該IP進行hash運算,根據運算的值將請求指派給後端特定的一台節點進行處理。

    取值範圍為ipv4位址的前三個8位元或ipv6的整個位址作為雜湊鍵,確保來自從一個客戶端的IP始終傳遞給同一台伺服器,除非次伺服器不可用。簡單點說,172.16.20.1和172.16.20.2的前三組數字是一樣的(都是172.16.20)

    ip_hash運算公式:hash(ip)%node_counts=index

    ip_hash帶來的問題:

    大量相同IP的請求會造成某個節點流量過大
    如果暫時下線一台節點,會重新計算hash值,建議使用down狀態

    範例:注意ip_hash與權重不可同時使用

    ip_hash;
    server 192.168.10.3:80;
    server 192.168.10.4:80;
    登入後複製

    一致性hash

    為了避免上述問題,所以誕生了一致性hash,使用取模的方式,但不對伺服器節點數量取模,而是對2的32次方取模,hash函數值為0​​~2^32-1。 (形成一個虛擬圓環,用戶請求會發給順時針相鄰的節點)

    有一個問題:如果後端節點較少可能會造成資料傾斜,所以一致性hash引入了虛擬節點機制,即對每個伺服器計算多個哈希,每個計算結果位置都放置一個虛擬節點。
    如果我們想使用ip_hash,但計算公式使用一致性hash,該怎麼做?

    hash $remote_addr consistent;
    server 192.168.10.3:80;
    server 192.168.10.4:80;
    登入後複製

    url_hash

    根據使用者的url進行hash取模,根據運算值,將請求分配給特定的後端伺服器。

    1.用戶請求nginx負載均衡,透過url演算法,請求調度至cache1

    2.cache1沒有數據,會向後端獲取,返回數據,並將數據緩存
    3.當其他使用者存取相同url時,調度器仍會調度到cache1節點
    4.cache1會直接將資料傳回

    hash $request_uri consistent;
    server 192.168.10.3:80;
    server 192.168.10.4:80;
    登入後複製

    least_conn

    #哪台伺服器的連線數最少,就將請求調度到這台伺服器

    least_conn;
    server 192.168.10.3:80;
    server 192.168.10.4:80;
    登入後複製

    負載平衡後端節點狀態

    down##將伺服器節點標記為不可用狀態,一般用於停機維護。

    server 192.168.10.3:80 down;
    server 192.168.10.4:80;
    登入後複製

    backup

    備用節點,正常情況不會調度到此節點;當正常工作節點全部不可用時,會啟用此節點;當節點恢復時此節點會繼續恢復備用狀態。

    server 192.168.10.3:80;
    server 192.168.10.4:80;
    server 192.168.10.5:80 backup;
    登入後複製

    max_conns

    用來限制每個後端節點接收到的最大的TCP連線數,如果超出限制就會拋出錯誤。

    server 192.168.10.3:80 max_conns=10;
    server 192.168.10.4:80 max_conns=10;
    登入後複製

    一台可以連接10.兩台是20,超過20就會出錯。

    keepalived

    與後端伺服器啟動緩存,也就是長鏈接,提升網站吞吐量。

    預設不啟用此功能,當有請求時,會建立連接,維護連接,關閉連接,所以會存在網路消耗;但是如果所有連接都快取了,當連接空閒了又會佔用其他系統資源,所以可以使用keepalived參數。

    server 192.168.10.3:80;
    server 192.168.10.4:80;
    
    keepalived 32;   # 最大空闲连接数的个数
    keepalived_timeout 100s; # 空闲连接的超时时间
    
    # 需要配合以下两个参数使用
    
    proxy_http_version 1.1;
    proxy_set_header connection "";
    登入後複製

    max_fails與fail_timeout

    max_fails=2:服务器通信失败两次,认为服务器不可用
    fail_timeout=5s:服务器通信失败后,每5秒探测一次服务器是否恢复正常。
    在fail_timeout设定时间内,与服务器连接失败次数达到max_fails数量,则认为服务器不可用。
    如果不设置的话默认是探测一次,间隔10s。

    server 192.168.10.3:80 max_fails=2 fail_timeout=5s;
    server 192.168.10.4:80 max_fails=2 fail_timeout=5s;
    登入後複製

    以上是Nginx怎麼使用ngx_http_upstream_module實現負載平衡功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    docker容器名稱怎麼查 docker容器名稱怎麼查 Apr 15, 2025 pm 12:21 PM

    可以通過以下步驟查詢 Docker 容器名稱:列出所有容器(docker ps)。篩選容器列表(使用 grep 命令)。獲取容器名稱(位於 "NAMES" 列中)。

    nginx在windows中怎麼配置 nginx在windows中怎麼配置 Apr 14, 2025 pm 12:57 PM

    如何在 Windows 中配置 Nginx?安裝 Nginx 並創建虛擬主機配置。修改主配置文件並包含虛擬主機配置。啟動或重新加載 Nginx。測試配置並查看網站。選擇性啟用 SSL 並配置 SSL 證書。選擇性設置防火牆允許 80 和 443 端口流量。

    nginx怎麼配置雲服務器域名 nginx怎麼配置雲服務器域名 Apr 14, 2025 pm 12:18 PM

    在雲服務器上配置 Nginx 域名的方法:創建 A 記錄,指向雲服務器的公共 IP 地址。在 Nginx 配置文件中添加虛擬主機塊,指定偵聽端口、域名和網站根目錄。重啟 Nginx 以應用更改。訪問域名測試配置。其他注意事項:安裝 SSL 證書啟用 HTTPS、確保防火牆允許 80 端口流量、等待 DNS 解析生效。

    怎麼查看nginx是否啟動 怎麼查看nginx是否啟動 Apr 14, 2025 pm 01:03 PM

    確認 Nginx 是否啟動的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 檢查端口 80 是否開放;3. 查看系統日誌中 Nginx 啟動消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

    nginx怎麼查版本 nginx怎麼查版本 Apr 14, 2025 am 11:57 AM

    可以查詢 Nginx 版本的方法有:使用 nginx -v 命令;查看 nginx.conf 文件中的 version 指令;打開 Nginx 錯誤頁,查看頁面的標題。

    docker怎麼創建容器 docker怎麼創建容器 Apr 15, 2025 pm 12:18 PM

    在 Docker 中創建容器: 1. 拉取鏡像: docker pull [鏡像名] 2. 創建容器: docker run [選項] [鏡像名] [命令] 3. 啟動容器: docker start [容器名]

    docker怎麼啟動容器 docker怎麼啟動容器 Apr 15, 2025 pm 12:27 PM

    Docker 容器啟動步驟:拉取容器鏡像:運行 "docker pull [鏡像名稱]"。創建容器:使用 "docker create [選項] [鏡像名稱] [命令和參數]"。啟動容器:執行 "docker start [容器名稱或 ID]"。檢查容器狀態:通過 "docker ps" 驗證容器是否正在運行。

    怎麼啟動nginx服務器 怎麼啟動nginx服務器 Apr 14, 2025 pm 12:27 PM

    啟動 Nginx 服務器需要按照不同操作系統採取不同的步驟:Linux/Unix 系統:安裝 Nginx 軟件包(例如使用 apt-get 或 yum)。使用 systemctl 啟動 Nginx 服務(例如 sudo systemctl start nginx)。 Windows 系統:下載並安裝 Windows 二進製文件。使用 nginx.exe 可執行文件啟動 Nginx(例如 nginx.exe -c conf\nginx.conf)。無論使用哪種操作系統,您都可以通過訪問服務器 IP

    See all articles