- 由於需要,最近在調試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 --info
或dotnet --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安裝
- 首先添加Centos7 yum epel源
[root@slave1 ~]# sudo yum -y install epel-release
- yum安裝Nginx
[root@slave1 ~]# sudo yum install nginx
- 運行Nginx
[root@slave1 ~]# sudo systemctl start nginx
- 驗證是否開啟
[root@slave1 ~]# ps -ef | grep nginx
- 訪問ip驗證一下,我這里是默認的centos靜態頁,說明沒有問題
- 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官網:https://www.jexus.org/
-
簡單介紹一下Jexus
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的優點:
-
支持多站點,同一端口可以同時支持任何多的asp.net core應用程序;
-
應用程序啟動、停止、重啟與站點的啟動、停止、重啟等操作一致,無需手工管理asp.net core應用程序;
-
具有應用程序崩潰后自動重啟功能,為企業級不間斷運行保障;
-
提供與IIS相同的HTTP環境參數。
-
具有比反向代理更高的性能優勢。
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