Toggle navigation
首页
产品中心
全新RDIF.vNext低代码框架
镇店
.NET C/S开发框架
.NET Web敏捷开发框架
.NET 快速开发框架(全新EasyUI版本)
.NET 代码生成器
.NET WebAPI服务端开发框架
客户案例
付款方式
国思学堂
技术文章
新闻资讯
下载
关于
首页
技术文章
.NET(Core)
正文
原创
2021-01-21
浏览 (
10518
)
.NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)
> 在[.NET Core部署到linux(CentOS)最全解决方案,常规篇](http://www.guosisoft.com/article/detail/244)一文,我们详细讲解了传统的.NET Core部署到Linux服务器的方法,学到了Linux在虚拟机下的安装、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的发布与运行全过程。本文讲讲解通过使用Supervisor+Nginx的组合来实现.net core的高效部署。 ## 1、Supervisor ### 1.1、Supervisor介绍 官网:[http://supervisord.org](http://www.eryajf.net/go?url=http://supervisord.org),源码位置:[https://github.com/Supervisor/supervisor](https://github.com/Supervisor/supervisor) Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。 它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。 ### 1.2、为什么要用Supervisor 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。 此处的创建守护进程,是指发布在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主进程创建一个守护进程。在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。 原因有两点: > ①、它是微软官方文档推荐的,降低学习成本。 > ②、它并不一定是最好的,但一定是文档最全的。 ### 1.3、Supervisor4大组件 - supervisord > 主进程,负责管理进程的server,它会根据配置文件创建指定数量的应用程序的子进程,管理子进程的整个生命周期,对crash的进程重启,对进程变化发送事件通知等。同时内置web server和XML-RPC Interface,轻松实现进程管理。。该服务的配置文件在/etc/supervisor/supervisord.conf。 - supervisorctl > 客户端的命令行工具,提供一个类似shell的操作接口,通过它你可以连接到不同的supervisord进程上来管理它们各自的子程序,命令通过UNIX socket或者TCP来和服务通讯。用户通过命令行发送消息给supervisord,可以查看进程状态,加载配置文件,启停进程,查看进程标准输出和错误输出,远程操作等。服务端也可以要求客户端提供身份验证之后才能进行操作。 - Web Server > superviosr提供了web server功能,可通过web控制进程(需要设置[inethttpserver]配置项) - XML-R- #supervisor > 一个Linux/Unix系统上的进程监控工具 > 一个Python开发的通用的进程管理程序 > 可以管理和监控Linux上面的进程 > 能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启 > 不过同daemontools一样,它不能监控daemon进程 ### 1.4、安装Supervisor 相应安装建议以管理员方式登录系统,非管理员请以sudo命令安装。 > Linux sudo命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。 1、安装EPEL源的命令如下: ```shell sudo yum -y install epel-release ``` ![安装EPEL源](http://doc.rdiframework.net/rdiblog/20210116103752.png) 2、执行如下命令安装supervisor: ```shell sudo yum -y install supervisor ``` ![安装supervisor](http://doc.rdiframework.net/rdiblog/20210116103800.png) 3、设置开机启动: ```shell systemctl enable supervisord ``` ![设置开机启动](http://doc.rdiframework.net/rdiblog/20210116103804.png) 4、启动supervisord ```shell systemctl start supervisord ``` 5、查看supervisord状态 ```shell systemctl status supervisord ``` ![查看supervisord状态](http://doc.rdiframework.net/rdiblog/20210116103809.png) ### 1.5、Supervisor配置及使用 通过vi命令或者xftp修改配置文件开启web界面访问,如下图所示,分别取消inet_http_server等四个配置的注释: ```shell vi /etc/supervisord.conf ``` ![image-20210114101415192](http://doc.rdiframework.net/rdiblog/20210116103812.png) 执行如下命令,重新加载配置文件: ```shell supervisorctl reload ``` 然后在浏览器打开http://你的ip:9001,输入上面我们设置的用户名:user1,密码:123456后,如图所示: ![image-20210114101622234](http://doc.rdiframework.net/rdiblog/20210116103816.png) ![image-20210114101825812](http://doc.rdiframework.net/rdiblog/20210116103822.png) 看到上图这个界面,就表示supervisor安装完成了。 切换到/etc/supervisord.d目录,在此目录创建名称为:core50test.ini的ini文件,内容如下: ```ini #表示程序名称,用于在supervisor中显示,无特殊意义。 [program:core50test] # 输入执行命令,这里表示执行的是dotnet Core50Test.dll command=/bin/bash -c "dotnet Core50Test.dll" # 应用程序根目录 directory=/root/app_data/core50test/publish # 是否自动启动,当 supervisor 加载该配置文件的时候立即启动它 autostart=true # 是否自动重启, 程序异常退出后自动重启 autorestart=true # 该配置文件输出单个日志文件的大小,默认50M logfile_maxbytes=50MB # 日志备份个数 logfile_backups=10 # 记录日志级别 loglevel=info # 指定标准输出日志文件 stdout_logfile=/root/app_data/data/logs/core50test/core50test.out.log # 环境变量 environment=ASPNETCORE_ENVIRONMENT=Production # 启动服务的用户 user=root # 把stderr重定向到stdout,默认 false redirect_stderr=true ``` 上述代码包含了注释信息,参考精減版配置如下: ```ini [program:core50test] command=/bin/bash -c "dotnet Core50Test.dll" directory=/root/app_data/core50test/publish autostart=true autorestart=true logfile_maxbytes=50MB logfile_backups=10 loglevel=info stdout_logfile=/root/app_data/data/logs/core50test/core50test.out.log environment=ASPNETCORE_ENVIRONMENT=Production user=root redirect_stderr=true ``` **注意**:stdout_logfile指向的文件夹一定要先创建,否则无法启动,上述配置文件中的内容需要根据用户实际情况修改,如我当前登录的用户是:**yonghu**,你们是其他的就做相应的修改即可。 然后执行如下命令来重新加载配置: ```shell supervisorctl reload ``` 命令执行成功后, 刷新浏览器,可以看到如下界面: ![supervisor正在运行的应用](http://doc.rdiframework.net/rdiblog/20210116103833.png) 当界面显示running时,则表示我们我们刚刚配置的.net core应用运行起来了。 如下图所示。 ![image-20210114150451949](http://doc.rdiframework.net/rdiblog/20210116103839.png) 我们可以方便的通过supervisor提供的web管理界面对我们的应用进行启动与停止,查看日志等操作,非常的方便,丝般润滑般的爽呀。 ![Supervisor启动与停止应用](http://doc.rdiframework.net/rdiblog/20210116103844.png) 查看日志: ![查看日志](http://doc.rdiframework.net/rdiblog/20210116103848.png) ### 1.6、Supervisor常用命令 ```shell ### 查看supervisorctl支持的命令 # supervisorctl help default commands (type help <topic>): ===================================== add exit open reload restart start tail avail fg pid remove shutdown status update clear maintail quit reread signal stop version ### 查看当前运行的进程列表 # supervisorctl status ``` ![Supervisor常用命令](http://doc.rdiframework.net/rdiblog/20210116103854.png) - update 更新新的配置到supervisord(不会重启原来已运行的程序) - reload,载入所有配置文件,并按新的配置启动、管理所有进程(会重启原来已运行的程序) - start xxx: 启动某个进程 - restart xxx: 重启某个进程 - stop xxx: 停止某一个进程(xxx),xxx为[program:theprogramname]里配置的值 - stop groupworker: 重启所有属于名为groupworker这个分组的进程(start,restart同理) - stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文 - reread,当一个服务由自动启动修改为手动启动时执行一下就ok 最常用的几个命令为: ```shell #启动所有 supervisorctl start all # 重启所有 supervisorctl restart all # 停止所有 supervisorctl stop all #PS:要操作某个服务,把all换成服务名即可 #查看服务状态 supervisorctl status ``` ## 2、使用Nginx 在前面文章中,我们已经可以非常方便的对web应用进行部署与管理了,但还存在一个问题,我们的应用程序默认是绑定的5000端口,如果要指定80端口或者配置域名该怎么处理呢?下面就该nginx登场了。 ### 2.1、Nginx介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。 ### 2.2、Nginx安装 安装方式参考:http://nginx.org/en/linux_packages.html#RHEL-CentOS 安装先决条件: ``` sudo yum install -y yum-utils ``` ![安装yum-utils](http://doc.rdiframework.net/rdiblog/20210116103858.png) 设置yum存储库,先创建一下内容的文件:/etc/yum.repos.d/nginx.repo ```shell [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true ``` ![image-20210114161247091](http://doc.rdiframework.net/rdiblog/20210116103902.png) 默认情况下,使用稳定 nginx 包的存储库。如果要使用主线 nginx 包,请运行以下命令: ```shell yum-config-manager --enable nginx-mainline ``` 运行如下命令安装nginx: ```shell sudo yum install -y nginx ``` ![安装nginx](http://doc.rdiframework.net/rdiblog/20210116103904.png) 设置开机启动: ```shell systemctl enable nginx ``` 启动nginx: ```shell systemctl start nginx ``` ![设置nginx开机启动并启动nginx](http://doc.rdiframework.net/rdiblog/20210116103908.png) 此时,就可以在浏览器通过ip访问了:[http://你的ip](http://xn--ip-0p3cm89l/),界面如下: ![nginx启动界面](http://doc.rdiframework.net/rdiblog/20210116103911.png) ### 2.3、Nginx部署 nginx安装完成后,切换到/etc/nginx/conf.d目录,修改default.conf文件内容,如下所示: ``` server { listen 80; server_name localhost; location / { proxy_pass http://0.0.0.0:5000; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } ``` 保存后,执行如下命令,重新加载配置: ``` nginx -s reload ``` 然后再次访问http://你的ip,一切正常的话应该可以看到如下的界面,表示我们的.NET Core程序已经完美运行在linux系统了。 ![以nginx方式运行](http://doc.rdiframework.net/rdiblog/20210116103914.png) 如果部署后遇到类型下面这样的错误 ![502网关错误](http://doc.rdiframework.net/rdiblog/20210116103937.png) 出现这样的问题,有可能的是因为SeLinux的限制,执行如下命令之后,再刷新页面: ``` setenforce 0 ``` > selinux(security enhanced linux)安全增强型linux系统,它是一个linux内核模块,也是linux的一个安全子系统。 > > selinux的主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则) 如果设置后还是不能解决,可以查看nginx的日志了,默认的日志路径为:/var/log/nginx 通过**setenforce 0**命令,只是临时实效,重启后会失效。 可以通过修改/etc/selinux/config 文件,将**SELINUX=enforcing改为SELINUX=disabled**,然后重启,即可永久生效。 ![image-20210114181544503](http://doc.rdiframework.net/rdiblog/20210116103945.png) 通过近两篇文章的介绍,我们需要更新应用,只需要将代码提交到git仓库,然后在服务器中执行git pull和dotnet publish即可。 如果熟悉shell的话,可以通过编写shell命令一键执行应用程序的更新,代码示例: ```shell # !/bin/bash cd /root/app_data/source/core50test git pull dotnet publish -o /root/app_data/core50test/publish supervisorctl restart core50test ``` 将上述的代码保存为sh文件,上传到服务器,并设置权限。如下图所示: ![image-20210115155730265](http://doc.rdiframework.net/rdiblog/20210116103949.png) 代码提交到git仓库后,执行如下命令: ``` ./build.sh ``` 执行结果如下图所示: ![shell教本部署](http://doc.rdiframework.net/rdiblog/20210116103954.png) 更新后重新运行,已经更新。 ![image-20210115113537048](http://doc.rdiframework.net/rdiblog/20210116103958.png) 这儿可能有的小伙伴会遇到一个小小的坑要注意,shell脚本写得没有问题,执行会报类似这样的错误 ```shell $'\r':command not found ``` 出现这种问题是因为windows下的文件换行用的是\r\n,而linux系统用的是\n,如果在win下的文档上传到linux,就有可能出现这样的问题,只需用vi打开shell脚本文件,然后使用命令:set ff=unix,保存文件即可。 ![shell命令 unix格式设置](http://doc.rdiframework.net/rdiblog/20210116104002.png) supervisor一个作为守护线程,用于维护应用程序的生命周期的,nginx则是作为反向代理使用,配置shell可以做到高效部署,非常的方便。 ----- 一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。 RDIFramework.NET官方网站:[http://www.rdiframework.net/](http://www.rdiframework.net/) [http://www.guosisoft.com/](http://www.guosisoft.com/) 特别说明,框架相关的技术文章请以官方网站为准,欢迎大家收藏! RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用! 欢迎关注RDIFramework.NET框架官方微信公众号(微信号:**guosisoft**),及时了解最新动态。 使用微信扫描二维码立即关注 ![微信号:**guosisoft**](http://doc.rdiframework.net/weixin.png)
正文到此结束
本文标签:
.NetCore
RDIF.NET
常用工具
版权声明:
本站原创文章,由
guosisoft.com
发布,遵循
CC 4.0 by-sa
版权协议,转载请附上原文出处链接和本声明。
上一篇
.NET Core部署到linux(CentOS)最全解决方案,常规篇
下一篇
.NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)
热门推荐
{{article.title}}
热门指数:
浏览({{article.lookCount + 5000}})
相关文章
{{article.title}}
该篇文章的评论功能暂时被站长关闭
说给你听
本文目录
文章标签
RDIF.NET
其他
微信开发
.NET
消息交互
.NetCore
项目管理
常用工具
工作流
Web前端
数据库
挨踢业界
随机文章
RDIFramework.NET WinForm版新增报表管理功能模块
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->用户管理模块新增“重置用户密码”功能
干货|工作中要使用Git,看这篇文章就够了
史上最全面的SignalR系列教程-目录汇总
git用.gitignore忽略指定文件
压缩文本、字节或者文件的压缩辅助类-GZipHelper 欢迎收藏
8 种主流数据迁移工具技术选型
企业数字化转型如何做?看过来
js+query将金额转换为大写格式
RDIFramework.NET V3.3 WinForm版新增日程管理功能模块
信息系统项目管理系列之九:项目质量管理
一网打尽,一文讲通虚拟机VirtualBox及Linux使用
微信公众号开发C#系列-6、消息管理-普通消息接受处理
微信公众号开发C#系列-2、微信公众平台接入指南
原创企业级控件库之大数据量分页控件
微信公众号开发系列-玩转微信开发-目录汇总
RDIFramework.NET开发框架编码管理助力业务编码的自动处理
.NET快速信息化系统开发框架 V3.2 新增解压缩工具类ZipHelper
RDIFramework.NET V2.9版本多语言的实现
ORACLE常见问题一千问[201至300](不怕学不成、就怕心不诚!)
网站信息
文章总数:599 篇
标签总数:8 个
分类总数:8 个
留言数量:1385 条
在线人数:
89
人
运行天数:1321天
最后更新:2023-05-18
QQ:406590790
13005007127