Linux下Supervisor和Jexus兩種方式部署.NETCore3.1項目


  • 由於需要,最近在調試linux下部署.NetCore項目,所以在此記錄一下

一、.NETCore3.1 環境安裝以及運行測試

  • 直接運行
~$ sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
~$ sudo yum install dotnet-sdk-3.1
  • 驗證一下:

dotnet --infodotnet --version

.NETCore3.1環境安裝具體內容可翻看以前文章 https://www.cnblogs.com/shook/p/11639799.html

之后我們運行測試一下我們的.NETCore項目是否可以在本地運行起來

  • 我這里是一個准備好的.NetCore3.1的web項目,可以看到項目文件為web.csporj

  • 我們進入項目的目錄,是未編譯過的源代碼,可以用dotnet run或dotnet run 項目名.csporj 來運行項目方便查看

  • dotnet run的官方解釋:dotnet run - 無需任何顯式編譯或啟動命令即可運行源代碼。

  • 具體的dotnet所有命令可以參考官方文檔:https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-run

  • 這里啟動的是本地的,記得開放端口或安全策略

  • 如果程序沒問題可以跳過dotnet build 直接用dotnet publish命令來進行打包編譯生成發布文件用來部署

dotnet publish web.csproj --configuration Release -o /wwwroot/web/publish

  • 我這里是放到另一個目錄下方便管理,進入編譯后的目錄

  • 可以看到目錄已生成 web(項目名).dll

  • 我們直接運行 dotnet web(項目名).dll

crit: Microsoft.AspNetCore.Server.Kestrel[0]
      Unable to start Kestrel.
System.IO.IOException: Failed to bind to address http://127.0.0.1:5000: address already in use.
 ---> Microsoft.AspNetCore.Connections.AddressInUseException: Address already in use
 ---> System.Net.Sockets.SocketException (98): Address already in use
...............

如果出現以上報錯,說明端口占用,使用以下命令指定端口運行即可

dotnet web.dll --urls=http://localhost:5010

我們的項目到這就起來了,但是我們的項目有的是部署在雲服務器上的,不能直接瀏覽,而且dotnet的命令退出項目就無法啟動了,那我們可以用以下三種方式其中一種來進行.NetCore在Linux下的部署,其中第二種supervisor進程管理是需要Nginx來進行的,如沒有Nginx或者不需要Nginx的請跳到第三種方式,個人建議用第三種jexus方式,supervisor配置的比較多略麻煩

二、supervisor進程管理.NetCore,web默認管理界面

2.1 Nginx安裝以及配置配置反向代理

我們在上面用dotnet命令啟動指定的端口是5010,我們需要把啟動的5010端口映射到Nginx上80等端口

nginx的介紹這里就不介紹了,這里只介紹Nginx的安裝以及反向代理配置

2.1.1 Nginx安裝
  1. 首先添加Centos7 yum epel源
    [root@slave1 ~]# sudo yum -y install epel-release
  2. yum安裝Nginx
    [root@slave1 ~]# sudo yum install nginx
  3. 運行Nginx
    [root@slave1 ~]# sudo systemctl start nginx
  4. 驗證是否開啟
    [root@slave1 ~]# ps -ef | grep nginx

  1. 訪問ip驗證一下,我這里是默認的centos靜態頁,說明沒有問題

  1. Nginx設置開機啟動

[root@slave1 ~]# systemctl enable nginx

  • 如果訪問錯誤可查看端口是否開放,防火牆是否關閉,等Nginx的這些操作百度查一下,這里不再贅述
2.1.2 Nginx反向代理配置
  • 進入Nginx 的配置加載目錄 [root@slave1 ~]# cd /etc/nginx/conf.d

新建一個配置文件,具體配置文件如下

    {
        listen 9870;							# 監聽端口:使用域名的話為80
        server_name 192.168.105.191;					# IP地址,或者服務器綁定域名,在hosts做一個本地域名也可以,這里就不做演示了
        index index.html index.htm index.php;			        # 入口文件,可不填
        root  /www/wwwroot/publish/web/wwwroot;				# 運行目錄 .NetCore web項目需要把項目目錄指向到wwwroot目錄

        location / {
          proxy_pass http://localhost:5010;				# 本地需要代理的地址
        }								# 以下配置如不需要可忽略
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /www/wwwlogs/access.log;
    }

Nginx配置完成后執行命令nginx -s reload重載配置,使其生效
按照第一步的方法現在可以運行項目即可看到項目頁面

