1. 程式人生 > >【無私分享:ASP.NET CORE 專案實戰(第十章)】釋出專案到 Linux 上執行 Core 專案

【無私分享:ASP.NET CORE 專案實戰(第十章)】釋出專案到 Linux 上執行 Core 專案

目錄索引

簡介

  ASP.Net Core 給我們帶來的最大的亮點就是跨平臺,我在我電腦(win7)上用虛擬機器建了個 CentOS7 ,來演示下,我們windows上的專案如何釋出專案到Linux上執行。我這裡有個在windows上搭建過的程式,我們主要演示如何在linux上執行,所以大家不要糾結於這些,大家可以新建一個web專案嘗試一下。

安裝.NET Core SDK for CentOS

   一、.Netcore 1.0 

  ① 安裝 libicu 依賴: sudo yum install libunwind libicu

  

  安裝成功:

  

    ② 下載 SDK 壓縮包:curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=809131

   

  ③ 解壓縮:sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet

  

  ④ 建立連線:sudo ln -s /opt/dotnet/dotnet /usr/local/bin

  

   二、.Netcore 2.0 微軟有詳細的安裝命令,可以參考 Install .NET Core SDK

(注意:安全之前要刪除舊的 .net core 版本 刪除home目錄下的dotnet)

註冊 Microsoft 簽名金鑰:sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc

新增 Microsoft 產品源:sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl=https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'

  更新:sudo yum update

  安裝 libicu 依賴: sudo yum install libunwind libicu

  安裝sdk: sudo yum install dotnet-sdk-2.1.4

     將 dotnet 新增到 PATH:export PATH=$PATH:$HOME/dotnet

dotnet --version

三、NetCore 2.1.1

The specified framework 'Microsoft.AspNetCore.App', version '2.1.1' was not found.

註冊源:

sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

 安裝SDK

sudo yum update
sudo yum install aspnetcore-runtime-2.1

測試安裝是否成功

  通過 dotnet --info  來檢視一下,出現如下介面,表示成功:

  

測試專案執行

  注意:不熟悉Linux的朋友請注意,Liunx下路徑是區分目錄大小寫的。

  ① 新建一個目錄:mkdir TestApp

  

  ② 進入目錄:cd TestApp

  

  ③ 新建一個預設的 web 專案:dotnet new -t web

  

  ④ 還原包:dotnet restore

  這個時間可能比較長,看網速了,大家要耐心等待。

  

  ⑤ 我們來執行一下:dotnet run

  

釋出我們的專案到Linux

  大家可以使用Ftp等方式將檔案釋出到伺服器上,我這裡直接釋出到本地資料夾中,然後通過FileZilla 傳送到伺服器上。

  釋出專案的方式有多種,比如可以使用 dotnet publish 命令,我們這裡使用 VS :

  首先,我們開啟 Project.json 來新增幾個釋出的執行時(這一步可以不要,如果不配置這裡,那麼釋出的時候是 Any,我們待會講到

  

  然後,右擊我們的專案,選擇釋出:

  

  新建一個釋出配置檔案,釋出方法選擇 檔案系統

  

  設定裡,我們選擇目標執行時:centos.7-x64在上面,我們講到 Project.json 裡添加了 幾個執行時,如果沒有那一步,那麼這裡 沒有選項,只有一個 Any

  

  然後點擊發布,我們把釋出完的檔案上傳到CentOS上:我放到了 Wwwroot 目錄下

  

  我們來編譯我們的檔案:dotnet XXX.dll

  這裡先為大家演示一個 錯誤 :我的 wkmvc.dll 是在 Wwwroot 目錄下的 ,所以 我執行命令(注意路徑大小寫,Linux區分大小寫,我們上面提到) dotnet Wwwroot/wkmvc.dll

  

  顯示成功了,我們開啟瀏覽器,輸入 localhost:5000

  

  是空白的,我們修改一下我們的程式,輸出一下日誌看看:

  

  這是什麼原因呢?為什麼沒找到Index.cshtml呢?請大家再次注意一下 我們的 Content root path,答案是 她沒有對 root 的操作許可權的,我們來對比一下 我們安裝過程中 測試成功的 web  和 我們這個 web 的 Content root path

  

  我們來嘗試一下:我們進入Wwwroot目錄下,然後執行 dotnet wkmvc.dll

  

  我們再次開啟瀏覽器,輸入 localhost:5000

  

  是不是 OK 了,我們來進入我們的區域的 登入頁 測試一下:

  

  也沒有問題,到此,專案就執行成功了,但是在實際中,我們可能還要安裝 nginx 、配置我們的 FireWall 以及配置守護服務Supervisor 等等,這裡就不演示了。

  既然大家不是很瞭解,或者網上找資料比較繁瑣,對於 nginx firewall 以及 supervisor 的配置,我就再一步一步給大家演示一下。

安裝Nginx

  Nginx 的安裝比較簡單,就三條命令:

  ① curl -o  nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

   

  rpm -ivh nginx.rpm

  

  ③ yum install nginx

 

   啟動 Nginx:systemctl start nginx 

  設定開機啟動(linux宕機、重啟會自動執行nginx不需要連上去輸入命令):systemctl enable nginx

   

配置防火牆

  ① 開放80埠:firewall-cmd --zone=public --add-port=80/tcp --permanent

  ② 重啟防火牆以使配置即時生效:systemctl restart firewalld

  

  我們來測試一下Nginx是否可以訪問:

  

配置Nginx對ASP.net Core 應用的轉發

  修改 Nginx 的 default.conf 檔案(目錄:/etc/nginx/conf.d/default.conf

  將內容替換為(配置Nginx轉發):

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

  上傳覆蓋default.conf檔案

  重新載入,即時生效:nginx -s reload 

  我們來測試一下:

  

  

  這是什麼鬼?這個問題是由於SELinux保護機制所導致,我們需要將nginx新增至SELinux的白名單。

  我們通過命令來解決這個問題:

  ① yum install policycoreutils-python

  

  ② sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx

  

  ③ sudo semodule -i mynginx.pp

  我們再次嘗試訪問:

  

Supervisor 守護服務

  為什麼要這個玩意呢?

  我們先來看下我們存在的問題:① 我們在上面演示中,執行我們的應用都是通過 dotnet  ***.dll 或者 dotnet run ,也就是我們的 ASP.NET Core應用程式執行在shell之中,如果關閉shell則會發現ASP.NET Core應用被關閉,從而導

                  致應用無法訪問。

                 ② 如果ASP.NET Core程序意外終止那麼需要人為連進shell進行再次啟動。

                 ③ 如果伺服器宕機或需要重啟我們則還是需要連入shell進行啟動。

  那麼要解決這些問題,我們就必須要實現這麼一個功能:如果ASP.NET Core 意外終止,那麼我們要自動重啟;如果伺服器伺服器重啟後,我們要有個類似指令碼命令一樣,自動執行 dotnet 命令。

  現在正好有個基於 Python 開發的工具 Supervisor 可以解決我們上述問題:

  安裝Supervisor

    1.1:yum install python-setuptools

    1.2:easy_install supervisor

   ② 配置Supervisor

   mkdir /etc/supervisor

   echo_supervisord_conf > /etc/supervisor/supervisord.conf  

  ③ 配置 Supervisor 對 Asp.net Core 應用的守護

  這裡有個重要說明:很多文件包括微軟的官方文件都是 在/etc/supervisor 目錄下 新建一個目錄 conf.d  然後在conf.d 目錄下新建一個conf檔案,將下面這段程式碼放到這個檔案裡,然後修改 /etc/supervisor/supervisord.conf的最後一行 [include] files= relative/directory/*.ini 修改為 [include] files = /etc/supervisor/conf.d/*.conf,但是我一直沒有成功,嘗試了各種辦法,排查了各種錯誤,都沒有成功,所以,我直接寫在了/etc/supervisor/supervisord.conf裡(如下),成功了,所以,大家可以嘗試以下上述。

  修改 supervisord.conf 檔案(目錄:/etc/supervisor/supervisord.conf),新增程式:

  [program:wkmvc]

  command=dotnet /root/Wwwroot/wkmvc.dll
  directory=/root/Wwwroot/
  autostart=true
  autorestart=true
  stderr_logfile=/var/log/wkmvc.err.log
  stdout_logfile=/var/log/wkmvc.out.log
  environment=ASPNETCORE_ENVIRONMENT=Production
  user=root
  stopsignal=INT

  如果服務已經啟動,則需要使用 supervisorctl reload 命令來使新的配置生效,當然,我們這裡並沒有啟動,所以不需要這一步。

  執行:

  supervisord -c /etc/supervisor/supervisord.conf

  啟動服務,然後我們來看下:

  ps -ef | grep wkmvc

   

  配置Supervisor開機啟動

  新建一個“supervisord.service”檔案

  # dservice for systemd (CentOS 7.0+)
  # by ET-CS (https://github.com/ET-CS)
  [Unit]
  Description=Supervisor daemon

  [Service]
  Type=forking
  ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
  ExecStop=/usr/bin/supervisorctl shutdown
  ExecReload=/usr/bin/supervisorctl reload
  KillMode=process
  Restart=on-failure
  RestartSec=42s

  [Install]
  WantedBy=multi-user.target

  將檔案拷貝至:“/usr/lib/systemd/system/supervisord.service”

  systemctl enable supervisord

  

  驗證一下是否為開機啟動:systemctl is-enabled supervisord

   

希望跟大家一起學習Asp.net Core 

剛開始接觸,水平有限,很多東西都是自己的理解和翻閱網上大神的資料,如果有不對的地方和不理解的地方,希望大家指正!

雖然Asp.net Core 現在很火熱,但是網上的很多資料都是前篇一律的複製,所以有很多問題我也暫時沒有解決,希望大家能共同幫助一下!

相關推薦

無私分享ASP.NET CORE 專案實戰釋出專案Linux 執行 Core 專案

目錄索引 簡介   ASP.Net Core 給我們帶來的最大的亮點就是跨平臺,我在我電腦(win7)上用虛擬機器建了個 CentOS7 ,來演示下,我們windows上的專案如何釋出專案到Linux上執行。我這裡有個在windows上搭建過的程式,我們主要演示如何在linux上執

無私分享ASP.NET CORE 專案實戰建立區域Areas,新增TagHelper

目錄索引 簡介   在Asp.net Core VS2015中,我們發現還有很多不太簡便的地方,比如右擊新增檢視,轉到試圖頁等功能圖不見了,雖然我們可以通過工具欄的自定義命令,把這兩個右擊選單新增上,但是貌似是灰色的不能用。   其實,這樣也好,通過手動建立,更讓我們深刻的理解M

無私分享ASP.NET CORE 專案實戰讀取配置檔案 appsettings.json

目錄索引 簡介   在我們之前的Asp.net mvc 開發中,一提到配置檔案,我們不由的想到 web.config 和 app.config,在 core 中,我們看到了很多的變化,新的配置系統顯得更加輕量級,具有更好的擴充套件性,並且支援多樣化的資料來源。   部落格園對於這個的

無私分享ASP.NET CORE 專案實戰讀取配置檔案 讀取自定義配置檔案

目錄索引 簡介   但隨之產生了問題:我們使用的是在 Startup.cs 中(如下圖)來實現配置讀取,有兩個問題 ① 我們如果定義N種配置,是否要再這裡新增N條這樣的配置 ; ② 如果我們的配置不想寫在appsettings.json中呢     解決問題

無私分享ASP.NET CORE 專案實戰十三Asp.net Core 使用MyCat分散式資料庫,實現讀寫分離

目錄索引 簡介   MyCat2.0版本很快就釋出了,關於MyCat的動態和一些問題,大家可以加一下MyCat的官方QQ群:106088787。我們今天主要介紹一下,在我們的Asp.net Core中如何使用Mycat,這源於一個大神(Amamiya Yuuko)的分享,但是,這中

無私分享ASP.NET CORE 專案實戰Code First 建立資料庫和資料表

目錄索引 簡介   本章我們來介紹下Asp.net Core 使用 CodeFirst 建立資料庫和表,通過 控制檯 和 dotnet ef 兩種方式 修改EF上下文物件,新增測試類   我修改了一下名字,Domains 改為了 wkmvc.Data   我們新建一個

無私分享ASP.NET CORE 專案實戰檔案操作 FileHelper

目錄索引 簡介   在程式設計中,我們很多情況下,會用到對檔案的操作,在 上一個系列 中,我們有很多檔案基本操作的示例,在Core中有一些改變,主要是我們常用的Server.MapPath()不存在了,不知道後續的版本會不會有,在這裡,我們只能自己封裝方法去實現。今天,我們就對一些基本

無私分享ASP.NET CORE 專案實戰Repository倉儲 UnitofWork

1 public abstract class Repository<T> : IRepository<T> where T : class 2 { 3 #region 資料上下文 4 5 /// <s

無私分享ASP.NET CORE 專案實戰EntityFramework下領域驅動設計的應用

這好像就是比我的多了一個“中轉層”,把我們的介面作為了一箇中轉,領域層繼承了倉儲實現業務和資料操作,這有什麼實際意義嗎?希望大家指正一下: 我不理解的是,如果是按照這樣,那麼我如果要修改註冊方法,比如我要在上面方法中傳遞 eamil,name,password 的基礎上還需要傳遞手機號碼,那麼我需要修改

無私分享ASP.NET CORE 專案實戰第二新增EF上下文物件,新增介面、實現類以及無處不在的依賴注入DI

目錄索引 簡介   上一章,我們介紹了安裝和新建控制器、檢視,這一章我們來建立個數據模型,並且新增介面和實現類。 新增EF上下文物件   按照我們以前的習慣,我們還是新建幾個資料夾   Commons:存放幫助類   Domians:資料模型   Services

無私分享ASP.NET CORE 專案實戰Asp.net Core 快取 MemoryCache 和 Redis

1 /// <summary> 2 /// 修改快取 3 /// </summary> 4 /// <param name="key">快取Key</param> 5 ///

無私分享ASP.NET CORE 專案實戰新增對SqlServer、MySql、Oracle的支援

目錄索引 簡介   增加對多資料庫的支援,並不是意味著同時對多種資料庫操作,當然,後面,我們會嘗試同時對多種資料庫操作,這可能需要多個上下文,暫且不論。分散式資料庫,我們採用的是阿里雲的Mycat,這個後面會更新出來。我們今天的場景是:我們的專案可能是在windows上開發的使用的

無私分享ASP.NET CORE 專案實戰圖形驗證碼的實現

1 public class VierificationCodeServices 2 { 3 /// <summary> 4 /// 該方法用於生成指定位數的隨機數 5 /// </summary> 6

Beginng_Rust(譯)定義通用函式和結構完+1

在本章中,您將學習: •如何編寫單個函式定義,其呼叫可以有效地處理不同的資料型別 •如何使用型別推斷來避免指定使用的型別 通用功能 •如何編寫單個struct,tuple-struct或enum型別,其例項可以包含有效的不同資料型別 •如何使用兩個重要的標準通用

Asp.net Web Api開發三篇自定義異常過濾器

如果不自定義異常過濾器,客戶端呼叫API出現錯誤時,將只能得到一個500之類的錯誤狀態,以及一句:出現錯誤。而服務端卻無法攔截到任何異常程式碼,當然你也可以在所有Action裡面寫try-catch來捕獲處理。但這不是我想要的,我們可以自定義一個異常過濾器來捕獲單個Acti

Python程式設計從入門到實踐的動手試一試答案

#10-1 Python學習筆記 with open('learning_python.txt') as file_object: contents = file_object.read() print(contents) ----------------

無私分享從入門到精通ASP.NET MVC從0開始,一起搭框架、做專案7.2 模組管理,模組的新增、修改、刪除

索引 簡述 今天我們來做模組管理的 新增、修改、刪除 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了

無私分享從入門到精通ASP.NET MVC從0開始,一起搭框架、做專案5.3 登入功能的實現,豐富資料表、建立關聯

1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_CODE] Script Date: 2016/5/17 9:30:01 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET

無私分享從入門到精通ASP.NET MVC從0開始,一起搭框架、做專案 10部門管理、崗位管理和員工管理

1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_POST_USER] Script Date: 2016/6/20 16:28:44 ******/ 4 SET ANSI_NULLS ON 5 GO

無私分享從入門到精通ASP.NET MVC從0開始,一起搭框架、做專案 12程式與資料備份

索引 簡述 程式檔案備份與資料備份 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。 專案開始