詳解ASP.NET Core部署項(xiàng)目到Ubuntu Server
基于上一篇成功安裝Ubuntu Server 16.10的基礎(chǔ)上,接下來繼續(xù)我們ASP.NET Core項(xiàng)目的部署之旅!
只是對(duì)于這些年整天和Windows打交道的我,初次使用Linux確實(shí)有點(diǎn)費(fèi)勁。
但是為了.NET Core跨平臺(tái)的這一重大特性,即使再多的坑,也還是要硬著頭皮上的。
不然會(huì)有人懷著詫異的眼神問你:你的.NET Core項(xiàng)目還部署到Windows上?
廢話不多說,預(yù)祝你在十步之內(nèi)成功部署!<( ̄︶ ̄)↗[GO!]
一、安裝.NET Core SDK
依次輸入以下命令即可完成安裝,如果中間有失敗的,請(qǐng)多嘗試幾次。
sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ yakkety main" > /etc/apt/sources.list.d/dotnetdev.list' sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893 sudo apt-get update sudo apt-get install dotnet-dev-1.0.1
安裝好之后試著執(zhí)行一下dotnet命令,出現(xiàn)以下內(nèi)容,說明你已經(jīng)安裝成功,恭喜!

二、小試牛刀
1、創(chuàng)建一個(gè)文件夾,命名為test,然后切換之
mkdir test cd test
2、初始化一下CLI配置
dotnet new

3、創(chuàng)建一個(gè)MVC項(xiàng)目
dotnet new mvc
4、構(gòu)建該項(xiàng)目并運(yùn)行
dotnet restore dotnet run

5、如果能監(jiān)聽成功,說明沒問題。接下來進(jìn)入Program.cs文件,并修改成如下內(nèi)容,在80端口監(jiān)聽所有的網(wǎng)絡(luò)適配器
1)、vi Program.cs //打開Program.cs文件
2)、i //進(jìn)入編輯模式
3)、Esc鍵退出編輯模式
4)、:wq //保存并退出

6、安裝反向代理nginx,并啟動(dòng)之,當(dāng)然了,apache也是未嘗不可的。
sudo apt-get install nginx sudo service ngnix start
然后訪問一下服務(wù)器的地址,如果出現(xiàn)如下頁面,說明已經(jīng)安裝成功

7、安裝好之后進(jìn)入到以下目錄,打開default文件并修改為以下的內(nèi)容
cd /etc/nginx/sites-available sudo vim default

順便記錄幾個(gè)常用的編輯命令
vim Program.cs //打開或新建Program.cs文件 i //進(jìn)入編輯模式 Esc鍵 //退出編輯模式 yy //復(fù)制光標(biāo)所在行 5yy //復(fù)制光標(biāo)起后5行 p //粘貼 dd //刪除光標(biāo)所在行 5dd //刪除光標(biāo)起后5行 u //撤銷操作 :q! //不保存并退出 :wq //保存并退出
8、重新啟動(dòng)Nginx來應(yīng)用配置
sudo nginx -t sudo nginx -s reload
9、接下來就是見證奇跡的時(shí)刻。重新運(yùn)行我們剛才的test項(xiàng)目,然后打開本機(jī)瀏覽器,輸入:http://192.168.1.104(如果不知道自己ubuntu服務(wù)器地址的,輸入ifconfig命令進(jìn)行查看)訪問,如果出現(xiàn)如下畫面,說明配置已經(jīng)成功。服務(wù)器已經(jīng)不再是IIS,取而代之的是ubuntu上的nginx,版本為1.10.1

Tips:如果不成功的話,不要灰心!試著用以下命令更新一下系統(tǒng),或者卸載nginx然后重新再來一次,相信曙光就要到來!
sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade sudo reboot
三、配置守護(hù)進(jìn)程Supervisor
到目前位置,應(yīng)用程序還是我們自己手動(dòng)運(yùn)行起來的,而且還不能Ctrl+C關(guān)閉并退出,否則你的網(wǎng)站將無法訪問!所以我們需要有一個(gè)類似監(jiān)視器的角色來保證ASP.NET Core進(jìn)程的正常運(yùn)行,那么Supervisor會(huì)是我們的首選。
1、安裝supervisor
sudo apt-get install supervisor
2、發(fā)布上面mvc的test項(xiàng)目,記錄下你的發(fā)布路徑
dotnet publish

