1. 程式人生 > >ASP.NET Core部署系列二:釋出到CentOS上

ASP.NET Core部署系列二:釋出到CentOS上

前言:

  在上一節中,通過一系列的步驟,已經將專案部署到IIS上,雖然遇到了一些問題,但最終解決併成功運行了。而在這一節中,將嘗試通過linux系統的環境下,部署專案,實現Net Core跨平臺的亮點。

雖然網上已經有很多關於asp.net core在linux下的部署教程了,但我還是想寫一篇,主要增強我自己的記憶,同時分享下我部署遇到的坑。

我在我電腦win7的作業系統中用來虛擬機器建了個CentOS7,來演示,我們的專案如何釋出在Linux上執行。

開始:

一、安裝.Dotnet Core 2.2

  Linux上執行Dotnet Core程式的前提是安裝Dotnet Core Runtime,如果想要在Linux做 .NET Core的開發和編譯工作,那麼需要安裝 Dotnet Core SDK。Dotnet Core SDK中包括了Dotnet Core Runtime,所以這裡就直接安裝了Dotnet Core SDK

  Step 1:安裝Dotnet產品的必要前提

  在安裝Dotnet Core前,需要註冊Microsoft簽名金鑰並新增Microsoft產品提要,每臺機器只需註冊一次,執行如下命令:

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

  Step 2:安裝Dotnet Core SDk,執行下列命令

sudo yum update
y
sudo yum install dotnet-sdk-2.2
y
  大家注意,會有兩個“y”的原因是,命令執行的中途停頓了,讓你確認下是否進行安裝,你要輸入“y”確認安裝才會執行安裝

安裝完後,我們輸入如下命令看下是否安裝成功

二、部署Asp.net Core 應用程式

  在CentOS系統中,新建publish資料夾

  上傳上一節釋出的檔案到至/home/publish/。

  這邊我使用了Xftp進行檔案的上傳。(如果是在本地虛擬機器操作的話,也可以直接複製到系統對應的資料夾目錄下)

  進入目錄:cd publish

   檢查是否可以執行:dotnet LCzarCms.Admin.dll

  如果出現這些資訊則表示成功執行

 

  到此,專案就執行成功了,這時候我們是無法訪問到這個頁面的,這時候我們需要部署一個web容器來進行轉發,我們可能還要安裝 nginx 、配置我們的 FireWall 以及配置守護服務 Supervisor 等等

三、配置Nginx託管

  微軟官方提供的https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.2#monitor-the-app,把dotnet建立成一個服務

  安裝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檔案

 

  將檔案內容替換為:

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

  進行修改覆蓋

  重新載入,即時生效:

nginx -s reload

  再次執行ASP.NET Core應用程式

  但是,測試我們再次瀏覽執行的時候,會出現如下這種情況:

  這是什麼情況?經過後續瞭解,這個問題是由於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

  我們再次訪問執行一下:

  這次已經可以成功的執行起來了。

  至此基本完成了部署。

但是,我們還是存在著其他的問題:

  1.ASP.NET Core應用程式執行在shell之中,如果關閉shell則會發現ASP.NET Core應用被關閉,從而導致應用無法訪問,這種情況當然是我們不想遇到的,而且生產環境對這種情況是零容忍的。

  2.如果ASP.NET Core程序意外終止那麼需要人為連進shell進行再次啟動,往往這種操作都不夠及時。

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

  為了解決這些問題,我們需要有一個程式來監聽ASP.NET Core 應用程式的狀況。

  那麼要解決這些問題,我們就必須要實現這麼一個功能:如果ASP.NET Core 意外終止,那麼我們要自動重啟;如果伺服器伺服器重啟後,我們要有個類似指令碼命令一樣,自動執行 dotnet 命令。現在正好有個基於 Python 開發的工具 Supervisor 可以解決我們上述問題

六、配置Supervisor守護服務

  在應用程式停止執行的時候立即重新啟動。這邊我們用到了Supervisor這個工具,Supervisor使用Python開發的。

  安裝Supervisor:

yum install python-setuptools

easy_install supervisor

  配置Supervisor:

①執行supervisord 服務的時候,需要指定 Supervisor 配置檔案,所以,先通過如下命令建立目錄,以便讓 supervisor 成功載入預設配置:

mkdir /etc/supervisor

②目錄建立成功後, 通過 echo_supervisord_conf 程式(用來生成初始配置檔案,檔名可以自定義)來初始化一個配置檔案: 

echo_supervisord_conf > /etc/supervisor/supervisord.conf

③通過vim命令修改建立好的supervisord.conf配置資訊:

vi /etc/supervisor/supervisord.conf

④最下邊找到如下文字片段:

  修改為:

  為我們部署的.NET Core新增程序配置檔案:

①建立配置檔案LCzarCmsAdmin.ini(檔名自定義)

[program:LCzarCmsAdmin]
command=dotnet /root/publish/LCzarCms.Admin.dll
directory=/root/publish/
autostart=true
autorestart=true
stderr_logfile=/var/log/LCzarCms.err.log
stdout_logfile=/var/log/LCzarCms.out.log
environment=ASPNETCORE_ENVIRONMENT=Production
user=root
stopsignal=INT

②在/etc/supervisor/目錄下建立一個資料夾conf.d

mkdir /etc/supervisor/conf.d/

  將剛建立的配置檔案LCzarCmsAdmin.ini移到conf.d資料夾下

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

  啟動 Supervisor 服務

supervisord -c /etc/supervisor/supervisord.conf

  啟動服務後,我們可以檢測看一下:

ps -ef | grep LCzarCms.Admin.dll

  這個時候, 我們已經不需要使用dotnet命令執行程式, 同樣可以訪問我們部署的.NET Core程式了。

  至此關於ASP.NET Core應用程式的守護即配置完成。

七、配置Supervisor開機啟動:

①進入/usr/lib/systemd/system/目錄,並建立supervisord.service檔案(或者在本地寫好了再通過ftp工具傳輸到指定目錄下)

vi /usr/lib/systemd/system/supervisord.service

  修改檔案

[Unit]
Description=Supervisor daemon

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

②設定開機啟動

  啟用開機啟動:

systemctl enable supervisord.service

  啟動supervisor程序:

systemctl start supervisord.service

systemctl daemon-reload

  驗證一下是否為開機啟動:

systemctl is-enabled supervisord

  重啟,測試是否可以開機自啟

  好了。最終也成功的在重啟之後,可以訪問地址。

總結:

  1.在虛擬機器上安裝CentOS7作業系統,這裡就不做具體的安裝內容了,可以參考VMwear安裝Centos7

  2.學習了linux(CentOS) 環境下,新建、刪除、移動資料夾和檔案的命令。同時,Linux下路徑是區分目錄大小寫的

  3.很多東西都是翻閱了網上大神的資料加上自己的實踐理解總結記錄的。如果有不對的或不理解的地方,希望大家可以指正和多多