.Net Core部署到CentOS

来源:https://www.cnblogs.com/CKExp/archive/2018/02/03/8409563.html
-Advertisement-
Play Games

本文基於初次或再次嘗試部署.Net Core應用到Linux伺服器上,我嘗試後自我總結的經驗一個簡單的Demo,嘗試部署在Linux伺服器上和跨伺服器訪問資料庫。 一、環境介紹 1、本地使用Visual Studio 2017開發,使用的.NetCore SDK版本為2.1.4; 2、資料庫使用的M ...


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

一、環境介紹

  1、本地使用Visual Studio 2017開發,使用的.NetCore SDK版本為2.1.4;

  2、資料庫使用的MSSQLServer,部署在阿裡雲伺服器上,WindowServer;

  3、Demo部署在騰訊雲伺服器上,CentOS系統;

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

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

  6、利用jexus進行反向代理;

二、項目介紹

建立一個Asp.Net Core項目,這個建立過程就不貼圖了,步驟簡單。

此處還沒有使用到Docker,建立項目時,沒有勾選Docker支持

  

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

1、建立實體

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

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; }
    }

 

2、接下來是建立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; }
    }

 

 

3、配置服務

  在項目中已經預設的將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 https://www.cnblogs.com/vipyoumay/p/5640645.html

在appsetting.json中配置連接字元串,由於Linux中不能安裝SQLServer除2017以外的其他版本我便將另一臺WindowServer伺服器資料庫弄過來用了,SQLServer2017對於Linux伺服器配置要求很高,我等小平民傷不起,哈哈。

記得連接字元串名字不要弄錯了  ! ! !

 

4、為了方便讓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();
        }
    }

 

5、編譯運行,測試下本地運行是否成功。我這就不將我的測試結果展示出來了。

6、進入Linux伺服器,下載好Git,通過配置好SSH公鑰,在GitHub或是碼雲上做個記錄。(我還是習慣用碼雲,畢竟漢字多 哈哈)

  Linux伺服器上配置Gti的教程:https://www.cnblogs.com/yolo-bean/p/7808767.html

7、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獨立版.

8、安裝.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'

2、安裝SDK,註意版本!!!

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

 

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

三、部署過程

通過Git將碼雲或是Github上的項目Pull下來,最好現在伺服器上指定好Git路徑

比如我的建立一個專門放置項目的文件夾,其中對每一個需要Clone到本地的項目建立一個文件夾,可以讓我思路比較清晰。或許,你有更好的方式,也可以使用。

通過建立完畢運行指令

git clone 你項目的SSH地址

我們可以利用其他dotnet的指令進行一些操作了

具體需要什麼指令可以通過dotnet --help進行獲得

查看下文件夾中的內容

可以通過指令 dotnet run 將項目進行啟動

此處會發現,我們不能幹什麼事情了,

只能按Ctrl + C讓服務停下來,我們可以將當前這個程式作為後臺程式運行,具體的操作就是Ctrl +Z將服務暫停

然後通過指令 bg 將其設為後臺進程,如果想要進入已有的後臺進程通過指令 fg

如果我們是只在命令行里操作的話,又看不到頁面,又不能通過外網訪問,

又想要確保網站是否真的運行成功了,我們可以通過指令來查看網站的首頁信息

 curl localhost:65758

 

將返回網站的html信息

具體更多的linux下http指令請參照http://blog.csdn.net/wh211212/article/details/54285921

 

我們可以發佈了,通過指令 dotnet build將項目再次編譯一下

然後通過 dotnet publish -o /xxxx/xxxx 將項目發佈到指定文件夾

 

接下來,可以開始配置jexus了.

/// 1、切換到Jexus配置文件目錄
cd /usr/jexus/siteconf
/// 2、複製預設的配置文件為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:
sh /usr/jexus/jws restart

/// 如果未啟動 Jexus:
sh /usr/jexus/jws start

 

jexus的命令大全可以參照:http://blog.csdn.net/yang1982_0907/article/details/45155765

此時通過外網輸入ip地址或功能變數名稱(如果有的話)+埠(我寫的不是預設80埠而是9527埠)