3、發(fā)布成功之后記得切換到發(fā)布目錄執(zhí)行下dotnet運(yùn)行命令,然后重復(fù)上面的步驟9看下是否可以正常訪問,沒問題的話我們進(jìn)行下一步

4、切換到var路徑,創(chuàng)建一個(gè)netcore文件夾,再在其下創(chuàng)建一個(gè)test-publish文件夾,然后將上面發(fā)布后的所有文件拷貝到這里
cd /var sudo mkdir netcore cd netcore sudo mkdir test-publish cd test-publish sudo cp -a /home/jack/test/bin/Debug/netcoreapp1.1/publish/* /var/netcore/test-publish ls

5、創(chuàng)建test.conf的supervisor配置文件,并將以下內(nèi)容添加進(jìn)去(一定要仔細(xì)不要手抖寫錯(cuò)了)
cd /etc/supervisor/conf.d sudo vim test.conf

6、重新啟動(dòng)supervisor來應(yīng)用配置!然后試著用本機(jī)訪問下ubuntu server的IP,看下網(wǎng)站是否如你所愿的展示在了你的面前!如果和上面的步驟9一致,那么整個(gè)部署流程已經(jīng)暫時(shí)告一段落,這樣一來即使你重啟了服務(wù)器,網(wǎng)站依舊可以訪問。到這里我終于算是松了一口氣。
sudo service supervisor restart
四、進(jìn)階
接下來我就把我之前在IIS上搭好的項(xiàng)目:“ASP.NET Core:使用Dapper和SwaggerUI來豐富你的系統(tǒng)框架”也部署到Ubuntu Server上去,其中需要準(zhǔn)備一個(gè)遠(yuǎn)程登錄工具:Putty,用來將我們本機(jī)的發(fā)布文件傳輸?shù)椒?wù)器上,同時(shí)你還可以像在Ubuntu中一樣進(jìn)行一些命令操作。
1、在Ubuntu Server上安裝OpenSSH Server并啟動(dòng)該SSH服務(wù)(默認(rèn)端口22即可)
sudo apt-get install openssh-server sudo /etc/init.d/ssh start
2、啟用防火墻配置ufw(默認(rèn)是待用的,同時(shí)也是為了安全),然后打開SSH服務(wù)的22端口。
sudo ufw default deny sudo ufw enable sudo ufw allow ssh

注:第一條命令表示所有端口默認(rèn)關(guān)閉,除非被指定打開。至于紅框內(nèi)的,就不用我過多解釋了吧(笑而不語~)。
3、打開Putty,輸入U(xiǎn)buntu Server的IP地址,端口為22,連接類型為SSH,你可以把這個(gè)配置保存下來,命名為:ubuntu即可,下次直接雙擊打開就行了,挺方便的。

4、出現(xiàn)下面這個(gè)提示時(shí),選擇“是”即可

5、然后輸入服務(wù)器的用戶名和密碼進(jìn)行登錄,如果沒問題,你會(huì)看到如下畫面

5、小試牛刀:打開windows的命令提示窗口,輸入以下命令,表示復(fù)制一個(gè)test.txt(E盤下)文件到ubuntu服務(wù)器上test文件夾下
pscp test.txt jack@192.168.1.105:test

隨后切換至Putty上進(jìn)行查看

6、重新發(fā)布我們的項(xiàng)目,指定runtime為ubuntu.16.10-x64,如需更多,請(qǐng)點(diǎn)擊這里進(jìn)行查看。

但是不幸的是出現(xiàn)了一個(gè)大大的報(bào)錯(cuò):“project.assets.json don't have a target for ‘.NETCoreApp,Version=v1.1/ubuntu.16.10-x64'”,網(wǎng)上一查,發(fā)現(xiàn)是項(xiàng)目文件csproj中沒有此依賴,添加之后重新運(yùn)行發(fā)布命令,如果出現(xiàn)最后一個(gè)畫面,說明你就成功了!
<RuntimeIdentifiers>ubuntu.16.10-x64</RuntimeIdentifiers>


同時(shí)將我們的監(jiān)聽端口設(shè)置為6000,否則的話將無法啟動(dòng),因?yàn)?000端口已經(jīng)被測(cè)試項(xiàng)目test占用了。而其中的UseIISIntegration方法可以拿掉,因?yàn)槲覀兪且l(fā)布到Ubuntu服務(wù)器上,用不著IIS,但是這樣的話你的本機(jī)也將會(huì)無法訪問。

7、到了最重要的一環(huán):使用PSFTP,主要命令為open和put,將我們剛才發(fā)布的Light.Api項(xiàng)目Copy到Light.Api-Publish下,你會(huì)看到很多的復(fù)制記錄

8、復(fù)制完成之后,切換到服務(wù)器的該目錄下,如果能啟動(dòng),說明沒問題

9、接下來就不用多說了,Ctrl+Art+F2切換到第二個(gè)管理頁面,把nginx的監(jiān)聽端口改成6000并重啟nginx

10、屏住呼吸,在本機(jī)瀏覽器中輸入服務(wù)器地址:“http://192.168.1.105/swagger/ui”,如果可以正常訪問,并且可以請(qǐng)求到數(shù)據(jù),說明你已經(jīng)成功了!如果發(fā)現(xiàn)服務(wù)器不可用的話,多半是本機(jī)開啟了防火墻,連接不到數(shù)據(jù)庫導(dǎo)致的,因?yàn)檫@時(shí)你ping主機(jī)也是ping不通的,只需到控制面板中關(guān)閉防火墻即可!最后的效果圖,nginx on ubuntu就是強(qiáng)有力的證明

四、寫在最后
可能細(xì)心的人兒已經(jīng)發(fā)現(xiàn)我其實(shí)還有最后一步Light.Api的守護(hù)進(jìn)程沒有配置,所以就最后就留給大家來搞定吧。我不會(huì)告訴你只需要參照著上面的步驟5即可!希望這篇文章可以幫到那些剛接觸到ASP.NET Core在Linux中部署的同學(xué)們,如果對(duì)文章有疑問或者不清晰的,歡迎討論。也希望大家多多支持腳本之家。
相關(guān)文章
Visual Stduio 2010開發(fā)環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了Visual Stduio 2010開發(fā)環(huán)境搭建教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
ASP.NET Core對(duì)不同類型的用戶進(jìn)行區(qū)別限流詳解
這篇文章主要介紹了ASP.NET Core對(duì)不同類型的用戶進(jìn)行區(qū)別限流的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
WPF實(shí)現(xiàn)帶全選復(fù)選框的列表控件
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)帶全選復(fù)選框的列表控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Hangfire在ASP.NET CORE中的簡(jiǎn)單實(shí)現(xiàn)方法
下面小編就為大家分享一篇Hangfire在ASP.NET CORE中的簡(jiǎn)單實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-11-11
ASP.NET 2.0服務(wù)器控件開發(fā)之復(fù)雜屬性
ASP.NET 2.0服務(wù)器控件開發(fā)之復(fù)雜屬性...2006-09-09
ASP.Net項(xiàng)目中實(shí)現(xiàn)微信APP支付功能
這篇文章介紹了ASP.Net項(xiàng)目中實(shí)現(xiàn)微信APP支付功能的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
asp.net 簡(jiǎn)單工廠模式和工廠方法模式之論述
簡(jiǎn)單工廠模式的最大優(yōu)點(diǎn)在于工廠類中包含了必要的邏輯判斷,根據(jù)客戶端的選擇條件動(dòng)態(tài)實(shí)例化相關(guān)的類,對(duì)于客戶端來說,去除了于具體產(chǎn)品的依賴2011-12-12

