.NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)

.NET快速开发框架 2021-01-21 11:32:41
linux CentOS Core 部署 最全


.NET Core部署到linux(CentOS)最全解决方案,常规篇一文,我们详细讲解了传统的.NET Core部署到Linux服务器的方法,学到了Linux在虚拟机下的安装、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的发布与运行全过程。本文讲讲解通过使用Supervisor+Nginx的组合来实现.net core的高效部署。

1、Supervisor

1.1、Supervisor介绍

官网:http://supervisord.org,源码位置: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源的命令如下:

sudo yum -y install epel-release

安装EPEL源

2、执行如下命令安装supervisor:

sudo yum -y install supervisor

3、设置开机启动:

systemctl enable supervisord

4、启动supervisord

systemctl start supervisord

5、查看supervisord状态

systemctl status supervisord

1.5、Supervisor配置及使用

通过vi命令或者xftp修改配置文件开启web界面访问,如下图所示,分别取消inet_http_server等四个配置的注释:

vi /etc/supervisord.conf

执行如下命令,重新加载配置文件:

supervisorctl reload

然后在浏览器打开http://你的ip:9001,输入上面我们设置的用户名:user1,密码:123456后,如图所示:


看到上图这个界面,就表示supervisor安装完成了。

切换到/etc/supervisord.d目录,在此目录创建名称为:core50test.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

上述代码包含了注释信息,参考精減版配置如下:

[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,你们是其他的就做相应的修改即可。

然后执行如下命令来重新加载配置:

supervisorctl reload

命令执行成功后, 刷新浏览器,可以看到如下界面:

supervisor正在运行的应用

当界面显示running时,则表示我们我们刚刚配置的.net core应用运行起来了。

如下图所示。

我们可以方便的通过supervisor提供的web管理界面对我们的应用进行启动与停止,查看日志等操作,非常的方便,丝般润滑般的爽呀。

Supervisor启动与停止应用

查看日志:

1.6、Supervisor常用命令

### 查看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

  • 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

最常用的几个命令为:

#启动所有
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存储库,先创建一下内容的文件:/etc/yum.repos.d/nginx.repo

[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

默认情况下,使用稳定 nginx 包的存储库。如果要使用主线 nginx 包,请运行以下命令:

 yum-config-manager --enable nginx-mainline

运行如下命令安装nginx:

 sudo yum install -y nginx

设置开机启动:

systemctl enable nginx

启动nginx:

 systemctl start nginx

此时,就可以在浏览器通过ip访问了:http://你的ip,界面如下:

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系统了。

如果部署后遇到类型下面这样的错误

出现这样的问题,有可能的是因为SeLinux的限制,执行如下命令之后,再刷新页面:

setenforce 0

selinux(security enhanced linux)安全增强型linux系统,它是一个linux内核模块,也是linux的一个安全子系统。

selinux的主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)

如果设置后还是不能解决,可以查看nginx的日志了,默认的日志路径为:/var/log/nginx

通过setenforce 0命令,只是临时实效,重启后会失效。

可以通过修改/etc/selinux/config 文件,将SELINUX=enforcing改为SELINUX=disabled,然后重启,即可永久生效。

通过近两篇文章的介绍,我们需要更新应用,只需要将代码提交到git仓库,然后在服务器中执行git pull和dotnet publish即可。

如果熟悉shell的话,可以通过编写shell命令一键执行应用程序的更新,代码示例:

# !/bin/bash
cd /root/app_data/source/core50test
git pull
dotnet publish -o /root/app_data/core50test/publish
supervisorctl restart core50test

将上述的代码保存为sh文件,上传到服务器,并设置权限。如下图所示:

代码提交到git仓库后,执行如下命令:

./build.sh

执行结果如下图所示:

更新后重新运行,已经更新。

这儿可能有的小伙伴会遇到一个小小的坑要注意,shell脚本写得没有问题,执行会报类似这样的错误

$'\r':command not found

出现这种问题是因为windows下的文件换行用的是\r\n,而linux系统用的是\n,如果在win下的文档上传到linux,就有可能出现这样的问题,只需用vi打开shell脚本文件,然后使用命令:set ff=unix,保存文件即可。

supervisor一个作为守护线程,用于维护应用程序的生命周期的,nginx则是作为反向代理使用,配置shell可以做到高效部署,非常的方便。


一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。

RDIFramework.NET官方网站:http://www.rdiframework.net/

RDIFramework.NET官方博客:http://blog.rdiframework.net/

特别说明,框架相关的技术文章请以官方网站为准,欢迎大家收藏!

RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用!

欢迎关注RDIFramework.NET框架官方微信公众号(微信号:guosisoft),及时了解最新动态。

使用微信扫描二维码立即关注

微信号:guosisoft

版权声明
本文为[.NET快速开发框架]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/huyong/p/14291930.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云