- 由于需要,最近在调试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