.net core項目在 linux服務器部署的解決方法


 

下面內容有添加端口的地方請檢查是否有添加,

lsof -iTCP -sTCP:LISTEN -P | grep :8989

如果有就要不就改變端口,要不就殺掉占用端口的進程

kill -9 PID

 

請准備以下環境和工具進行項目的部署

1、系統環境:CentOS8
2、.net core :3.1
3、Mysql:8.0
4、准備工具:
1) VMware Workstation 15 Pro下載地址:
https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
2)Xshell-6.0.0189p下載地址:
鏈接:https://pan.baidu.com/s/166tU06y8BBS-AugDyXFuvA
提取碼:vvqy
3)CentOS8下載地址:
http://mirrors.aliyun.com/centos/8/isos/x86_64/

4)Mobaxterm用於文件上傳到linux系統中,mobaxterm工具去百度搜索下這里就不提供了

5、以下部署的項目假設為:LokiCore.dll

第一、在CentOS8中安裝.net core環境
1.安裝.NET Core Runtime,安裝過程中可能需要輸入Linux密碼以及提示選擇Y/N,選擇Y,,如果遇網絡問題,可以重新執行命令試試

#注冊 Microsoft 密鑰。注冊產品存儲庫。安裝必需的依賴項。
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

#安裝 .NET Core 運行時
sudo yum -y install aspnetcore-runtime-3.1

#查看Dotnet 版本信息
dotnet --info

2.安裝.NET Core SDK

#安裝.NET Core SDK
sudo yum -y install dotnet-sdk-3.1

#查看Dotnet 版本信息
dotnet --info

#查看Dotnet 版本信息
dotnet --version

第二、發布.NET Core項目到Linux
1、.net core LokiCore應用發布有兩種方式,框架依賴部署和獨立部署,對.net core版本獨立性要求不是很高的,通常用框架依賴部署 進行發布應用程序,發布時,目標運行時:選擇Linux,因為這里是發布到linux上;

2、.net core應用發布成功后,通過XShell或者mobaxterm工具上傳到linux服務器中,在/var/文件夾中建立一個www的文件夾,然后將.net core LokiCore應用程序上傳進去,以下是mobaxterm上傳工具將文件上傳到linux中

 

第三、啟動和停止.NET Core項目
注意:
①、這里urls配置,如果需要局域網或者外網訪問,不能填成urls="http://localhost:8081;http://localhost:8082"
②、關閉Xshell的會話之后,站點同時需要能訪問
③、執行啟動命令,一定要指定LokiCore.dll的路徑或者進入站點目錄,否則會啟動不成功
1、操作步驟
#進入www目錄
cd /var/www

#啟動站點,自定義端口號,運行環境,注意:這里的端口要先開通,firewall-cmd --zone=public --add-port=8988/tcp --permanent
nohup dotnet LokiCore.dll --urls="http://*:8988" --environment=Development > /dev/null 2>&1 &

#查看相關進行
ps -aux | grep "LokiCore.dll"

#訪問啟動的站點
curl http://localhost:8081/

啟動站點說明:
/dev/null相當於執行了command 1 > /dev/null。執行command產生了標准輸出stdout(用1表示),重定向到/dev/null的設備文件中
/dev/null可以理解為/dev路徑下的空文件;該命令將command命令的標准輸出輸出到空文件中
2>&1:可以理解為執行command產生的標准輸出重定向到文件中,標准錯誤也重定向到文件中,期間只打開一次文件,&1的含義就可以理解為用標准輸出的引用,引用的就是重定向標准輸出產生打開的文件

第四、為.NET Core項目創建Supervisor進程守護監控
1、Supervisor介紹
此處的創建守護進程,是指發布在Linux上 asp.net core 程序的dotnet LokiCore.dll命令的宿主進程創建一個守護進程。在 Linux 上有很多可以管理進程的工具,我們使用 Supervisor 來做這個事情。
原因有兩點:
①、它是微軟官方文檔推薦的,降低學習成本。
②、它並不一定是最好的,但一定是文檔最全的

2.在Linux上安裝Supervisor
#執行epel-release
sudo yum -y install epel-release

#安裝Supervisor
sudo yum -y install supervisor

#通過配置文件來啟動supervisor
sudo supervisord -c /etc/supervisord.conf

#啟動supervisorctl
sudo supervisorctl -c /etc/supervisord.conf

#查看supervisor 版本
Version

注意:需要執行supervisorctl,如果出現error: <class 'socket.error'>, [Errno 13] Permission denied: file: /usr/lib64/python2.7/socket.py line: 224的錯誤,需要先執行下面語句:
sudo supervisord -c /etc/supervisord.conf
sudo supervisorctl -c /etc/supervisord.conf

接下來開通supervisor的默認端口9001

 firewall-cmd --zone=public --add-port=9001/tcp --permanent
firewall-cmd --reload

開通supervisord.conf配置文件路勁中配置路勁的權限

touch /var/run/supervisor/supervisor.sock
chmod 777 /var/run/supervisor/supervisor.sock
chmod 777 /var/log/supervisor/supervisord.log
chmod 777 /var/run
chmod 777 /var/log
supervisorctl update
supervisorctl reload

 

