天天看點

ASP.net Core 部署說明(Ubuntu)

最近在學習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. 

ASP.net Core 部署說明(Ubuntu)

這裡可以看到,目前.net core支援的所有linux系統。我們選擇Ubuntu。

這裡有個分支,需要确認ubuntu版本。根據版本不通,進行不通配置,更新下載下傳.net core.

版本可以通過指令:cat /etc/issue來查詢

ASP.net Core 部署說明(Ubuntu)

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平台,切記。正确的項目結構是這樣的:

ASP.net Core 部署說明(Ubuntu)

同時需要注意好資料庫的配置。預設的示例項目是使用的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

如果提示如下:

ASP.net Core 部署說明(Ubuntu)

則說明環境配置,及項目配置沒問題,服務正常啟用。

不過沒有辦法遠端通路?這是因為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端口。重新釋出,并上傳後,執行:

ASP.net Core 部署說明(Ubuntu)

看到第二次執行後,監聽位址發生變化,現在浏覽器裡可以直接通路了。

ASP.net Core 部署說明(Ubuntu)

好吧,這樣可以臨時湊合用,但是一旦重新開機,服務并不會自動運作,并且現在主流都是通過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;
    }
}
           
ASP.net Core 部署說明(Ubuntu)

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進行的轉發。

最後效果如下:

ASP.net Core 部署說明(Ubuntu)

總結:

      .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也可以來這裡反應。

繼續閱讀