在.NET Core部署到linux(CentOS)最全解决方案,常规篇一文,咱们详细讲解了传统的.NET Core部署到Linux服务器的方法,学到了Linux在虚拟机下的安装、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的发布与运行全过程。本文讲讲解经过使用Supervisor+Nginx的组合来实现.net core的高效部署。html
官网:http://supervisord.org,源码位置:https://github.com/Supervisor/supervisorlinux
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。ios
它是经过fork/exec的方式把这些被管理的进程看成supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去便可。也实现当子进程挂掉的时候,父进程能够准确获取子进程挂掉的信息的,能够选择是否本身启动和报警。supervisor还提供了一个功能,能够为supervisord或者每一个子进程,设置一个非root的user,这个user就能够管理它对应的进程。nginx
在linux或者unix操做系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端而且周期性的执行某种任务或等待处理某些发生的事件。因为在linux中,每一个系统与用户进行交流的界面称为终端,每个今后终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。可是守护进程却能突破这种限制,它脱离于终端而且在后台运行,而且它脱离终端的目的是为了不进程在运行的过程当中的信息在任何终端中显示而且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。git
此处的建立守护进程,是指发布在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主进程建立一个守护进程。在 Linux 上有不少能够管理进程的工具,咱们使用 Supervisor 来作这个事情。github
缘由有两点:web
①、它是微软官方文档推荐的,下降学习成本。
②、它并不必定是最好的,但必定是文档最全的。shell
主进程,负责管理进程的server,它会根据配置文件建立指定数量的应用程序的子进程,管理子进程的整个生命周期,对crash的进程重启,对进程变化发送事件通知等。同时内置web server和XML-RPC Interface,轻松实现进程管理。。该服务的配置文件在/etc/supervisor/supervisord.conf。windows
客户端的命令行工具,提供一个相似shell的操做接口,经过它你能够链接到不一样的supervisord进程上来管理它们各自的子程序,命令经过UNIX socket或者TCP来和服务通信。用户经过命令行发送消息给supervisord,能够查看进程状态,加载配置文件,启停进程,查看进程标准输出和错误输出,远程操做等。服务端也能够要求客户端提供身份验证以后才能进行操做。centos
superviosr提供了web server功能,可经过web控制进程(须要设置[inethttpserver]配置项)
一个Linux/Unix系统上的进程监控工具
一个Python开发的通用的进程管理程序
能够管理和监控Linux上面的进程
能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启
不过同daemontools同样,它不能监控daemon进程
相应安装建议以管理员方式登陆系统,非管理员请以sudo命令安装。
Linux sudo命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。
一、安装EPEL源的命令以下:
sudo yum -y install epel-release
二、执行以下命令安装supervisor:
sudo yum -y install supervisor
三、设置开机启动:
systemctl enable supervisord
四、启动supervisord
systemctl start supervisord
五、查看supervisord状态
systemctl status supervisord
经过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
命令执行成功后, 刷新浏览器,能够看到以下界面:
当界面显示running时,则表示咱们咱们刚刚配置的.net core应用运行起来了。
以下图所示。
咱们能够方便的经过supervisor提供的web管理界面对咱们的应用进行启动与中止,查看日志等操做,很是的方便,丝般润滑般的爽呀。
查看日志:
### 查看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
在前面文章中,咱们已经能够很是方便的对web应用进行部署与管理了,但还存在一个问题,咱们的应用程序默认是绑定的5000端口,若是要指定80端口或者配置域名该怎么处理呢?下面就该nginx登场了。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特色是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用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,界面以下:
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),及时了解最新动态。
使用微信扫描二维码当即关注