ASP.NET Core教程:使用Supervisor做ASP.NET Core应用程序守护进程
一、前言
在上一篇文章中,我们讲解了如何在Linux服务器上面部署ASP.NET Core应用程序,并且使用Nginx作为反向代理。我们在Linux服务器上面,是通过ASP.NET Core自宿主的方式运行应用程序。采用自宿主的方式启动ASP.NET Core应用程序,目前主要有以下几个问题:
- ASP.NET Core应用程序运行在shell会话之中,如果关闭shell会话窗口则会发现ASP.NET Core应用也会被关闭,从而导致应用无法访问,在生产环境中对这种情况是零容忍的。
- 如果ASP.NET Core进程意外终止,那么需要人为连接shell进行再次启动,往往这种操作都不够及时。
- 如果服务器宕机或者需要重启,我们还是需要手动连接shell进去启动ASP.NET Core程序
为了解决上面的几个问题,所以我们需要有一个程序来监听ASP.NET Core应用程序的状况,当应用程序停止运行的时候会立即重新启动。
二、Supervisor
Supervisor就是这样一个用来监听ASP.NET Core应用程序运行状况的工具,它是用Python开发的一个client/server服务,是linux/Unix系统下的一个进程管理工具,不支持Windows系统,它能将一个普通的命令行进程变为后台deamon,并监控进程状态。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,Supervisor监听到进程死后,会自动重启进程,很方便的做到进程自动恢复的功能,不在需要自己写shell脚本来控制。下面我们就来看看如何在Linux上面安装Supervisor。
1、安装Python包管理工具
使用下面的命令安装Python包管理工具:
yum install python-setuptools
如下图所示:

2、安装Supervisor
使用下面的命令安装Supervisor:
easy_install supervisor
如下图所示:

3、配置Supervisor应用守护
通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件,命令如下:
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
如下图所示:

