.Net Core部署到CentOS

  本文基於初次或再次嘗試部署.Net Core應用到Linux服務器上,我嘗試後自我總結的經驗一個簡單的Demo,嘗試部署在Linux服務器上和跨服務器訪問數據庫。html

 

1、環境介紹

  一、本地使用Visual Studio 2017開發,使用的.NetCore SDK版本爲2.1.4;java

  二、數據庫使用的MSSQLServer,部署在阿里雲服務器上,WindowServer;linux

  三、Demo部署在騰訊雲服務器上,CentOS系統;git

  四、CentOS中安裝了.net CoreSDK 2.1.4(開發和部署的環境最好一致,我在這裏掉過坑)數據庫

  五、代碼管理經過Git來進行,在本地安裝了Git,在CentOS中也安裝了Git;json

  六、利用jexus進行反向代理;服務器

 

2、項目介紹

  創建一個Asp.Net Core項目,這個創建過程就不貼圖了,步驟簡單。此處尚未使用到Docker,創建項目時,沒有勾選Docker支持app

  

  整個項目從搭建到運行的簡略過程框架

  

  一、創建實體,只加了一個User類,裏面就是基本的用戶名、密碼、地址和建立日期。curl

public class User
    {
        public User()
        {
            this.CreateDate = DateTime.Now;
        }

        public int Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Address { get; set; }
        public DateTime CreateDate { get; set; }
    }

   二、接下來是創建DbContext

    public class HDShopDbContext:DbContext
    {
        public HDShopDbContext(DbContextOptions<HDShopDbContext> options)
            :base(options)
        {

        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //modelBuilder.Entity<User>().ToTable("xxxx");
        }

        public virtual  DbSet<User> User { get; set; }
    }

  三、配置服務,在項目中已經默認的將EFCore相關的Nuget包加入進來了,在StartUp.cs文件中進行服務配置,使用

  services.AddDbContext<HDShopDbContext>(d => d.UseSqlServer(Configuration.GetConnectionString("Default")));
 public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<HDShopDbContext>(d => d.UseSqlServer(Configuration.GetConnectionString("Default")));
            services.AddMvc();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseBrowserLink();
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }

  此處,解釋下Configure和ConfigureService的區別:

  Configure配置的是中間件,整個服務運行過程當中,是以中間件形式進行跳轉,從第一個中間件到第二個中間件,完成最後一箇中間件要求後返回到上一個中間件,而中間件數量的多少是咱們能夠去控制的,若是有什麼功能須要加入,咱們也能夠以中間件的形式控制運行,Configure方法即時控制中間件的。

  ConfigureService配置的是整個運行中所用到的各類框架,注入等等,在Configure方法前先被調用。

  具體可看@行動派Xdpie http://www.javashuo.com/article/p-cokliekk-gp.html

  在appsetting.json中配置鏈接字符串,因爲Linux中不能安裝SQLServer除2017之外的其餘版本我便將另外一臺WindowServer服務器數據庫弄過來用了,SQLServer2017對於Linux服務器配置要求很高。

  記得鏈接字符串名字不要弄錯了  ! ! !

  四、爲了方便讓EFCore的CodeFirst在咱們部署完,啓動後就自動建立數據庫,咱們準備點種子數據

public class DbInitializer
    {
        public static void Initialize(HDShopDbContext context)
        {
            context.Database.EnsureCreated();
            if (context.User.Any())
            {
                return;
            }
            var users = new User[]
            {
                new User(){Address="測試",UserName ="1測試1",Password="123456"},
                new User(){Address="測試",UserName ="2測試2",Password="123456"},
                new User(){Address="測試",UserName ="3測試3",Password="123456"},
                new User(){Address="測試",UserName ="4測試4",Password="123456"},
                new User(){Address="測試",UserName ="5測試5",Password="123456"},
                new User(){Address="測試",UserName ="6測試6",Password="123456"},
            };
            foreach (var user in users)
            {
                context.Add(user);
            }
            context.SaveChanges();
        }
    }

  五、編譯運行,測試下本地運行是否成功。我這就不將個人測試結果展現出來了。

  六、進入Linux服務器,下載好Git,經過配置好SSH公鑰,在GitHub或是碼雲上作個記錄。

   Linux服務器上配置Git的教程:http://www.javashuo.com/article/p-mhaaxvfs-cs.html

  七、Linux服務器安裝jexus,經過以下命令安裝

curl https://jexus.org/release/x64/install.sh|sh

   安裝成功後會提示:OK, Jexus has been installed in /usr/jexus.

   至此,做爲反向代理的jexus安裝完畢,之前須要安裝jexus+mono,如今最新版本的jexus已經將mono合併進去了,造成了如今的jexus獨立版.

  八、安裝.Net Core環境

   個人建議是先查看開發環境的.Net Core SDK版本,否則若是服務器上的環境和開發環境存在版本差別的話會出現一些坑,好比我遇到的一個坑

