溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》
  • 首頁 > 
  • 教程 > 
  • 服務(wù)器 > 
  • 怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

發(fā)布時(shí)間:2021-11-12 10:20:00 來源:億速云 閱讀:191 作者:小新 欄目:服務(wù)器

這篇文章主要介紹怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

一.Self-Host Kestrel

1. 在vs2017中新建dotnet core2.0 webapi項(xiàng)目 ApiService

2.  參照官方文檔,https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction?tabs=aspnetcore2x  在Startup中增加

app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });

配置運(yùn)行Url, 在Program.cs中

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

3. 發(fā)布項(xiàng)目文件,通過FTP上傳到linux服務(wù)器。 一個(gè)core2.0 webapi新項(xiàng)目發(fā)布后只有幾百kb

4. 切換目錄,dotnet ApiService.dll

5. 運(yùn)行成功,開放服務(wù)器端口,不過目前是運(yùn)行于Kestrel 的selfhost 狀態(tài)。

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

二. 需要一個(gè)代理

ASP.NET Core 的運(yùn)行環(huán)境由新開發(fā)的 Kestrel Server 負(fù)責(zé),IIS 退回到 HTTP  的偵聽器的角色,微軟也特別為了這個(gè)需求開發(fā)了 IIS Platform Handler,以處理 HTTP  與運(yùn)行環(huán)境之間的信息轉(zhuǎn)發(fā)工作,微軟官方推薦在Linux服務(wù)器上使用Nginx,Haproxy等代理Kestrel Server。

理解dotnet core host最重要的一點(diǎn)是,它獨(dú)立運(yùn)行。不在IIS中運(yùn)行,也不需要IIS運(yùn)行。它擁有獨(dú)立的自宿主Web  Server,在內(nèi)部使用self-host server處理請(qǐng)求。

然而,你依然可以把IIS放在self-host server前面,作為一個(gè)前端代理,因?yàn)镵estrel是一個(gè)只擁有原始功能的web  server,它并沒有像iis那樣完整的web server  功能,比如Kestrel不支持單個(gè)ip上,多個(gè)應(yīng)用綁定80端口,IIS還可以提供靜態(tài)文件服務(wù),gzip壓縮,靜態(tài)文件緩存等其他高級(jí)功能,IIS在處理請(qǐng)求時(shí)效率非常好,,所以有必要利用這一點(diǎn),您可以讓iis處理它真正擅長的任務(wù),并將動(dòng)態(tài)任務(wù)傳遞到core應(yīng)用程序。所以說在windows上,iis依然繼續(xù)扮演著非常重要的角色。

在傳統(tǒng)經(jīng)典的Asp.Net應(yīng)用中,所有內(nèi)容都托管在iis工作進(jìn)程中(w3wp.exe),這就是我們常說的應(yīng)用程序池。并且應(yīng)用由IIS內(nèi)置托管功能加載實(shí)例化,經(jīng)過工作者進(jìn)程加載aspnet_isapi.dll,在用aspnet_isapi加載.Net運(yùn)行時(shí)。IIS工作者進(jìn)程中的應(yīng)用程序池加載應(yīng)用程序域。一系列工作結(jié)束后,由ISAPIRuntime對(duì)象調(diào)用PR方法,封裝HttpWorkerRequest對(duì)象,傳遞給HttpRuntime  創(chuàng)建HttpApplication實(shí)例,  然后一系列HttpApplication初始化和管道事件執(zhí)行。當(dāng)然加載運(yùn)行時(shí),應(yīng)用程序域等都只是***個(gè)請(qǐng)求到達(dá)后做的事兒。

在dotnet  core中很不同的是,core不會(huì)在iis工作進(jìn)程中運(yùn)行,而是在自己的Kestrel組件中。通過一個(gè)叫做AspNetCoreModule的原生的IIS  module,執(zhí)行外部的應(yīng)用。Kestrel是一款針對(duì)吞吐量性能做了大量優(yōu)化的dotnet web  server的實(shí)現(xiàn),它將網(wǎng)絡(luò)請(qǐng)求快速傳遞給你的應(yīng)用,但它僅僅是一個(gè)原始的web server,沒有IIS那樣全面的Web管理服務(wù)。

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