然后我们编辑supervisord.conf文件,在文件的尾部添加如下配置:
;conf.d 为配置表目录的文件夹,需要手动创建
[include]
files = /etc/supervisor/conf.d/*.conf
如下图所示:

然后我们手动创建一个conf.d文件夹:
mkdir /etc/supervisor/conf.d
如下图所示:

创建完成后的目录结构如下图:

supervisord.conf是主配置文件,应用程序配置文件放在conf.d文件夹下面。然后为应用程序创建一个名为AspNetCoreDeployDemo.conf的文件,并放到目录"/etc/supervisor/conf.d/"下,文件内容:
[program:AspNetCoreDeployDemo] ;程序名称,终端控制时需要的标识
command=dotnet AspNetCoreDeployDemo.dll ; 运行程序的命令
directory=/root/NetCore/FDD/ ; 命令执行的目录
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/AspNetCoreDeployDemo.err.log ; 错误日志文件
stdout_logfile=/var/log/AspNetCoreDeployDemo.out.log ; 输出日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT
startsecs=10 ;自动重启时间间隔
执行下面的命令运行supervisord,查看是否生效:
supervisord -c /etc/supervisor/supervisord.conf
ps -ef | grep AspNetCoreDeployDemo
成功后的效果:

这时我们在浏览器里面访问:

这样就可以访问了。可以看到,这时我们就不需要在启动命令行了。而且关闭shell窗口也可以获取数据。
如果服务已经启动,修改配置文件可用“supervisorctl reload”命令来使其生效。
4、配置Supervisor开机启动
我们新建一个“supervisord.service”文件,文件内容如下:
# dservice for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon [Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=15s [Install]
WantedBy=multi-user.target
将文件上传至"/usr/lib/systemd/system/"目录下,然后执行下面的命令:
systemctl enable supervisord
如下图所示:

执行下面的命令来验证是否为开机启动:
systemctl is-enabled supervisord
如下图所示:

到此为止,配置就完成了。我们可以重启虚拟机来验证一下是否开机就会启动应用程序。这里已经测试过了,重启虚拟机,然后用root用户登录就可以直接访问应用程序。
我们还可以使用Web管理界面来管理supervisor,在web管理界面,可以进行进程的重启,日志查看等操作。
web界面操作需要在supervisor的配置文件里添加[inet_http_server]选项组,我们使用记事本文件打开supervisord.conf文件,去掉[inet_http_server]选项组前面的";":

修改之后重新加载服务:
supervisorctl reload
如下图所示:

由于使用了9001端口,所以我们需要把9001端口添加到防火墙中:
firewall-cmd --zone=public --add-port=9001/tcp --permanent
如下图所示

修改完防火墙之后需要重启防火墙配置:
firewall-cmd --reload

然后在浏览器里面访问url:http://192.168.254.128:9001/,如果配置正常,则会要去输入用户名和密码,输入配置文件里面的用户名和密码即可登录,登录成功以后界面如下所示:

在这里就可以看到正在运行的进程,而且还可以重启、停止等操作。
三、总结
Supervisor常用的相关命令如下:
supervisorctl restart <application name> ;重启指定应用
supervisorctl stop <application name> ;停止指定应用
supervisorctl start <application name> ;启动指定应用
supervisorctl restart all ;重启所有应用
supervisorctl stop all ;停止所有应用
supervisorctl start all ;启动所有应用
如果在执行命令的过程中,报下面的错误:
Error: .ini file does not include supervisorctl section
For help, use /usr/local/bin/supervisorctl -h
如截图这样:

需要切换到/etc/supervisor目录在执行上面的命令。
ASP.NET Core教程:使用Supervisor做ASP.NET Core应用程序守护进程的更多相关文章
- ASP.NET Core教程【二】从保存数据看特有属性与服务端验证
前文索引: 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" class="navbar-brand" ...
- ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证
前文索引:ASP.NET Core教程[一]关于Razor Page的知识 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 编辑表单 上一章节我们介绍了标签助手和 HT ...
- ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF 框架服务 上一章节中我们了解了 Entity ...
- ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 异常和错误处理 上一章节中,我们学习了 ASP.NET Cor ...
- 003.ASP.NET Core tutorials--【Asp.net core 教程】
ASP.NET Core tutorials Asp.net core 教程 2016-10-14 1 分钟阅读时长 本文内容 1.Building web applications 构建web应用 ...
- ASP.NET Core教程【三】实体字段属性、链接标签、并发数据异常、文件上传及读取
前文索引:ASP.NET Core教程[二]从保存数据看Razor Page的特有属性与服务端验证ASP.NET Core教程[一]关于Razor Page的知识 实体字段属性 再来看看我们的实体类 ...
- ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用
一.前言 1.本文主要内容 使用dotnet cli创建基于解决方案(sln+csproj)的项目 使用Visual Studio Code开发基于解决方案(sln+csproj)的项目 Visual ...
随机推荐
- Python 操作 MySQL 的5种方式
不管你是做数据分析,还是网络爬虫,Web 开发.亦或是机器学习,你都离不开要和数据库打交道,而 MySQL 又是最流行的一种数据库,这篇文章介绍 Python 操作 MySQL 的5种方式,你可以在实 ...
- MySQL数据库性能优化该如何入手
今天小杨给大家分享一篇关于数据库查询优化,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情. ...
- C语言:强制类型转换
#include <stdio.h> //强制类型转换 //写法:(类型标识符)变量:(类型标识符)常量:(类型标识符)(表达式):三种格式 main() { float a=7.5f; ...
- c++ 进制转换源代码
#include<stdio.h> int main() { char ku[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C ...
- 【redis前传】redis整数集为什么不能降级
前言 整数集合相信有的同学没有听说过,因为redis对外提供的只有封装的五大对象!而我们本系列主旨是学习redis内部结构.内部结构是redis五大结构重要支撑! 前面我们分别从redis内部结构分析 ...
- 家庭账本开发day09
编写数据表格的编辑操作,大体思路和删除操作一样 点击按钮,弹出修改项目,从父窗口获取已有的值赋给 弹出的子窗口中相应的值,在子窗口中点击提交,ajax请求 servlet修改.成功后重载表格,或者up ...
- Python3 MySQL 数据库连接 - PyMySQL 驱动
什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 AP ...
- 微信小程序云开发-云函数-创建云函数
一.检查云函数环境 检查云函数环境时候,鼠标右键点击查看当前环境.如果存在多个云开发环境,要确保云函数的当前环境要与app.js中evn的环境值一致. 如果不一致,则鼠标右键切换当前云开发环境.(如果 ...
- Spring 学习笔记(2) Spring Bean
一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...
- 每天五分钟Go - Map
map的定义 var m map[type]type fmt.Println(m) 此种方法定义的m为nil //打印的结果为: map[] map的创建 1.使用make创建 var m1 = ma ...