使用Docker快速建立.Net Core2.0 Nginx負載均衡節點

本文版權歸博客園和做者吳雙本人共同全部 轉載和爬蟲請註明原文地址 www.cnblogs.com/tdwshtml

一.Self-Host Kestrel

1. 在vs2017中新建dotnet core2.0 webapi項目 ApiService前端

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

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

配置運行Url, Program.csnginx

3. 發佈項目文件,經過FTP上傳到linux服務器。 一個core2.0 webapi新項目發佈後只有幾百kbweb

4. 切換目錄,dotnet ApiService.dlldocker

5. 運行成功,開放服務器端口,不過目前是運行於Kestrel 的selfhost 狀態。windows

 

二. 須要一個代理

   ASP.NET Core 的運行環境由新開發的 Kestrel Server 負責,IIS 退回到 HTTP 的偵聽器的角色,微軟也特別爲了這個需求開發了 IIS Platform Handler,以處理 HTTP 與運行環境之間的信息轉發工做,微軟官方推薦在Linux服務器上使用Nginx,Haproxy等代理Kestrel Serverapi

   理解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
View Code

   修改了 Userroot。還修改了工做目錄 就是我項目文件ftp上傳後的目錄,ExecStartdotnet這個目錄不要修改 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.

參考文章

https://weblog.west-wind.com/posts/2016/Jun/06/Publishing-and-Running-ASPNET-Core-Applications-with-IIS

http://www.cnblogs.com/shanyou/p/Jexus_Kestrel.html

https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction?tabs=aspnetcore2x 

相關文章
相關標籤/搜索