前言:
在上一節中,通過一系列的步驟,已經將項目部署到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.很多東西都是翻閱了網上大神的資料加上自己的實踐理解總結記錄的。如果有不對的或不理解的地方,希望大家可以指正和多多交流