最近在學習asp.net core,當然學習的目的是想了解一下,Asp.net core是否真的能夠是先跨平台部署。
根據目前官網資料說明,asp.net core隻有在Redhat 企業版上,才能夠實作所有的功能。不過這個版本是收費的,可能不是大多數人的最佳選擇。
筆者目前選擇的實驗環境是Ubuntu 16.4 和CentOS7這兩個平台。
從長遠角度來說,CentOS7維護周期長,更加适合企業生産環境。Ubuntu擇以更加活躍的社群,更加快速的更新受到歡迎,不過他的維護周期一般隻有2~3年,也就是說,一旦出現一個新版本,老版本的ubuntu可能就不會受到更新維護了,然而更新大版本,可能會牽扯很多問題,是以具體選擇那個系統,還需要使用者自行斟酌。
筆者這裡首先說一下Ubuntu的部署方法。
這裡是微軟官方的Getting Started教程:https://docs.asp.net/en/latest/getting-started.html
1. 安裝.net core.
這裡可以看到,目前.net core支援的所有linux系統。我們選擇Ubuntu。
這裡有個分支,需要确認ubuntu版本。根據版本不通,進行不通配置,更新下載下傳.net core.
版本可以通過指令:cat /etc/issue來查詢
Ubutu 14.4 執行:
sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
sudo apt-get update
Ubuntu 16.4執行:
sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
sudo apt-get update
然後安裝.net core sdk。
sudo apt-get install dotnet-dev-1.0.0-preview2-003121
完成之後,可以參照微軟說明,跑一個hello world進行下測試。
2. 把使用vs2015,基于asp.net core開發的項目進行釋出。這裡一定要注意,必須是基于Asp.net Core開發的項目,基于.net framework的項目隻能運作在windows平台,切記。正确的項目結構是這樣的:
同時需要注意好資料庫的配置。預設的示例項目是使用的sqlserver compact資料庫,這個是不支援跨平台的,當然也就不能部署到linux上去。是以使用示例項目的話,把SeedData的調用注釋掉,或者移除掉資料庫操作代碼再釋出。如果是使用的MySql或者其他資料庫,請确認提前在Ubuntu上完成部署,并做好相關資料庫配置。這裡不再記錄,總是需要自行試一下的。
對了,還需要注意一個地方,
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
記得要UseKestrel()。
3. 釋出項目。可以用vs2015的釋出網站釋出,也可以用指令行釋出。這裡寫下指令行釋出的方法。
定位到項目目錄下,要有project.json的目錄下。
dotnet restore
這個是更新所有的項目引用
然後
dotnet publish
這個是釋出項目,釋出過程中如果出現了錯誤提示,請自行根據情況解決。
如果出現:“No executable found matching command "bower"”請看這裡
4. 将釋出的項目上傳到ubuntu伺服器。可以用ssh secure file transfer或者ftp什麼的上傳。
5. 切換到項目目錄下,執行
dotnet XXX.dll
筆者這裡測試用的WebApplication1.dll
如果提示如下:
則說明環境配置,及項目配置沒問題,服務正常啟用。
不過沒有辦法遠端通路?這是因為listening on: http://localhost:5000的原因,你隻是監聽了localhost的5000端口,是以不支援外部ip:5000的通路。這裡可以用nginx,待會說到,也可以修改一下代碼如下:
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseUrls("http://*:5000")
.Build();
host.Run();
}
這裡改成了監聽http://*:5000,一看就明白了吧,這是監聽任意ip的5000端口。重新釋出,并上傳後,執行:
看到第二次執行後,監聽位址發生變化,現在浏覽器裡可以直接通路了。
好吧,這樣可以臨時湊合用,但是一旦重新開機,服務并不會自動運作,并且現在主流都是通過nginx做代理使用,下面我們繼續說。
6. 安裝nginx
sudo apt-get install nginx
nano /etc/nginx/sites-available/default
當然vi也可以。
修改Server節點配置:
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;
}
}
ctrl+O Ctrl+X 儲存,然後退出。
重新開機Nginx
sudo service nginx restart
這樣Nginx代理就配置好了,然後是做個自動啟動服務。
7. 安裝Supervisor
supervisor就是用Python開發的一套通用的程序管理程式,能将一個普通的指令行程序變為背景daemon,并監控程序狀态,異常退出時能自動重新開機。
通俗的來講,可以友善的做成啟動項自動運作。
sudo apt-get install supervisor
在/etc/supervisor/conf.d/目錄下建立檔案 XXX.conf
nano /etc/supervisor/conf.d/Test.conf
敲入代碼:
[program:WebApplication1]
command=/usr/bin/dotnet /home/robin/publish/WebApplication1.dll
directory=/home/robin/publish
autostart=true
autorestart=true
stderr_logfile=/var/log/NetCoreBBS.err.log
stdout_logfile=/var/log/NetCoreBBS.out.log
environment=ASPNETCORE__ENVIRONMENT=Production
user=root
stopsignal=INT
Ctrl+O Ctrl+X儲存
sudo service supervisor restart
重新開機supervisor。
然後你會發現,不需要你在手動去運作dotnet xxx.dll來啟動監聽了,并且可以直接通過80端口通路項目了,即使沒有配置http://*:5000,使用的localhost也可以正常通路,因為畢竟是走的nginx進行的轉發。
最後效果如下:
總結:
.net 總算解決了跨平台的問題,雖然WinForm程式目前還沒有實作,但是基礎的ConsoleApp,asp.net core,都已經可以實作linux平台部署。可以說,基本的企業級項目開發已經可以通過asp.net core來實作跨平台了。開發工具可以用vs2015(windows)或者Vs code(Mac和linux),就IDE環境來說,甩Eclipse幾條街妥妥的。
不過需要注意,System.drawing并沒有實作,背景加水印什麼的,可能隻能依托于其他三方插件實作,不過相信會越來越完善的。
aspnet github社群 還希望大家參與進來,一塊完善aspnet core。一些bug也可以來這裡反應。