@Mr-13
2018-07-21T10:53:06.000000Z
字数 5831
阅读 138
.netcore
这里主要整理在LInux7.*上发布.netcore站点的流程。主要包含一下几部分:
- 基础工具和Linux环境准备
- .Net Core环境安装及端口配置
- Nginx安装及配置
- Supervisor守护进程的安装及配置
LInux7.* :因为.Net Core所要求的的Linux最低版本为7以上,这里用到阿里云的ECS实例,系统版本7.5
Xshell : SSH远程客户端工具
VS2017 : 开发环境
本次部署的目的是通过Nginx负载代理.Net Core服务,对外提供站点的访问。.Net Core本身的宿主则通过其自带的Kestrel服务运行。
打开VS2017,新建项目
选择ASP.NET Core Web应用程序(.NET Core);选择Web应用程序模板。直接F5测试网站是否正常。
增加Url网址配置文件
项目默认使用http://localhost:5000进行侦听,我们可以通过增加配置文件来随时修改侦听端口。
在项目的根目录中增加一个hosting.json文件,文件内容如下:
{
"server.urls": "http://*:8080" //这里侦听8080端口,可以根据需要修改
}
编辑Program.cs文件,修改内容如下:
public static void Main(string[] args)
{
// BuildWebHost(args).Run();
//public static IWebHost BuildWebHost(string[] args) =>
// WebHost.CreateDefaultBuilder(args)
// .UseStartup<Startup>()
// .Build();
// ------------- 以上部分为程序默认代码,注释掉-----------------
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("hosting.json", optional: true)
.Build();
var host = new WebHostBuilder()
.UseKestrel()
.UseConfiguration(config)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
}
发布项目,输出到PublishOutput文件夹,压缩成zip格式并上传到服务器。
.Net Core官网下载地址:https://www.microsoft.com/net/download/linux
选择core2.0版本,根据官网的提示完成安装步骤即可。
https://www.microsoft.com/net/download/linux-package-manager/centos/sdk-2.1.201
# 安装微软的密钥、依赖项;官网原文是:
# Add the dotnet product feed
# Before installing .NET, you'll need to register the Microsoft key, register the product repository, and install required dependencies. This only needs to be done once per machine.
[root@Mr13]sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
# 安装.NET SDK
[root@Mr13]sudo yum update
[root@Mr13]sudo yum install libunwind libicu
[root@Mr13]sudo yum install dotnet-sdk-2.1.201
# 测试一下是否安装成功,成功会显示版本号
[root@Mr13]dotnet --version
2.1.201
# 解压刚刚上传的网站文件,如果没安装解压软件,运行yum install -y unzip zip安装
[root@Mr13]unzip ~/dotnet/PublishOutput.zip
# 关闭防火墙,避免些不必要的干扰
[root@Mr13]systemctl stop firewalld.service
# 启动网站
[root@Mr13]cd ~/dotnet/PublishOutput
[root@Mr13]dotnet smsmanage.dll // smsmanage.dll是我们发布站点的dll文件
# 如果报错Failed to bind to CoreCLR,运行yum install -y libunwind 和 yum install -y icu
启动成功,就可以使用IP:端口的形式访问到网站了
Nginx的安装略过,自动安装就好,主要记一下Nginx的配置。
Nginx安装完成后,使用IP地址直接访问,出现Nginx页面说明安装成功,如下:
进入Nginx配置:
[root@Mr13]cd /etc/Nginx
// 创建站点配置文件目录,我们把所有托管的站点配置/解析文件都放在这里
[root@Mr13 Nginx]mkdir hosts
[root@Mr13 Nginx]cd hosts
// 创建并编辑smsmanage.conf文件,这个文件是刚刚我们发布站点的配置文件
[root@Mr13 hosts]vim smsmanage.conf
//编辑配置文件内容如下:
server{
listen 80;
index index.html index.htm;
server_name smsmanage.175y.cn; #域名
location / {
proxy_pass http://127.0.0.1:8080; #域名对应的端口号
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass %http_upgrade;
}
}
// 保存并退出
# nginx.conf是nginx的配置文件
$ vim /etc/nginx/nginx.conf
# 编辑配置文件,在http节点末尾添加如下,这样把/etc/nginx/hosts下面的所有站点配置文件包含进来
include /etc/nginx/hosts/*.conf;
# 重新加载配置文件
$ nginx -s reload
# 设置开机启动
$ systemctl enable nginx.service
现在站点还不能直接访问,我们只是做好了域名的解析和指向。
$ cd ~/dotnet/smsmanage
$ dotnet smsmanage.dll & // & 符号表示后台执行
现在通过我们绑定的域名:smsmanage.175y.cn可以正常访问到站点了。如下图:
在Linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。
由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。
此处的创建守护进程,是指发布在Linux上 asp.NET core 程序的dotnet xxx.dll
命令的宿主进程创建一个守护进程。
Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
Supervisor是采用 Python(2.4+) 开发的,它是一个允许用户管理 基于 Unix 系统进程的 Client/Server 系统,提供了大量功能来实现对进程的管理。
目前存在三个问题
- 问题1:ASP.net Core应用程序运行在shell之中,如果关闭shell则会发现ASP.Net Core应用被关闭,从而导致应用无法访问,这种情况当然是我们不想遇到的,而且生产环境对这种情况是零容忍的。
- 问题2:如果ASP.NET Core进程意外终止那么需要人为连进shell进行再次启动,往往这种操作都不够及时。
- 问题3:如果服务器宕机或需要重启我们则还是需要连入shell进行启动。
为了解决这个问题,我们需要有一个程序来监听ASP.NET Core应用程序的状况。在应用程序停止运行的时候立即重新启动。
# 安装supervisor
$ yum install ython-setuptools
$ easy_install supervisor
# 配置supervisor
# 创建自定义配置文件夹
$ mkdir /etc/supervisor
$ echo_supervisor > /etc/supervisor/supervisor.conf
# 修改supervisor配置文件
$ vim /etc/supervisor/supervisor.conf
# 将配置文件最后的内容修改为:
[include]
files = conf.d/*.conf
与Nginx配置文件中http节点添加include一个道理,我们将不同站点的托管配置都保存进conf.d文件家中,方便后期的维护管理。
# 创建自定义配置文件目录
$ cd /etc/supervisor
$ mkdir conf.d
# 添加并编辑smsmanage.conf
$ cd conf.d
$ vim smsmanage.conf
编辑smsmanage.conf内容如下:
注意:
实际环境设置时,删除注释,否则会出现执行命令失败。
[program:smsmanage] // program:后面的名字是托管程序名,自定义
command=dotnet smsmanage.dll // 要执行的命令
directory=/root/dotnet/PublishOutput // 执行命令的目录
environment=ASPNETCORE_ENVIRONMENT=Production // 环境变量
user=root // 执行进程的用户身份
stopsignal=INT
autostart=true // 设置自动启动
autorestart=true // 设置自动重启
startsecs=3 // 自动重启的时间间隔(单位:秒)
stderr_logfile=/var/log/smsmanage.err.log // 标准错日志
stdout_logfile=/var/log/smsmanage.out.log // 标准输出日志
重新加载supervisor配置,并运营supervisor,使刚才做的修改配置生效。
# 重新加载supervisor配置
$ supervisorctl reload
# 运行supervisor
$ supervisord -c /etc/supervisor/supervisord.conf
注意:
在执行第二条命令时,如果出现以下提示信息:
是因为有一个使用supervisor的程序正在运行,需要执行 supervisorctl shutdown
命令终止supervisor,或重新创建一个ProjectName.conf文件再执行第一条命令。
最后,我们检查一下站点服务进程:
$ ps -ef | grep smsmanage
如上图,当看到有smsmanage.dll的进程运行,那么整个站点配置就结束了,代表supervisor成功唤起站点程序,可以通过smsmanage.175y.cn正常访问了。
- 停止服务: sudo service supervisor stop
- 启动服务: sudo service supervisor start
- 关闭所有任务: supervisorctl shutdown
- 启动某一服务 supervisorctl start program_name
- 停止某一服务 supervisorctl stop program_name
- 查看所有服务状态 supervisorctl status