您好,登錄后才能下訂單哦!
這篇文章主要介紹怎么使用Docker快速創建.Net Core2.0 Nginx負載均衡節點,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
一.Self-Host Kestrel
1. 在vs2017中新建dotnet core2.0 webapi項目 ApiService
2. 參照官方文檔,https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction?tabs=aspnetcore2x 在Startup中增加
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });
配置運行Url, 在Program.cs中
3. 發布項目文件,通過FTP上傳到linux服務器。 一個core2.0 webapi新項目發布后只有幾百kb
4. 切換目錄,dotnet ApiService.dll
5. 運行成功,開放服務器端口,不過目前是運行于Kestrel 的selfhost 狀態。
二. 需要一個代理
ASP.NET Core 的運行環境由新開發的 Kestrel Server 負責,IIS 退回到 HTTP 的偵聽器的角色,微軟也特別為了這個需求開發了 IIS Platform Handler,以處理 HTTP 與運行環境之間的信息轉發工作,微軟官方推薦在Linux服務器上使用Nginx,Haproxy等代理Kestrel Server。
理解dotnet core host最重要的一點是,它獨立運行。不在IIS中運行,也不需要IIS運行。它擁有獨立的自宿主Web Server,在內部使用self-host server處理請求。
然而,你依然可以把IIS放在self-host server前面,作為一個前端代理,因為Kestrel是一個只擁有原始功能的web server,它并沒有像iis那樣完整的web server 功能,比如Kestrel不支持單個ip上,多個應用綁定80端口,IIS還可以提供靜態文件服務,gzip壓縮,靜態文件緩存等其他高級功能,IIS在處理請求時效率非常好,,所以有必要利用這一點,您可以讓iis處理它真正擅長的任務,并將動態任務傳遞到core應用程序。所以說在windows上,iis依然繼續扮演著非常重要的角色。
在傳統經典的Asp.Net應用中,所有內容都托管在iis工作進程中(w3wp.exe),這就是我們常說的應用程序池。并且應用由IIS內置托管功能加載實例化,經過工作者進程加載aspnet_isapi.dll,在用aspnet_isapi加載.Net運行時。IIS工作者進程中的應用程序池加載應用程序域。一系列工作結束后,由ISAPIRuntime對象調用PR方法,封裝HttpWorkerRequest對象,傳遞給HttpRuntime 創建HttpApplication實例, 然后一系列HttpApplication初始化和管道事件執行。當然加載運行時,應用程序域等都只是***個請求到達后做的事兒。
在dotnet core中很不同的是,core不會在iis工作進程中運行,而是在自己的Kestrel組件中。通過一個叫做AspNetCoreModule的原生的IIS module,執行外部的應用。Kestrel是一款針對吞吐量性能做了大量優化的dotnet web server的實現,它將網絡請求快速傳遞給你的應用,但它僅僅是一個原始的web server,沒有IIS那樣全面的Web管理服務。
雖然IIS站點依然需要應用程序池,但是應該設置為無托管代碼,由于應用程序池只作為轉發請求的代理,因此不需要實例化.net 運行時。所以在linux上也一樣,我們需要一個self-host的前端代理,在這里參考文檔使用nginx。
三.nginx做代理
找到/etc/nginx配置nginx.conf
server { listen 80; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
我將nginx 的user改為root 5000改成自己的10000
創建service file
nano /etc/systemd/system/apiservice.service
service file的內容,官方示例:
1 [Unit] 2 Description=Example .NET Web API Application running on Ubuntu 3 4 [Service] 5 WorkingDirectory=/var/aspnetcore/hellomvc 6 ExecStart=/usr/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll 7 Restart=always 8 RestartSec=10 # Restart service after 10 seconds if dotnet service crashes 9 SyslogIdentifier=dotnet-example 10 User=www-data 11 Environment=ASPNETCORE_ENVIRONMENT=Production 12 13 [Install] 14 WantedBy=multi-user.target
修改了 User為root。還修改了工作目錄 就是我項目文件ftp上傳后的目錄,ExecStart的 dotnet這個目錄不要修改 dll目錄,改成目標要執行的dll的目錄
然后enable service
執行 systemctl enable kestrel-hellomvc.service
start并驗證service的狀態
systemctl start kestrel-hellomvc.service
systemctl status kestrel-hellomvc.service
訪問監聽中的80端口,證明服務成功。
四.做負載均衡
按照相同的方式 我們再部署一個10001,修改nginx,配置負載均衡。
訪問證明我們配置成功。
五.創建Docker Image
官方提供的dotnet core鏡像位 microsoft/dotnet。docker基礎命令就不提了,剛開始用也是邊學邊記。下面基于microsoft/dotnet image創建自己的image。以便快速運行多個docker image,配置更多的負載均衡,而無需手動copy到各個服務器上再配置環境,也就是說無論我們創建幾十個甚至上百個,有我們自己的docker hub的話,創建起來是很快的,也不會出現在這臺服務器上可用,在另一臺服務器上搞出什么其他問題。
下面只是一個學習過程中自己的范例,離***實踐方式還差得很遠,希望能對看隨筆的朋友有所幫助。
由于還要在每個image的apiService前面 放置nginx,所以 core application在各個容器中都是使用self-host的形式,在Kestrel上運行。在前端通過nginx 對docker暴露出的端口號進行代理。
在發布的網站目錄下 創建Dockerfile。
保存后 執行docker構建 使用當前目錄的Dockerfile創建鏡像。docker build -t image/apiservice-v3 . 注意結尾有個 . (使用當前目錄)
docker images 查看鏡像
我們可以發現 剛創建的docker image 比我們FROM的microsoft/dotnet 大小大一點。
下面運行下看看 四行命令 運行了四個我們剛創建的image
docker run -d -p :81:20000 image/apiservice-v3
docker ps -a 查看下運行中的image進程
下面配置nginx負載均衡然后service nginx reload,實驗完成。
下面使用docker kill對docker container逐一停止,停止后訪問,確認負載均衡成功。當四個container都停止后,nginx返回 502 error.
以上是“怎么使用Docker快速創建.Net Core2.0 Nginx負載均衡節點”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。