Error:
  An assembly specified in the application dependencies manifest ({projectName}.deps.json) was not found:
    package: 'Microsoft.AspNetCore.Antiforgery', version: '2.0.2'
    path: 'lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll'
  This assembly was expected to be in the local runtime store as the application was published using the following target manifest files:
    aspnetcore-store-2.0.5.xml

  在我安裝服務器的SDK的時候選擇的是2.1.3版本,而個人開發環境是2.1.4版本,結果就出錯了,弄了一陣子沒搞好這個緣由,一樣就是這個緣由,使得我從Git上pull下來的項目,雖然發佈成功了,可是部署的話是不可以正常訪問的,同時經過dotnet /xxx/xxx/xx.dll進行測試會一直出現這個錯誤。最後經過幹掉已有的版本,得到最新的版本,一樣,我也在這裏有個問題,貌似沒得更新SDK版本的指令吧?我沒有找到,抱歉,若有,請聯繫我,謝謝。

  經過命令幹掉舊版的CLI,同時下載新版的SDK搞定,成功運行起來了。

rm -rf /usr/share/dotnet​ 刪除舊版cli

 

  下面是個人安裝.Net Core的指令

  1、配置dotnet產品Feed
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[packages-microsoft-com-prod]
name=packages-microsoft-com-prod 
baseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'

  二、安裝SDK,注意版本!!!

sudo yum update
sudo yum -y install libunwind libicu
sudo yum install dotnet-sdk-2.1.4

   至此環境便已經搭建好了。

 

3、部署過程

  經過Git將碼雲或是Github上的項目Pull下來,最好如今服務器上指定好Git路徑,好比個人創建一個專門放置項目的文件夾,其中對每個須要Clone到本地的項目創建一個文件夾,可讓我思路比較清晰。或許,你有更好的方式,也可使用。

  

  經過創建完畢運行指令

git clone 你項目的SSH地址

  咱們能夠利用其餘dotnet的指令進行一些操做了,具體須要什麼指令能夠經過dotnet --help進行得到

  查看下文件夾中的內容

  

  能夠經過指令 dotnet run 將項目進行啓動

  

  此處會發現,咱們不能幹什麼事情了,只能按Ctrl + C讓服務停下來,咱們能夠將當前這個程序做爲後臺程序運行,具體的操做就是Ctrl +Z將服務暫停,而後經過指令 bg 將其設爲後臺進程,若是想要進入已有的後臺進程經過指令 fg

  若是咱們是隻在命令行裏操做的話,又看不到頁面,又不能經過外網訪問,又想要確保網站是否真的運行成功了,咱們能夠經過指令來查看網站的首頁信息,將返回網站的html信息。具體更多的linux下http指令請參照http://blog.csdn.net/wh211212/article/details/54285921

 curl localhost:65758

   咱們能夠發佈了,經過指令 dotnet build將項目再次編譯一下,而後經過 dotnet publish -o /xxxx/xxxx 將項目發佈到指定文件夾

   接下來,能夠開始配置jexus了.

/// 一、切換到Jexus配置文件目錄
cd /usr/jexus/siteconf
/// 二、複製默認的配置文件爲HDShop
cp default HDShop
vi HDShop

######################
# Web Site: HDShop
########################################
port=9527
root=/ /var/www/HDShop
hosts= *    #OR your.com,*.your.com

AppHost={CmdLine=dotnet /var/www/HDShop/HDShop.dll;AppRoot=/var/www/HDShop/;Port=0}

   至此,須要的全部準備工做已經作好,

  經過jexus的命令來啓動服務,jexus的命令大全能夠參照:http://blog.csdn.net/yang1982_0907/article/details/45155765

/// 若是已啓動 Jexus:
sh /usr/jexus/jws restart

/// 若是未啓動 Jexus:
sh /usr/jexus/jws start

   此時經過外網輸入ip地址或域名(若是有的話)+端口(我寫的不是默認80端口而是9527端口)

  網站正常啓動,成功讀到阿里雲上那臺數據庫服務器的數據,同時也進行增刪改爲功了。

  至此,嘗試結束,其中還有許多的其餘部分沒有說明進來,好比說Docker,我是使用了Docker的,但在寫的部分中並沒涉及Docker,由於我本身發現一些邏輯繞不過去,具體問題見下一章。還有也嘗試了想要用圖形界面操控Linux服務器而且遠程操控,專門下了GNOME和TigerVNC,發現很卡,卡到心累,便再也不使用,直接在命令行中進行全部工做。同時,對於Window下的項目怎麼移動到Linux上,其實還有不少種方式,好比FTP等等,這個能夠從度娘獲知。我比較喜歡Git這種方式。

 

4、後續問題

  這次沒有配合Docker容器一塊兒使用,下一次將會帶來Docker容器

  一、引入Docker容器,實現服務部署於容器中,經過外網訪問能夠訪問到Docker容器中的網站。

  二、項目尚未加入Dockerfile文件,這次都是經過手工去部署的,下一次將使用Dockerfile進行服務部署。

  三、域名綁定尚未嘗試。

  可是還有一些問題沒有解決

  一、jexus配合Docker使用使用,可是遇到點問題還需解決。

  好比:目前來說,我將網站直接發佈好了,那麼我就不須要指令 dotnet run 讓其自運行自偵聽了,那麼全是依靠的jexus的代理。這麼一來,Docker容器中運行服務那是什麼意思呢?我暫時還不能理解。同時若是說Docker容器中運行網站,那麼是由網站自己自偵聽仍是由容器中的jexus進行代理呢?

  二、端口映射問題,主機端口和Docker容器中端口映射問題。

  三、Docker容器間訪問設置

 

2018-2-3,望技術有成後能回來看見本身的腳步
相關文章
相關標籤/搜索