2.2 Supervisor 配置守護進程

Supervisor 是用 Python 開發的 Linux/Unix 系統下的一個進程管理工具。它可以使進程脫離終端,變為后台守護進程(daemon)。實時監控進程狀態,異常退出時能自動重啟。

Supervisor 不支持任何版本的 Window 系統;僅支持在 Python2.4 或更高版本,但不能在任何版本的 Python 3 下工作。

其主要組成部分:

supervisord:Supervisor 的守護進程服務,用於接收進程管理命令;

supervisorctl:Supervisor 命令行工具,用於和守護進程通信,發送管理進程的指令;

Web Server:Web 端進程管理工具,提供與 supervisorctl 類似功能,管理進程;

XML-RPC Interface:提供 XML-RPC 接口,請參閱 XML-RPC API文檔。

2.2.1 安裝 Supervisor

官方推薦安裝方法是使用easy_install,所以先執行如下命令安裝 setuptools:

yum install python-setuptools|
easy_install supervisor

2.2.2 配置 Supervisor

Supervisor加載默認配置:

mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf

打開supervisord.conf文件,可以看到一個樣例配置,我們需要簡單修改一下。

尾部找到如下文本片段:

;[include]
;files = relative/directory/*.ini

改為:

[include]
files = conf.d/*.conf

設置/etc/supervisor/conf.d為 Supervisor 進程配置文件加載目錄

這樣,Supervisor 會自動加載該目錄下.conf后綴的文件作為共同服務配置。Supervisor 管理的每個進程單獨寫一個配置文件放在該目錄下,supervisord.conf配置文件中保留公共配置。

創建進程配置加載目錄:
mkdir /etc/supervisor/conf.d
接下來就需要為我們已經部署的 ASP .NET Core 程序的宿主進程創建一個進程配置文件web.conf,保存並上傳到/etc/supervisor/conf.d目錄。

配置文件web.conf內容如下:

[program:web]                 		                                        ;自定義名稱
command=dotnet web.dll 		 		                                ;程序啟動命令
directory=/www/wwwroot/publish/web		 		                ;命令執行的目錄
autostart=true 								        ;是否自啟動
autorestart=true 								;程序退出后自動重啟
startretries=5       							        ;啟動失敗自動重試次數,默認是3
startsecs=1 									;自動重啟間隔
user=root   							                ;設置啟動進程的用戶,默認是root
priority=999         							        ;進程啟動優先級,值小的優先啟動
stderr_logfile=/var/log/Scorpio.WebApi.err.log                                  ;錯誤日志
stdout_logfile=/var/log/Scorpio.WebApi.out.log                                  ;輸出日志
environment=ASPNETCORE_ENVIRONMENT=Production                                   ;進程環境變量
stopsignal=INT								        ;請求停止時用來殺死程序的信號

啟動 Supervisor 服務,命令如下:

supervisord -c /etc/supervisor/supervisord.conf

2.2.3 Supervisor 開機啟動

首先為 Supervisor 新建一個啟動服務腳本supervisor.service然后保存並上傳至服務器/usr/lib/systemd/system/目錄。

腳本內容如下:

[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

[Install]
WantedBy=multi-user.target

設置開啟啟動:

systemctl enable supervisor

驗證是否成功:

systemctl is-enabled supervisor

如果輸出enabled則表示設置成功,也可重啟服務器驗證

2.2.4 supervisor默認web配置

vim /etc/supervisor/supervisord.conf
[inet_http_server]        
port=192.168.0.1:8989    
username=admin             
password=admin

有需要配置Web統一管理界面cesi的可以參考如下文章,

https://www.jianshu.com/p/d655d8cd67bb,
https://blog.csdn.net/acherson/article/details/101443310?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1

我的python環境沖突就不在此演示了

三、Jexus部署.NetCore

如果之前安裝了Supervisor 需要將其停止,再把開機啟動禁止,禁用開機啟動命令:systemctl disable supervisord ,查看是否為開機啟動命令:systemctl is-enabled supervisord

Jexus 即 Jexus Web Server,簡稱JWS,是Linux平台上 的一款ASP.NET WEB服務器。它是 Linux、Unix、FreeBSD 等非Windows系統架設 ASP.NET WEB 服務器的核心程序。

將HTTP自宿主應用程序(如Asp.net Core應用程序、Node.js應用程序等)統一納入Jexus的工作進程序列進行管控(啟動、停止、重啟、崩潰后自動恢復等管理、監控功能),為Asp.Net Core應用程序進入企業化生產環境提供了強有力的平台保障。使用 jexus整合asp.net core的優點:  

  1. 支持多站點,同一端口可以同時支持任何多的asp.net core應用程序;

  2. 應用程序啟動、停止、重啟與站點的啟動、停止、重啟等操作一致,無需手工管理asp.net core應用程序;

  3. 具有應用程序崩潰后自動重啟功能,為企業級不間斷運行保障;

  4. 提供與IIS相同的HTTP環境參數。

  5. 具有比反向代理更高的性能優勢。

3.1 安裝jexus獨立版(2020.04已更新到6.2.x版本)

有兩種安裝方式:

  • 1是使用官方自動安裝腳本:

[root@slave2 ~]# curl https://jexus.org/release/x64/install.sh|sudo sh

安裝完成的目錄地址為/usr/jexus

若提示沒有Wget,手動yum install wget -y即可

  • 2是使用手動安裝,可以自定義目錄,我們這里也安裝到/usr/lexus/目錄下方便理解
wget https://linuxdot.net/down/jexus-6.2.x-x64.tar.gz
tar zxvf jexus-6.2.x-x64.tar.gz

3.2 jexus配置文件

[root@slave2 ~]# cd siteconf/                    #進入配置文件目錄
[root@slave2 siteconf ~]# vim web                #新建一個配置文件名為web,並進行編輯
######################
# Web Site: web 
########################################
																				
port=80						# 監聽端口:使用域名的話為80
root=/ /www/wwwroot/publish/web/wwwroot		# 運行目錄 .NetCore web項目需要把項目目錄指向到wwwroot目錄,不支持虛擬目錄
hosts=web.test.com				# 服務器綁定域名,在hosts做一個本地域名也可以,也可以是IP地址,這里就不做演示了
# User=www-data

# AspNet.Workers=2  # Set the number of asp.net worker processes. Defauit is 1.

# addr=0.0.0.0
# CheckQuery=false
# NoLog=true
																				                
AppHost={                                        # 新建AppHost配置
  cmd=dotnet /www/wwwroot/publish/web/web.dll;	 # 進行dotnet 項目名.dll運行操作
  root=/www/wwwroot/publish/web/; 	         # 項目的工作目錄
  # port=5001					 # 可選項。表示這個應用程序的偵聽端口,多個端口用英文逗號分隔
  #OutLog=/log/out.txt;				 # OutLog:可選項。表示將這個應用程序的控制台輸出重定向到指定的文件(需填寫完整路徑);
  #ErrLog=/log/out.txt;		                 # ErrLog:可選項。表示將這個應用程序的異常輸出重定向到指定的文件(需填寫完整路徑),如果不原意輸出日志,可以不用OutLog項。這時, jexus會自動關掉控制台輸出
  }

確保配置和項目文件無誤后,進入目錄運行jexus

[root@slave2 ~]#  cd /usr/jexus
[root@slave2 jexus]# sudo ./jws start
 ... OK.

進入本地域名查看,成功運行

3.3 jexus設置開機啟動

  • 1.新建 jexus.service
cd /lib/systemd/system
vim jexus.service

添加如下配置

[Unit]
Description=jexus
After=network.target
[Service]
Type=forking
ExecStart=/usr/jexus/jws start
ExecReload=/usr/jexus/jws restart
ExecStop=/usr/jexus/jws stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target

jexus加入服務: systemctl enable jexus.service

啟動jexus服務: systemctl start jexus.service

查看jexus服務狀態: systemctl status jexus.service

reboot執行重啟測試一下,看到站點啟動即成功

相比supervisor對比,jexus更加便捷方便部署,日志的部分配置上即可查看,這里也就不表了

四、Linux下.Netcore跨平台其他方式部署

還有pm2方式來進行部署,我以前使用pm2來進行部署vue的項目,感覺十分好用,比Supervisor方便配置本來想寫上pm2的部署方式,想起來看過曉晨寫過pm2守護.NETCore的相關文章特別詳細,
所以有需要的傳送門:https://www.cnblogs.com/stulzq/p/9775973.html

還有systemctl構建后台服務等方式,根據自己情況選一種適合自己即可

相關資料:https://www.cnblogs.com/esofar/p/8043792.html#2535191668


免責聲明!

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



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