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

分類:IT技術 時間:2017-09-25

 本文版權歸博客園和作者吳雙本人共同所有 轉載和爬蟲請註明原文地址 www.cnblogs.com/tdws

一.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
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 

如果,您認為閱讀這篇博客讓您有些收獲,不妨點擊一下右下加【推薦】按鈕。
如果,您希望更容易地發現我的新博客,不妨點擊下方紅色【關註】的。
因為,我的分享熱情也離不開您的肯定支持。

感謝您的閱讀,我將持續輸出分享,我是蝸牛, 保持學習,謹記謙虛。不端不裝,有趣有夢。


Tags: 運行 Kestrel ForwardedHeaders server 一個 微軟

文章來源:


ads
ads

相關文章
ads

相關文章

ad