網站正常啟動,成功讀到阿裡雲上那台資料庫伺服器的數據,同時也進行增刪改成功了。

至此,嘗試結束,其中還有許多的其他部分沒有說明進來,

比如說Docker,我是使用了Docker的,但在寫的部分中並沒涉及Docker,因為我自己發現一些邏輯繞不過去,具體問題見下一章。

還有也嘗試了想要用圖形界面操控Linux伺服器並且遠程操控,專門下了GNOME和TigerVNC,發現很卡,卡到心累,便不再使用,直接在命令行中進行所有工作。

同時,對於Window下的項目怎麼移動到Linux上,其實還有很多種方式,比如FTP等等,這個可以從度娘獲知。我比較喜歡Git這種方式。

四、後續問題

此次沒有配合Docker容器一起使用,下一次將會帶來Docker容器

1、引入Docker容器,實現服務部署於容器中,通過外網訪問可以訪問到Docker容器中的網站。

2、項目還沒有加入Dockerfile文件,此次都是通過手工去部署的,下一次將使用Dockerfile進行服務部署。

3、功能變數名稱綁定還沒有嘗試。

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

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

  比如:目前來講,我將網站直接發佈好了,那麼我就不需要指令 dotnet run 讓其自運行自偵聽了,那麼全是依靠的jexus的代理。

  這麼一來,Docker容器中運行服務那是什麼意思呢?我暫時還不能理解。同時如果說Docker容器中運行網站,那麼是由網站本身自偵聽還是由容器中的jexus進行代理呢?

2、埠映射問題,主機埠和Docker容器中埠映射問題。

3、Docker容器間訪問設置

 

2018-2-3,望技術有成後能回來看見自己的腳步

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目背景 這是一道模板題。 題目描述 讀入一個長度為 nn 的由大小寫英文字母或數字組成的字元串,請把這個字元串的所有非空尾碼按字典序從小到大排序,然後按順序輸出尾碼的第一個字元在原串中的位置。位置編號為 11 到 nn 。 輸入輸出格式 輸入格式: 一行一個長度為 nn 的僅包含大小寫英文字母或數 ...
  • 這裡介紹簡單的驗證碼功能 動態生成圖片 一個簡單的頁面: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> fun ...
  • 引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中國電腦學會(CCF)發起的“電腦職業資格認證”考試,針對電腦軟體開發、軟體測試、信息管理等領域的專業人士進行能力認證。認證對象是從事或將要從事IT領域專業技術與技術管理人 ...
  • 本節內容 Python介紹 發展史 Python 2 or 3? 安裝 Hello World程式 變數 用戶輸入 模塊初識 .pyc是個什麼鬼? 數據類型初識 數據運算 表達式if ...else語句 表達式for 迴圈 break and continue 表達式while 迴圈 一、 Pyth ...
  • 裝飾器: 意義:在不能改變原函數的源代碼,和在不改變整個項目中原函數的調用方式的情況下,給函數添加新的功能 由於不允許改變函數的源代碼,在忽略調用方式的情況下,我們可能會有以下結果: 但這改變了原本的調用方式,原本是test1(),現在是decorator(test1) 那麼如果我們為了使調用方式不 ...
  • 1.類變數的用途:大家公用的屬性,節省開銷(記憶體) 2.析構函數 在實例釋放和銷毀的時候執行的,通常用於做一些收尾工作,如關閉一些資料庫鏈接和打開的臨時文件 3.私有方法兩個下劃線開頭,聲明該方法為私有方法,不能在類地外部調用。 4.私有屬性兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直 ...
  • 什麼是Tomcat Tomcat簡單的說就是一個運行JAVA的網路伺服器,底層是Socket的一個程式,它也是JSP和Serlvet的一個容器。 為什麼我們需要用到Tomcat 如果你學過html,css,你會知道你寫的頁面只能自己訪問, 別人不能遠程訪問你寫的頁面 ,Tomcat就是 提供能夠讓別 ...
  • Create the short array at half the size of the byte array, and copy the byte data in: It is the fastest method by far. https://stackoverflow.com/quest ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...