1. 程式人生 > >手把手教你AspNetCore WebApi:Nginx(負載均衡)

手把手教你AspNetCore WebApi:Nginx(負載均衡)

# 前言 這幾天小明又有煩惱了,系統上線一段時間後,系統性能出現了問題,快取等都用上了,還是不能解決問題。馬老闆很大氣,又買了3臺伺服器,讓小明做個叢集分流一下。 # 叢集是什麼? 是一種計算機系統,它通過一組鬆散整合的計算機軟體或硬體連線起來高度緊密地協作完成計算工作。將多個物理機器組成一個邏輯計算機,實現負載均衡和容錯。 # Nginx是什麼? Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘寶等。 # Nginx簡單網路結構圖 ![](https://gitee.com/zcqiand/self-media/raw/master/assets/img/201014/20201014165335.png) 圖中,前面Nginx伺服器負責接受請求和分發請求,它自己並不處理請求,將請求分發給後面的業務伺服器來處理。 # 使用Nginx配置負載均衡 **首先**,我們簡單的建立一個控制器,實現一個簡單方法,返回伺服器IP和埠。 ``` [Route("api/[controller]")] [ApiController] public class NginxController : ControllerBase { [HttpGet] public string Get() { return $"{HttpContext.Connection.LocalIpAddress.ToString()}:{HttpContext.Connection.LocalPort.ToString()}"; } } ``` **接下來**,我們啟動app001專案,分別開啟cmd,打入以下命令,分別啟動web伺服器5011,5012,5013 ``` dotnet app001.dll --urls="http://127.0.0.1:5011" dotnet app001.dll --urls="http://127.0.0.1:5012" dotnet app001.dll --urls="http://127.0.0.1:5013" ``` 如下圖: ![](https://gitee.com/zcqiand/self-media/raw/master/assets/img/201014/20201014162413.png) **接下來**,我們分別測試web伺服器5011,5012,5013,分別返回“127.0.0.1:5011”,“127.0.0.1:5012”,“127.0.0.1:5013”。 如下圖: ![](https://gitee.com/zcqiand/self-media/raw/master/assets/img/201014/20201014162924.png) **接下來**,配置nginx。 * 找到nginx的安裝路徑,開啟nginx.conf檔案 * 新增upstream配置,配置用於負載均衡輪詢的站點,即上一步驟中新增的3個站點 ``` upstream webServer{ server 127.0.0.1:5011; server 127.0.0.1:5012; server 127.0.0.1:5013; } server { listen 5010; server_name localhost; location / { proxy_pass http://webServer; } } ``` **接下來**,啟動ngnix,用cmd命令指定nginx的安裝目錄,然後start nginx ![](https://gitee.com/zcqiand/self-media/raw/master/assets/img/201014/20201014163752.png) **最後**,測試http://localhost:5010/api/nginx,按次序輪詢返回“127.0.0.1:5011”,“127.0.0.1:5012”,“127.0.0.1:5013”。 ![](https://gitee.com/zcqiand/self-media/raw/master/assets/img/201014/20201014164024.png) # 小結 目前為止,小明伺服器負載均衡也搞定了,是不是非常簡單呀。不過這是最簡單的輪詢方式分發,nginx支援按權重輪詢分發,基於瀏覽器的分發,基於源IP分發等。留給其他小夥伴們去發掘,如果哪方面還有問題,請留言告訴我們。 文中用到的程式碼我們放在:https://github.com/zcqiand/miscellaneous/tree/maste