[Web] Nginx+IIS+asp.net mvc 實現負載平衡(load balancing)


Posted by mike-hsieh on 2024-05-07

當網站的人數使用量增加時,會出現效能、吞吐量...議題,所以常見的做法就是負載平衡,簡單說就是同個系統重複建置(例如建置4個: A, B, C, D),但是透過一個主要的入口,系統自動分配使用者訪問到A, B, C, D其中一個系統,達到分散流量的目的。

本次目的: 使用 Asp.net + Mvc + NGinx + IIS 分布式部署和負載平衡,一個網站分布式部署四個port分別是8001~8004,並且我使用nginx會設定port 8888,並且由系統自動分配導至 8001~8004 其中一個。

Step1: 建立Asp.net mvc網站 (這邊就是新開專案而已。)



Step2: IIS建立網站

執行發佈後,發佈檔複製四個,每一個的Index.chtml都給上對應編號1~4。
並建立四個網站,port從8001~8004



Step3: 安裝 Nginx (官網:https://nginx.org/en/download.html)

我使用的是 windows 版,版本是 1.20,安裝後就解壓縮。


Step4: 設定 Nginx

將 conf\nginx.conf 內容置換為以下。

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    #gzip  on;

    upstream myapp {
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
        server 127.0.0.1:8004;
    }

    server {
        listen 8888;

        location / {
            proxy_pass http://myapp;
            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;
        }
    }

}


Step5: 啟動 Nginx

cmd 到 ..\nginx\nginx-1.20.2 資料夾後,輸入指令一

# 指令一: 啟動 nginx
start nginx

# 指令二: 重啟 nginx
nginx -s reload

# 指令三: 停止 nginx
nginx -s stop


Step6: 測試

輸入 http://localhost:8888/ 或是 http://127.0.0.1:8888/ 就可以導到 port 8001~8004 摟。


Step7: 補充及總結

這次不僅是load balancing,其實也有用到反向代理,而port 8888 就是我們的反向代理器。
且負載均衡也有分以下幾種:

# 輪詢演算法的負載均衡 (最基本的,不用調整就有)
# 方式: 依次分配。
upstream backend_servers {
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
    server 127.0.0.1:8004;
}

# IP Hash演算法的負載均衡
# 方式: 根據IP位址的Hash值分配給不同的目標伺服器。
upstream backend_servers {
    ip_hash;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
    server 127.0.0.1:8004;
}

# Least Connections演演算法的負載均衡
# 方式: 用戶端請求分配給當前連接數最少的目標伺服器。
upstream backend_servers {
    least_conn;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
    server 127.0.0.1:8004;
}

如果說有使用到網站身分驗證、緩存...等等,理論上使用 IP Hash演算法會比較恰當。


#nginx #iis #ASP.NET MVC #load balancing #負載平衡 #反向代理







Related Posts

Week4筆記_Signal Propagation

Week4筆記_Signal Propagation

PDIS 實習日誌:走入就業服務中心

PDIS 實習日誌:走入就業服務中心

讓 Jest 幫你的 code 做測試

讓 Jest 幫你的 code 做測試


Comments