Nginx負載平衡設定教學,讓系統不延遲、用戶體驗瞬間昇華!
Nginx

Nginx負載平衡設定教學,讓系統不延遲、用戶體驗瞬間昇華!

當系統有越來越多用戶時,工程師就會開始頭痛了,為什麼呢? 主要是後台的負荷越來越撐不住,會遇到幾個問題點。後台撐不住導致用戶體驗不好,然後就會開始反饋給客服或者工程師!比較慘的狀況是直接當機或者速度變得很慢,這絕對是工程師跟客服,還有用戶最不樂見的事情。

對於每天都有很多使用者在使用的系統,肯定流量是非常大的,如果這個系統又剛好需要有上傳檔案的需求,肯定檔案只會越來越多、越來越大,勢必有一天會遇到檔案大到讓後台主機變得很慢。後來比較好的解決方法,會借鑑line或者FB的機制,固定一段時間自動刪掉每天都會記錄的檔案,如nginx access.log。或者將檔案,如結案的文件封存,改搬到另一個安全的雲端File Server存放。

負載平衡的重要意義

負載平衡之所以很重要,是因為他可以幫助我們在兩台或多台電腦之間分配流量,這樣做的好處是減少每台伺服器的壓力,讓伺服器更有效率、加快效能、減少延遲。這篇文章主要介紹如何透過Nginx來達成這樣的目的。

用比較生動的方式來描述一下,假設你今天走進商店,此時結帳區只開放一個結帳櫃台,後面的客戶大排長龍,要等待前面每一位結完帳才會輪到自己,這樣是不是感受超差的! 假設多開放幾個結帳櫃台來分流,讓大家都可以快速的結完帳,這樣的體驗是不是就好很多呢?

單一台主機的狀態,用戶就要等比較久。

分流提高伺服器效能

當我們開啟多個結帳櫃台(多台伺服器)之後,整個使用情境就會變為下面這樣。用戶可以往不同櫃台前往結帳,大家不再需要排隊等候,可以更快滿足需求。也因為分流處理需求,伺服器的效能就會提高,最大好處就是使用者的體驗會大大提升。

當我們建立多個伺服器後台來服務用戶,這樣的使用者體驗就會好很多,可達到效能提高,減少延遲。

確保伺服器安全,不讓伺服器耗盡或停機!

由於負載平衡是建立在應用程式與客戶端之間的保護牆,他可以避免伺服器受到惡意攻擊,像是使用分佈式拒絕服務 (DDos),駭客可以發送機器人驅動的流量來讓伺服器耗盡資源。但負載平衡是可以做到監視此類流量、並且識別數據包內容,更聰明的避掉這些攻擊。

舉些實際,根據 Gartner (高德納,又譯顧能公司,NYSE: IT and ITB) 全球最具權威的 IT研究與顧問諮詢公司分享:「IT 停機的平均成本為每分鐘5600美元。」此外,98%的組織表示一小時的停機成本超過一千美元,這些事實都說明了停機絕對是商業事件的重大事件,不允許發生!

負載平衡怎麼做

描述前言

阿政負責的系統前後端的配置,前端是透過Nginx搭配後端的Node.js後台服務。為了確保配置是沒問題的,先將前台建置在自己的電腦上,確保可以正常運行。前端可以想像成你看見的web畫面,所有可操作的行為,我們看見的UI都可稱之為前端,這個部分是由nginx代理,在nginx.config檔案中,有幾個部分的設定可以好好的理解一下。

使用Upstream來分流

使用 upstream來設定要做分流的ip,假設有兩台打算用來做負載平衡的主機,ip各別為 10.98.x.xxx以及10.97.x.xxx,那麼就可以設定如:

upstream backend_hosts{
     least_conn;
	   server 10.98.x.xxx:7006 ;
	   server 10.97.x.xxx:7006 ;
	}
	
server {
		listen 		 80;
		listen       443 ssl http2;
    server_name  abc.example.com;
    
    location / {
       proxy_pass http://backend_hosts;
			 proxy_next_upstream error timeout http_404; //如果找不到發生404,則往下一個upstream找
    }
    

nginx的更多設定細節可以參考:參考資料

負載平衡的三種方法

Nginx的負載平衡有三種方法,分別是:

  • Round Robin:預設值,會將請求平均分配給每台伺服器。
  • Least Connected:當連線進來時會把Request導向連線數較少的Server
  • IP Hash:依據 Client IP 來分配到不同台Server

實作方法也非常簡單,只需要在第一行下指令 least_conn、ip_hash,若都不下指令則是採用第一種round_robin。

upstream backend_hosts{
     least_conn;
	   server 10.98.x.xxx:7006 ;
	   server 10.97.x.xxx:7006 ;
	}

也可以透過權重的設定來分配流量,比如像是底下這樣的設定,這樣的設定代表用戶送出5次Request後,會有三次來到10.98這台主機伺服器、兩次會分配到10.97這台主機伺服器。

upstream backend_hosts{
     least_conn;
	   server 10.98.x.xxx:7006 weight=3;
	   server 10.97.x.xxx:7006 weight=2;
	}

總結與鼓勵

當我們開始可以用比較大的局觀,去思考系統的設計與流量的管控後,就會越來越往優秀的軟體工程師發展,當然這條路上會有許多需要學習的內容,但成為優秀的工程師的路徑:「把不會的弄會,將不熟的弄熟!」當這個過程久了,就會越來越強囉,期待大家都可以透過這篇文章了解到nginx來做到負載平衡的基本設定與方法。也可以參考我的工作心得與成長經驗。底下幾篇文章是我在鴻海集團的工作經驗與心得,未來也會持續分享身為工程師的所見所聞。

  1. 鴻海面試的經驗分享
  2. 一個月的洗禮,成長了不少,我在鴻海科技集團的起手式!
  3. 第二個月的成長與發現!永遠再多想幾步!會更好!

對於跑步有興趣的讀者,也歡迎跟著阿政來體驗跑步的美好,我也有經營跑步相關的部落格,若有興趣也可以參考底下這篇,有一些關於馬拉松可以怎麼開始訓練的懶人包文章。

  1. 阿政跑步筆記|12堂跑者的馬拉松必修課
  2. 2023年渣打臺北公益男子菁英跑者!不可思議的入選了!

那我們下篇文章見~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *