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

这篇具有很好参考价值的文章主要介绍了.NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

在.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源的命令如下:

  1. sudo yum -y install epel-release

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

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

  1. sudo yum -y install supervisor

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

3、设置开机启动:

  1. systemctl enable supervisord

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

4、启动supervisord

  1. systemctl start supervisord

5、查看supervisord状态

  1. systemctl status supervisord

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

1.5、Supervisor配置及使用

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

  1. vi /etc/supervisord.conf

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

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

  1. supervisorctl reload

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

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

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

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

切换到/etc/supervisord.d目录,在此目录创建名称为:core50test.ini的ini文件,内容如下:

  1. #表示程序名称,用于在supervisor中显示,无特殊意义。
  2. [program:core50test]
  3. # 输入执行命令,这里表示执行的是dotnet Core50Test.dll
  4. command=/bin/bash -c "dotnet Core50Test.dll"
  5. # 应用程序根目录
  6. directory=/root/app_data/core50test/publish
  7. # 是否自动启动,当 supervisor 加载该配置文件的时候立即启动它
  8. autostart=true
  9. # 是否自动重启, 程序异常退出后自动重启
  10. autorestart=true
  11. # 该配置文件输出单个日志文件的大小,默认50M
  12. logfile_maxbytes=50MB
  13. # 日志备份个数
  14. logfile_backups=10
  15. # 记录日志级别
  16. loglevel=info
  17. # 指定标准输出日志文件
  18. stdout_logfile=/root/app_data/data/logs/core50test/core50test.out.log
  19. # 环境变量
  20. environment=ASPNETCORE_ENVIRONMENT=Production
  21. # 启动服务的用户
  22. user=root
  23. # 把stderr重定向到stdout,默认 false
  24. redirect_stderr=true

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

  1. [program:core50test]
  2. command=/bin/bash -c "dotnet Core50Test.dll"
  3. directory=/root/app_data/core50test/publish
  4. autostart=true
  5. autorestart=true
  6. logfile_maxbytes=50MB
  7. logfile_backups=10
  8. loglevel=info
  9. stdout_logfile=/root/app_data/data/logs/core50test/core50test.out.log
  10. environment=ASPNETCORE_ENVIRONMENT=Production
  11. user=root
  12. redirect_stderr=true

注意:stdout_logfile指向的文件夹一定要先创建,否则无法启动,上述配置文件中的内容需要根据用户实际情况修改,如我当前登录的用户是:yonghu,你们是其他的就做相应的修改即可。

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

  1. supervisorctl reload

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

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

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

如下图所示。

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

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

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

查看日志:

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

1.6、Supervisor常用命令

  1. ### 查看supervisorctl支持的命令
  2. # supervisorctl help
  3. default commands (type help <topic>):
  4. =====================================
  5. add exit open reload restart start tail
  6. avail fg pid remove shutdown status update
  7. clear maintail quit reread signal stop version
  8.  
  9. ### 查看当前运行的进程列表
  10. # supervisorctl status

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

  • 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

最常用的几个命令为:

  1. #启动所有
  2. supervisorctl start all
  3.  
  4. # 重启所有
  5. supervisorctl restart all
  6.  
  7. # 停止所有
  8. supervisorctl stop all
  9.  
  10. #PS:要操作某个服务,把all换成服务名即可
  11. #查看服务状态
  12. 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

安装先决条件:

  1. sudo yum install -y yum-utils

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

设置yum存储库,先创建一下内容的文件:/etc/yum.repos.d/nginx.repo

  1. [nginx-stable]
  2. name=nginx stable repo
  3. baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
  4. gpgcheck=1
  5. enabled=1
  6. gpgkey=https://nginx.org/keys/nginx_signing.key
  7. module_hotfixes=true
  8.  
  9. [nginx-mainline]
  10. name=nginx mainline repo
  11. baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
  12. gpgcheck=1
  13. enabled=0
  14. gpgkey=https://nginx.org/keys/nginx_signing.key
  15. module_hotfixes=true

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

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

  1. yum-config-manager --enable nginx-mainline

运行如下命令安装nginx:

  1. sudo yum install -y nginx

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

设置开机启动:

  1. systemctl enable nginx

启动nginx:

  1. systemctl start nginx

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

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

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

2.3、Nginx部署

nginx安装完成后,切换到/etc/nginx/conf.d目录,修改default.conf文件内容,如下所示:

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location / {
  5. proxy_pass http://0.0.0.0:5000;
  6. }
  7. error_page 500 502 503 504 /50x.html;
  8. location = /50x.html {
  9. root /usr/share/nginx/html;
  10. }
  11. }

保存后,执行如下命令,重新加载配置:

  1. nginx -s reload

然后再次访问http://你的ip,一切正常的话应该可以看到如下的界面,表示我们的.NET Core程序已经完美运行在linux系统了。

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

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

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

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

  1. setenforce 0

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

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

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

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

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

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

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

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

  1. # !/bin/bash
  2. cd /root/app_data/source/core50test
  3. git pull
  4. dotnet publish -o /root/app_data/core50test/publish
  5. supervisorctl restart core50test

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

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

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

  1. ./build.sh

执行结果如下图所示:

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

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

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

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

  1. $'\r':command not found

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

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

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

 

作者|国思软件文章来源地址https://www.toymoban.com/news/detail-428997.html

到了这里,关于.NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个基于ASP.NET Core完全开源的CMS 解决方案

    MixCore CMS是一个基于.NET Core框架的开源内容管理系统(CMS),提供了丰富的的基础功能和插件,是一款面向未来的企业 Web  CMS ,可轻松构建任何类型的应用程序。集成了Google Analytics分析,以及友好的Seo功能,非常适合用于创建企业网站、内容系统、个人博客,也可以用于开发

    2024年02月05日
    浏览(83)
  • linux(centos7)定时关机解决方案

    使用场景与痛点:        根据实际需求,每个星期五都要关闭服务器若干,痛点如下: 1是服务器比较多,按起来麻烦。 2是因为周五时间点特殊,着急下班容易忘记关闭服务器。 那些要关注才能看的博客,不是我喷,写的不咋地,还TNN的要关注,有毛病 解决方案:    

    2024年02月11日
    浏览(37)
  • Linux centos7.x系统 下没有ens33 网卡的解决方案

    安装完windows11 + Centos7.9 版本的双系统之后 , 启动Centos7.9时发现没有网卡信息 , 只有ifcfg-lo网卡的信息 , 这个时候就证明没有网卡信息,或者网卡驱动不匹配(我这里是没有网卡),所以我们要重新安装 , 安装步骤如下 : 我这里的型号是 : 00:1f.6 Ethernet controller: Intel Corporation Ether

    2024年02月08日
    浏览(38)
  • 【虚拟机开不了】linux、centOS虚拟机出现entering emergency mode解决方案

    按他的操作输入journalctl之后输入shift+g到日志最后查看报错发现是xfs(dm-0有问题) 解决问题

    2024年02月09日
    浏览(61)
  • CentOS7上部署langchain-chatglm或stable-diffusion可能遇到的Bug的解决方案

    进入你的代码目录下 下载依赖 这里可能有的朋友会有问题会出现某些包下载不了,这里建议直接使用阿里源即可,在确定你的cuda版本之后(使用nvidia-smi确定cuda版本) 命令行执行 卸载掉刚才pip安装的版本!!!!因为此处安装的版本还缺少cuda的支持,确定卸载掉之后 执行 此处X为

    2024年02月16日
    浏览(39)
  • CentOS7在Linux下用yum安装Development Tools(开发工具套件)时报错的解决方案

    目录 1、操作环境 2、问题描述 3、原因分析 4、解决方案  本机系统:Window 10 专业版 虚拟机中的操作系统:CentOS Linux release 7.4.1708 (Core) -x86_64 虚拟机中的操作系统内核:Linux 当用yum安装Development Tools时出现如下报错,无法安装。 报错释义:没有安装组信息文件,可能要运行:

    2024年02月11日
    浏览(53)
  • 80端口被System占用最全解决方案

    想要启动若依系统,启动失败,提示80端口被占用。百度搜索了很多方法无法解决,现将自己尝试的方法都总结一下,希望对碰到这个问题的朋友有点帮助。 进入命令提示行(开始运行输入 CMD),输入命令 netstat –ano ,就可以看到本机所有端口的使用情况,一般80端口在第一

    2024年01月16日
    浏览(47)
  • 可能是最全的:虚拟机使用失败解决方案汇总

    目录 前言  简单说说 1、安装时报错/安装后无法启用虚拟机  如何解决 方法一:移除Hype-V,成功率:40% 方法二:安装WHP,成功率:99% 方法三:恢复出厂设置,成功率:100% VBX:想滥竽充数?不好意思 补充  2、无法读取键盘输入且无法安装tool(灰色) 方法一:切换至微软默

    2024年02月20日
    浏览(39)
  • Linux Centos7安装后,无法查询到IP地址,无ens0,只有lo和ens33的解决方案

    在VMware中,安装Linux centos7操作系统后,想查询本机的IP地址,执行ifconfig命令 结果如下: 结果显示本机有一个ens33网卡,和一个lo回环网卡,没有其余的网卡信息。并且,ens33网卡无法查询到ip地址。此时需要手动配置。 首先需要确认,在/etc/sysconfig/network-scripts/目录下,是否

    2024年02月05日
    浏览(48)
  • IDEA中Maven爆红,依赖下载失败的最全解决方案

    目录 1. 先排查Maven的配置信息是否正确 1.1 maven的settings.xml中的配置 1.2 idea中配置maven  2. 可能是网络卡顿原因,导致依赖下载失败,或者依赖下载不全,依赖包丢失 2.1 网络卡顿 2.2 maven依赖jar包下载不全,导致依赖包丢失。 3. 检查jdk版本是否正确,因为有些依赖与jdk版本不

    2024年02月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包