• 由于需要,最近在调试linux下部署.NetCore项目,所以在此记录一下

一、.NETCore3.1 环境安装以及运行测试

  • 直接运行
    1
    ~$ sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
    1
    ~$ 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

    1
    2
    3
    4
    5
    6
    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

新建一个配置文件,具体配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
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:

1
2
yum install python-setuptools|
easy_install supervisor

2.2.2 配置 Supervisor

Supervisor加载默认配置:

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

打开supervisord.conf文件,可以看到一个样例配置,我们需要简单修改一下。

尾部找到如下文本片段:

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

改为:

1
2
[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内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[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/目录。

脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[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

设置开启启动:

1
systemctl enable supervisor

验证是否成功:

1
systemctl is-enabled supervisor

如果输出enabled则表示设置成功,也可重启服务器验证

2.2.4 supervisor默认web配置

1
vim /etc/supervisor/supervisord.conf
1
2
3
4
[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/目录下方便理解
    /usr/jexus
    1
    2
    wget https://linuxdot.net/down/jexus-6.2.x-x64.tar.gz
    tar zxvf jexus-6.2.x-x64.tar.gz

3.2 jexus配置文件

1
2
[root@slave2 ~]# cd siteconf/                    #进入配置文件目录
[root@slave2 siteconf ~]# vim web #新建一个配置文件名为web,并进行编辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
######################
# 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

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

进入本地域名查看,成功运行

3.3 jexus设置开机启动

  • 1.新建 jexus.service
    1
    2
    cd /lib/systemd/system
    vim jexus.service
    添加如下配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [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