本文版權歸博客園和做者吳雙本人共同全部 轉載和爬蟲請註明原文地址 www.cnblogs.com/tdwshtml
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.cs中nginx
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。
找到/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,配置負載均衡。
訪問證實咱們配置成功。
官方提供的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