您好,登錄后才能下訂單哦!
這篇文章主要介紹怎么使用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中
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)。
二. 需要一個(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ù)。
雖然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ù)載均衡。
訪問證明我們配置成功。
五.創(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。
保存后 執(zhí)行docker構(gòu)建 使用當(dāng)前目錄的Dockerfile創(chuàng)建鏡像。docker build -t image/apiservice-v3 . 注意結(jié)尾有個(gè) . (使用當(dāng)前目錄)
docker images 查看鏡像
我們可以發(fā)現(xiàn) 剛創(chuàng)建的docker image 比我們FROM的microsoft/dotnet 大小大一點(diǎn)。
下面運(yùn)行下看看 四行命令 運(yùn)行了四個(gè)我們剛創(chuàng)建的image
docker run -d -p :81:20000 image/apiservice-v3
docker ps -a 查看下運(yùn)行中的image進(jìn)程
下面配置nginx負(fù)載均衡然后service nginx reload,實(shí)驗(yà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)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(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)容。