[Nginx] 在Windows架設Nginx並啟用負載均衡

因專案需要一個負載均衡的機制,看似用Nginx最輕鬆方便,雖然Nginx在windows下的效能比不上在Linux下,不過先完好Nginx的設定,日後要搬上Linux也方便

環境

  1. .NetCore 應用程式
  2. IIS
  3. Windows

下載

Nginx 的下載頁面就有了windows的版本,下載後找個位置放就可以直接啟動執行

設定

Nginx的設定在 conf/nginx.conf,直接加上負載均衡需要的設定

nginx.conf

#user  nobody;

#工作進程數量,預設值為1
#可以依照CPU的核心數量調整
#或是給定 auto 自動判斷
worker_processes  4;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

events {
    #每個工作進程的最大同時連接數量
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/json;

    sendfile        on;
    keepalive_timeout  65;
    gzip  on;

    #載入其他設定檔,這邊是把server相關的設定拆開處理
    include default.conf;
}

default.conf

server {
    #監聽80port
    listen       80;
    server_name  127.0.0.1;

    charset utf-8;

    location / {
        proxy_set_header   Host    $host;
        #load balance會改變clientIP,這邊讓他把IP繼續往下傳
        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;
        #指定 load balance的目標
        proxy_pass http://apps;
    }
}

#定義server
upstream apps {
    server  127.0.0.1:81 weight=1 max_fails=3 fail_timeout=60s;
    server  127.0.0.1:82 weight=2 max_fails=3 fail_timeout=60s;
} 

weight

指定權重,依照上面的設定,相當於三個request,兩個請求進:82,一個請求進:81

max_fails & fail_timeout

nginx的健康檢查機制,若檢測該 serve 無法正常回應指定的 max_fails 次數,則會暫時移除這個 server,等 fail_timeout 指定的時間後再做一次確認

max_fails 預設值為 1
fail_timeout 預設值為 10s

LoadBalance 模式

nginx提供三種Load Balance的模式,方別為

  1. 循環,輪流發送請求給各個server
  2. 最少連接,把請求送個連接數量最少的server
  3. 用戶IP,相同的IP請求送給同一個server

循環

若不指定,預設會採用這個模式

upstream apps {
    server  127.0.0.1:81
    server  127.0.0.1:82
} 

最少連接

在開頭加上 least_conn

upstream apps {
    least_conn;
    server  127.0.0.1:81
    server  127.0.0.1:82
}

用戶IP

在開頭加上 ip_hash

upstream apps {
    ip_hash;
    server  127.0.0.1:81
    server  127.0.0.1:82
}

Start

start nginx

Relaod

若nginx已經執行,需要執行command重新載入設定檔,需要使用 -s <SIGNAL> 跟nginx溝通

  • stop: fast shutdown
  • quit: graceful shutdown
  • reload:reloading the configuration file
  • reopen:reopening the log files
$ nginx -s reload

簡單筆記目前為止做的事,nginx還能玩的東西還挺多的…