最近在學習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社區(https://github.com/aspnet) 還但願你們參與進來,一塊完善aspnet core。一些bug也能夠來這裏反應。
|