3、創建.NET Core項目的Supervisor配置文件
#進入supervisord.d目錄
cd /etc/supervisord.d

#新建NetCore進程配置文件
sudo touch LokiCore.ini

#查看和編輯LokiCore.dll.ini配置文件
sudo vim LokiCore.ini

#進入文件后,按“i”或者“a”進入插入模式,插入下面的配置信息,配置程序名稱不能有特殊符號比如:.號,如果:EMS.Server.Api這肯定會錯,一定要編寫成:emsserverapi

#配置程序名稱
[program:LokiCore]
#運行程序的命令
command=dotnet LokiCore.dll --urls="http://*:8081;http://*:8082"
#命令執行的目錄
directory=/var/www
#進程環境變量
environment=ASPNETCORE_ENVIRONMENT=Production
#進程執行的用戶身份
user=demo
#進程停止信號,可以為TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信號默認為TERM 。當用設定的信號去干掉進程,退出碼會被認為是expected,非必須設置
stopsignal=INT
#如果是true的話,子進程將在supervisord啟動后被自動啟動,默認就是true,非必須設置
autostart=true
#這個是設置子進程掛掉后自動重啟的情況,有三個選項,false,unexpected和true。如果為false的時候,無論什么情況下,都不會被重新啟動,如果為unexpected,只有當進程的退出碼不在下面的exitcodes里面定義的退出碼的時候,才會被自動重啟。當為true的時候,只要子進程掛掉,將會被無條件的重啟
autorestart=true
#這個選項是子進程啟動多少秒之后,此時狀態如果是running,則我們認為啟動成功了,默認值為1 。非必須設置
startsecs=1
#錯誤日志文件
stderr_logfile=/var/log/DemoNetCore.err.log
#輸出日志文件
stdout_logfile=/var/log/DemoNetCore.out.log

 

touch alonsoadminapi.ini  建立文件

vim alonsoadminapi.ini  編輯文件

文件內容復制到alonsoadminapi.ini:

[program:alonsoadminapi]
command=dotnet AlonsoAdmin.HttpApi.dll --urls="http://*:8889"
directory=/var/AlonsoAdmin.Api/
environment=ASPNETCORE_ENVIRONMENT=Development
user=root
stopsignal=INT
autostart=true
autorestart=true
startsecs=1
stderr_logfile=/var/log/AlonsoAdmin.HttpApi.err.log
stdout_logfile=/var/log/AlonsoAdmin.HttpApi.out.log

 

############################################################

上述配置配置好后,請按下面操作執行:
#按ESC,輸入命令保存配置文件
:wq (保存編輯操作退出)
:wq! (保存編輯強制退出)
:w ! sudo tee %
注意:如果之前進入編輯文件沒有在root或者sudo下,使用wq,將會提示只讀,使用強制執行,使用wq!,將會提示E212:無法打開或寫入文件,這個時候需要用到w ! sudo tee %這個命令,然后在q退出編輯

添加了新配置文件后,一定要按以下順序來執行指令,新的子進程才會在supervisor的管理界面中呈現出來

之前習慣用reload 命令,這直接重啟supervisord進程,相當於重啟了所有supervisor程序。

supervisorctl reload

如果新添加了一個配置文件,此時update命令沒用了,要用reread命令,重新讀取配置文件。然后再update重啟

supervisorctl reread

 但是有時候只改動了某個配置文件,只想重載這個配置文件然后重啟,不影響其他配置文件。可以用update命令

supervisorctl update

supervisor配置文件詳解

