上一篇文章介紹瞭如何將開發好的 Asp.Net Core 應用程序部署到 IIS,且學習了進程內託管和進程外託管的區別;接下來就要說說應用 Asp.Net Core 的特性(跨平臺),將 .NetCore 部署到 Linux 中,主流的 Linux 有多個版本的操做系統,這裏以 Centos-7.5 爲例子,其它版本的操做系統下的部署基本都是大同小異的,除了了一些命令上的區別。linux
在 Linux 上部署 .Net Core 應用程序,一般的作法是使用託管宿主,早在 1.0.4 的時代,曾經推薦的作法是使用自託管,即 Kestrel,後來官方主力推薦使用 Supervisor 進行託管部署;固然,還有現在最流行的 Docker 部署,可是 Docker 部署不在本文討論範圍,此次咱們主要講講怎麼使用 「Kestrel」 和 「Supervisor」 進行部署。git
爲了演示部署,我專門到 Azure 上申請了 1 元使用套餐,建立了一個 Centos-7.5 的虛擬機,申請過程很是輕鬆愉快,支付 1 元便可完成 1500 元的信用額度,使用期限 30 天,童叟無欺,推薦你們申請,用做測試學習的機器。github
花了幾分鐘,機器拿到了,感謝 Azure 的友情支持web
SSH 鏈接到虛擬機,他是長這個樣子的,輸入命令 cat /etc/redhat-release 查看版本json
你們拿到一臺機器的時候,必定要確認一下操做系統的版本,由於 ubuntu 和 centos 下的有些命令是不一樣的,好比 ubuntu 使用 apt-get,而 centos 使用 yunubuntu
好了,機器已經拿到,系統已經確認,下面的工做首先就是要在 Centos 上安裝 .net core,由於是 Azure ,我抱着幻想輸入 dotnet --version,果真,提示命令不存在,這很工業標準。centos
好的,沒問題,咱們就按照 https://dotnet.microsoft.com/learn/web/aspnet-hello-world-tutorial/install 的指引進行安裝便可,依次輸入下面的命令服務器
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm sudo yum update sudo yum install dotnet-sdk-2.2
由於如今咱們登陸的帳號不是 root,因此執行命令期間可能會提示輸入密碼,照作便可,因爲是新機器第一次進行 yum update ,可能各類依賴比較多,請耐心等待安裝完成。若是是第一次使用 Linux 的同窗,請把 Linux 想象成 Windows 下的 dos 系統操做,這樣就能夠實現平滑過渡了。app
安裝完成,輸入 dotnet --version 輸出下面的信息,證實安裝成功了編輯器
配置服務運行的端口有兩種方式,以前的文章介紹了使用 hosting.json 文件的方式,這裏演示爲了方便,由於 linux 下要配置防火牆等操做會把新手搞懵逼,咱們直接的代碼中指定 80 端口,代碼以下
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseKestrel(options => { options.Listen(IPAddress.Parse("0.0.0.0"), 80); }) .UseStartup<Startup>(); }
很是簡潔的代碼,僅僅使用 UseKestrel 就能夠配置偵聽地址和端口,若是有多塊網卡的朋友,注意最好仍是指定 IP 地址。
定位到項目 D:\Learning\Deploy.Linux\Deploy.Linux,輸入 cmd 啓動命令行,輸入如下命令
dotnet publish --runtime centos.7-x64 --framework netcoreapp2.2 --configuration release
執行上述命令後,將會在項目 bin\release\netcoreapp2.2\centos.7-x64\publish 下看到有發佈好的項目文件和依賴項目
接下來,在服務器中新建一個文件夾,在控制檯中輸入命令
sudo mkdir -p /data/sites/demo // 修改權限爲當前登陸用戶,不然沒法上傳 sudo chown -R ron:ron /data
將 publish 文件夾上傳到服務器上剛纔建立好的文件夾 /data/sites/demo 下,我這裏使用的是 SecureFx ,簡單粗暴,直接複製上傳
上傳成功後,先不要着急的寫服務文件,先測試一下是否能夠啓動,先使用控制檯進行測試,輸入命令定位到 publish 文件夾
cd /data/sites/demo/publish // 啓動,由於要偵聽端口,並且咱們使用的不是 root 用戶,這裏須要使用 sudo 進行提權,若是提示輸入密碼,請輸入當前登陸用戶的密碼便可 sudo dotnet Deploy.Linux.dll
測試啓動成功,上面輸出的信息表示,咱們的發佈是沒有問題的,先來了解一下上面的輸出信息
// 主機環境:Production Hosting environment: Production // 根目錄 Content root path: /data/sites/demo/publish // 偵聽地址和端口 Now listening on: http://0.0.0.0:80 // 提示關閉技巧,Ctrl+C 能夠關閉此主機 Application started. Press Ctrl+C to shut down.
沒有太多的信息,一樣的簡單明瞭,實際上,如今咱們已經經過 80 端口來訪問該站點了,可是做爲服務,必需要常駐內存中運行,而不是關閉窗口就中止了站點。
因此,接下來咱們就編寫一個腳本文件,將該站點託管到 Linux 服務中,這個腳本文件官網有示例,咱們能夠直接拿過來用,可是首先,咱們得先在系統中建立一個服務文件 kestrel-dotnet.service
定位到文件夾 /etc/systemd/system,輸入命令
sudo vi kestrel-dotnet.service // 按 i 將編輯器轉換爲輸入模式 // 將如下內容 copy 到當前編輯器中 [Unit] Description=Example .NET Web Site running on Centos [Service] WorkingDirectory=/data/sites/demo/publish ExecStart=/usr/bin/dotnet Deploy.Linux.dll Restart=always # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 KillSignal=SIGINT SyslogIdentifier=dotnet-example User=root Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target // 按 esc 鍵推出編輯模式,輸入命令 :wq! 保存並退出
經過上面這波操做之後,你就獲得了一個服務文件 kestrel-dotnet.service,這是一個標準的 Linux 服務配置文件
通過上面的一系列操做,對於尚未接觸過 Linux 的同窗來講,已經有點疲憊了,再堅持一下,立刻就好
如今將建立好的服務文件註冊到系統中,而後啓動它,依次輸入如下命令
// 註冊服務 sudo systemctl enable kestrel-dotnet.service // 啓動服務 sudo systemctl start kestrel-dotnet.service
好了,如今訪問咱們的站點,目前個人站點是:
http://139.219.9.102/
在服務沒有到期以前,你們應該都是該地址應該是能夠訪問的
寫到這裏,發現文章竟然有點長了,對於入門文章來講,這是不合適的,好吧,下一篇再繼續介紹使用 Supervisor 進行託管部署 Asp.Net Core 應用程序
演示代碼下載:
https://github.com/lianggx/EasyAspNetCoreDemo/tree/master/Deploy.Linux