1. 程式人生 > >發布 ASP.NET Core 2.x 應用到 Ubuntu

發布 ASP.NET Core 2.x 應用到 Ubuntu

bsp 返回 proxy 地址 direct color rev 默認 info

簡單紹一下如何將ASP.NET Core 應用發布到Linux (Ubuntu)服務器上,都是文檔的東西。

服務器結構

ASP.NET Core 2.x 有兩種server:

  • HTTP.sys 只支持Windows,並支持一些Windows獨有的特性。
  • Kestrel,跨平臺的服務器,高度優化,這個是建議的選項。

這兩種server都可以直接服務應用(又叫做邊緣服務器 Edge Server),也可以放在負載均衡或反向代理(Reverse Proxy)後邊。

如果采用Edge Server這種方式:

技術分享圖片

這種情況下,你需要把證書添加到Kestrel或HTTP.sys來啟用HTTPS。

但是這樣以後不好擴展,因為沒法做負載均衡,也沒法把流量發送給別的server。

而如果把kestrel放在反向代理後邊,例如IIS或Nginx:

技術分享圖片

這種情況下,Reverse Proxy可作為負載均衡器,它也可以作為為HTTPS配置證書的唯一地方。

今天要介紹的就是這種方式。

HTTPS

技術分享圖片

外邊發過來https的請求到Reverse Proxy,然後它會使用HTTP轉發該請求到Kestrel Server,轉發時還帶著一些特殊的Headers。

這樣的話,像證書配置,加密,HTTPS這些工作就都交給了Proxy Server。

這些響應被Proxy使用HTTPS返回:

技術分享圖片

這時,Proxy Server或負載均衡器在內層到Kestrel的HTTP連接上會帶著幾個Header,這樣我的Kestrel就知道這個請求原來是不是HTTPS的。

主要是這三個Header:

技術分享圖片

而在ASP.NET Core的代碼裏,我們需要使用ForwardHeaders中間件,在Startup.Configure方法裏面修改:

技術分享圖片

註意它的位置應該在UseHttpsRedirection,UseAuthentication,UseMvc,UseStaticFiles之前。

中間件裏面配置是表示讓ASP.NET Core來查看XForwardedFor和XForwardedProto兩個Header。

發布到Ubuntu

安裝.NET Core

首先需要安裝.NET Core Runtime: https://www.microsoft.com/net/download

技術分享圖片

點擊之後,根據您的Linux發行版不同,選擇相應的操作步驟:

技術分享圖片

技術分享圖片

最後執行dotnet --info驗證安裝是否成功:

技術分享圖片

安裝Nginx

另外還需要安裝Nginx,直接查看官網文檔吧:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.1&tabs=aspnetcore2x#install-nginx

安裝好後,訪問這個頁面:http://你的ip地址/index.nginx-debian.html,如果看到如下效果說明安裝成功:

技術分享圖片

在服務器構建源碼並發布

然後就是發布程序了,發布有兩種辦法:

  • 在開發機上執行dotnet publish然後把發布的文件復制到服務器上
  • 或者直接在服務器上使用源碼構建並發布,我一般是這樣做的。

由於我是直接在服務器上構建發布,所以我需要安裝.NET Core SDK:https://www.microsoft.com/net/learn/get-started-with-dotnet-tutorial

技術分享圖片

然後就可以使用發布命令了:dotnet publish --configuration Release

發布好的文件在bin/Release/netcoreapp*.*/publish下面。

再把publish下的所有文件復制到我的目標文件夾即可:

技術分享圖片

在我的目標目錄下,有這些文件:

技術分享圖片

如果執行 dotnet test.dll,這個程序就會在localhost:5000運行:

技術分享圖片

配置Nginx

然後我們再回來配置Nginx,進入/etc/nginx/sites-available,裏面有一個Default文件,把它改個名,然後我們再建立一個新的Default文件:

技術分享圖片

保存後執行sudo nginx -t檢驗這個配置文件。

然後再執行 nginx -s reload 來重啟nginx。

隨後需要再把發布後的程序運行一下:dotnet test.dll:

技術分享圖片

在我使用網址訪問80端口的時候,會自動跳轉到5001端口,導致連接失敗:

技術分享圖片

這是因為項目裏默認使用了HTTPS Redirection。因為我沒有證書,所以為了演示,我把HTTPS Redirection相關的代碼註釋掉,再發布:

技術分享圖片

重復上述步驟之後,通過網址的80端口,就可以正常訪問了:

技術分享圖片

NGINX配置證書和HTTPS

配置HTTPS和證書相關的內容直接去看官方文檔:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.1&tabs=aspnetcore2x#configure-ssl

添加proxy.conf和編輯nginx.conf後重啟nginx即可。

按照操作,運行後如果不能使用https正常訪問網站,那麽有可能是無法綁定443端口導致的。

查看nginx錯誤日誌:/var/log/nginx/error.log,如果出現下面的錯誤:

技術分享圖片

可以執行下列命令來解決:

sudo fuser -k 443/tcp
service nginx restart

然後再次訪問https網址:

技術分享圖片

這樣就可以正常訪問https的網址了。

發布 ASP.NET Core 2.x 應用到 Ubuntu