- command:啟動程序使用的命令,可以是絕對路徑或者相對路徑
- process_name:一個python字符串表達式,用來表示supervisor進程啟動的這個的名稱,默認值是%(program_name)s
- numprocs:Supervisor啟動這個程序的多個實例,如果numprocs>1,則process_name的表達式必須包含%(process_num)s,默認是1
- numprocs_start:一個int偏移值,當啟動實例的時候用來計算numprocs的值
- priority:權重,可以控制程序啟動和關閉時的順序,權重越低:越早啟動,越晚關閉。默認值是999
- autostart:如果設置為true,當supervisord啟動的時候,進程會自動重啟。
- autorestart:值可以是false、true、unexpected。false:進程不會自動重啟,unexpected:當程序退出時的退出碼不是exitcodes中定義的時,進程會重啟,true:進程會無條件重啟當退出的時候。
- startsecs:程序啟動后等待多長時間后才認為程序啟動成功
- startretries:supervisord嘗試啟動一個程序時嘗試的次數。默認是3
- exitcodes:一個預期的退出返回碼,默認是0,2- stopsignal:當收到stop請求的時候,發送信號給程序,默認是TERM信號,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。
- stopwaitsecs:在操作系統給supervisord發送SIGCHILD信號時等待的時間
- stopasgroup:如果設置為true,則會使supervisor發送停止信號到整個進程組
- killasgroup:如果設置為true,則在給程序發送SIGKILL信號的時候,會發送到整個進程組,它的子進程也會受到影響。
- user:如果supervisord以root運行,則會使用這個設置用戶啟動子程序
- redirect_stderr:如果設置為true,進程則會把標准錯誤輸出到supervisord后台的標准輸出文件描述符。
- stdout_logfile:把進程的標准輸出寫入文件中,如果stdout_logfile沒有設置或者設置為AUTO,則supervisor會自動選擇一個文件位置。
- stdout_logfile_maxbytes:標准輸出log文件達到多少后自動進行輪轉,單位是KB、MB、GB。如果設置為0則表示不限制日志文件大小
- stdout_logfile_backups:標准輸出日志輪轉備份的數量,默認是10,如果設置為0,則不備份
- stdout_capture_maxbytes:當進程處於stderr capture mode模式的時候,寫入FIFO隊列的最大bytes值,單位可以是KB、MB、GB
- stdout_events_enabled:如果設置為true,當進程在寫它的stderr到文件描述符的時候,PROCESS_LOG_STDERR事件會被觸發
- stderr_logfile:把進程的錯誤日志輸出一個文件中,除非redirect_stderr參數被設置為true
- stderr_logfile_maxbytes:錯誤log文件達到多少后自動進行輪轉,單位是KB、MB、GB。如果設置為0則表示不限制日志文件大小
- stderr_logfile_backups:錯誤日志輪轉備份的數量,默認是10,如果設置為0,則不備份
- stderr_capture_maxbytes:當進程處於stderr capture mode模式的時候,寫入FIFO隊列的最大bytes值,單位可以是KB、MB、GB
- stderr_events_enabled:如果設置為true,當進程在寫它的stderr到文件描述符的時候,PROCESS_LOG_STDERR事件會被觸發
- environment:一個k/v對的list列表
- directory:supervisord在生成子進程的時候會切換到該目錄
- umask:設置進程的umask
- serverurl:是否允許子進程和內部的HTTP服務通訊,如果設置為AUTO,supervisor會自動的構造一個url

 


重新加載Supervisor配置,查看Supervisor運行的進程
#通過配置文件來啟動supervisor
sudo supervisord -c /etc/supervisord.conf

#啟動supervisorctl
sudo supervisorctl -c /etc/supervisord.conf

#重新加載配置文件
Supervisor># reload

#查看運行的狀態
Supervisor># status

4、配置Supervisor開機自啟動
#進入system目錄
cd /usr/lib/systemd/system

#編輯supervisord.service文件
sudo vim supervisord.service

supervisord.service文件內容如下

[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target

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

[Install]
WantedBy=multi-user.target
##################################################

一定要按照上述的配置寫入到配置文件中

編輯好后保存退出,然后執行命令,查看是否啟動成功
#啟動服務
systemctl enable supervisord

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

重啟Linux,然后直接訪問站點

6.Supervisor常用命令
# 啟動所有
supervisorctl start all

# 重啟所有
supervisorctl restart all

# 停止所有
supervisorctl stop all

#PS:要操作某個服務,把all換成服務名即可

#查看服務狀態
supervisorctl status

第五、防火牆配置,允許外網或局域網訪問.NET Core站點
1.先查看防火牆的狀態,然后開放之前.NET Core項目所用到的8081、8082端口,最后查看防火牆所開放的端口
#查看防火牆狀態
sudo firewall-cmd --state

#開放8081端口
sudo firewall-cmd --zone=public --add-port=8081/tcp --permanent

#開放8082端口
sudo firewall-cmd --zone=public --add-port=8082/tcp --permanent

#重啟防火牆
sudo firewall-cmd --reload

#查看防火牆開放的端口
sudo firewall-cmd --list-ports

部署成功的項目如圖

要能打開supervisor的管理界面需對/etc/supervisord.conf進行修改請查看鏈接

https://www.cnblogs.com/axinno1/p/14617780.html  最后一個配置來做修改,就能配置好

 


注意:--permanent,這里是永久的意思,如果沒有使用這個命令,重啟Linux系統后,防火牆策略將會消失

重啟Linux系統之后,在嘗試用Postman訪問站點,發現正常

2.防火牆常用命令
#關閉防火牆
systemctl stop firewalld.service

#開啟防火牆
systemctl start firewalld.service

#關閉開機自啟動
systemctl disable firewalld.service

#開啟開機自啟動
systemctl enable firewalld.service

#查看某個端口是否開啟
firewall-cmd --query-port=80/tcp

#查看防火牆狀態
firewall-cmd --state

#查看防火牆開放的端口
firewall-cmd --list-ports

#永久開放某個TCP端口
firewall-cmd --zone=public --add-port=80/tcp --permanent

#永久關閉某個TCP端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent

#永久開放某個UDP端口
firewall-cmd --zone=public --add-port=80/udp --permanent

#永久關閉某個UDP端口
firewall-cmd --zone=public --remove-port=80/udp --permanent

#批量添加區間端口
firewall-cmd --zone=public --add-port=8081-8082/tcp --permanent
firewall-cmd --zone=public --add-port=8081-8082/udp --permanent

本人按照流程來項目部署,結果成功


免責聲明!

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



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