雖然IIS站點(diǎn)依然需要應(yīng)用程序池,但是應(yīng)該設(shè)置為無托管代碼,由于應(yīng)用程序池只作為轉(zhuǎn)發(fā)請(qǐng)求的代理,因此不需要實(shí)例化.net  運(yùn)行時(shí)。所以在linux上也一樣,我們需要一個(gè)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

創(chuàng)建service file

nano /etc/systemd/system/apiservice.service

service file的內(nèi)容,官方示例:

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。還修改了工作目錄 就是我項(xiàng)目文件ftp上傳后的目錄,ExecStart的 dotnet這個(gè)目錄不要修改  dll目錄,改成目標(biāo)要執(zhí)行的dll的目錄

然后enable service

執(zhí)行 systemctl enable kestrel-hellomvc.service

start并驗(yàn)證service的狀態(tài)

systemctl start kestrel-hellomvc.service

systemctl status kestrel-hellomvc.service

訪問監(jiān)聽中的80端口,證明服務(wù)成功。

四.做負(fù)載均衡

按照相同的方式 我們?cè)俨渴鹨粋€(gè)10001,修改nginx,配置負(fù)載均衡。

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

訪問證明我們配置成功。

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

五.創(chuàng)建Docker Image

官方提供的dotnet core鏡像位  microsoft/dotnet。docker基礎(chǔ)命令就不提了,剛開始用也是邊學(xué)邊記。下面基于microsoft/dotnet  image創(chuàng)建自己的image。以便快速運(yùn)行多個(gè)docker  image,配置更多的負(fù)載均衡,而無需手動(dòng)copy到各個(gè)服務(wù)器上再配置環(huán)境,也就是說無論我們創(chuàng)建幾十個(gè)甚至上百個(gè),有我們自己的docker  hub的話,創(chuàng)建起來是很快的,也不會(huì)出現(xiàn)在這臺(tái)服務(wù)器上可用,在另一臺(tái)服務(wù)器上搞出什么其他問題。

下面只是一個(gè)學(xué)習(xí)過程中自己的范例,離***實(shí)踐方式還差得很遠(yuǎn),希望能對(duì)看隨筆的朋友有所幫助。

由于還要在每個(gè)image的apiService前面 放置nginx,所以 core  application在各個(gè)容器中都是使用self-host的形式,在Kestrel上運(yùn)行。在前端通過nginx 對(duì)docker暴露出的端口號(hào)進(jìn)行代理。

在發(fā)布的網(wǎng)站目錄下 創(chuàng)建Dockerfile。

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

保存后 執(zhí)行docker構(gòu)建 使用當(dāng)前目錄的Dockerfile創(chuàng)建鏡像。docker build -t image/apiservice-v3 . 注意結(jié)尾有個(gè) . (使用當(dāng)前目錄)

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

docker images 查看鏡像

我們可以發(fā)現(xiàn) 剛創(chuàng)建的docker image 比我們FROM的microsoft/dotnet 大小大一點(diǎn)。

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

下面運(yùn)行下看看 四行命令 運(yùn)行了四個(gè)我們剛創(chuàng)建的image

docker run -d -p :81:20000 image/apiservice-v3


怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

docker ps -a 查看下運(yùn)行中的image進(jìn)程

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

下面配置nginx負(fù)載均衡然后service nginx reload,實(shí)驗(yàn)完成。

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

下面使用docker kill對(duì)docker container逐一停止,停止后訪問,確認(rèn)負(fù)載均衡成功。當(dāng)四個(gè)container都停止后,nginx返回  502 error.

怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)

以上是“怎么使用Docker快速創(chuàng)建.Net Core2.0 Nginx負(fù)載均衡節(jié)點(diǎn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI