【無私分享:ASP.NET CORE 項目實戰(第十章)】發布項目到 Linux 上運行 Core 項目


 

目錄索引 

 

【無私分享:ASP.NET CORE 項目實戰】目錄索引

 

簡介

 

  

  ASP.Net Core 給我們帶來的最大的亮點就是跨平台,我在我電腦(win7)上用虛擬機建了個 CentOS7 ,來演示下,我們windows上的項目如何發布項目到Linux上運行。我這里有個在windows上搭建過的程序,我們主要演示如何在linux上運行,所以大家不要糾結於這些,大家可以新建一個web項目嘗試一下。

  

 

安裝.NET Core SDK for CentOS

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

  ① 安裝 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 現在很火熱,但是網上的很多資料都是前篇一律的復制,所以有很多問題我也暫時沒有解決,希望大家能共同幫助一下!

 

原創文章 轉載請尊重勞動成果 http://yuangang.cnblogs.com

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM