Asp.NetCore轻松学-部署到 Linux 进行托管
前言
上一篇文章介绍了如何将开发好的 Asp.Net Core 应用程序部署到 IIS,且学习了进程内托管和进程外托管的区别;接下来就要说说应用 Asp.Net Core 的特性(跨平台),将 .NetCore 部署到 Linux 中,主流的 Linux 有多个版本的操作系统,这里以 Centos-7.5 为例子,其它版本的操作系统下的部署基本都是大同小异的,除了了一些命令上的区别。
在 Linux 上部署 .Net Core 应用程序,通常的做法是使用托管宿主,早在 1.0.4 的时代,曾经推荐的做法是使用自托管,即 Kestrel,后来官方主力推荐使用 Supervisor 进行托管部署;当然,还有如今最流行的 Docker 部署,但是 Docker 部署不在本文讨论范围,这次我们主要讲讲怎么使用 “Kestrel” 和 “Supervisor” 进行部署。
准备过程
为了演示部署,我专门到 Azure 上申请了 1 元使用套餐,创建了一个 Centos-7.5 的虚拟机,申请过程非常轻松愉快,支付 1 元即可完成 1500 元的信用额度,使用期限 30 天,童叟无欺,推荐大家申请,用作测试学习的机器。
花了几分钟,机器拿到了,感谢 Azure 的友情支持

SSH 连接到虚拟机,他是长这个样子的,输入命令 cat /etc/redhat-release 查看版本

大家拿到一台机器的时候,一定要确认一下操作系统的版本,因为 ubuntu 和 centos 下的有些命令是不同的,比如 ubuntu 使用 apt-get,而 centos 使用 yun
1. 自托管的部署-使用 Kestrel
好了,机器已经拿到,系统已经确认,下面的工作首先就是要在 Centos 上安装 .net core,因为是 Azure ,我抱着幻想输入 dotnet --version,果然,提示命令不存在,这很工业标准。
1.1 安装环境
好的,没问题,我们就按照 https://dotnet.microsoft.com/learn/web/aspnet-hello-world-tutorial/install 的指引进行安装即可,依次输入下面的命令
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
sudo yum update
sudo yum install dotnet-sdk-2.2
因为现在我们登录的账号不是 root,所以执行命令期间可能会提示输入密码,照做即可,由于是新机器第一次进行 yum update ,可能各种依赖比较多,请耐心等待安装完成。如果是第一次使用 Linux 的同学,请把 Linux 想象成 Windows 下的 dos 系统操作,这样就可以实现平滑过渡了。
安装完成,输入 dotnet --version 输出下面的信息,证明安装成功了

1.2 配置服务运行的端口
配置服务运行的端口有两种方式,之前的文章介绍了使用 hosting.json 文件的方式,这里演示为了方便,因为 linux 下要配置防火墙等操作会把新手搞懵逼,我们直接的代码中指定 80 端口,代码如下
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options =>
{
options.Listen(IPAddress.Parse("0.0.0.0"), 80);
})
.UseStartup<Startup>();
}
非常简洁的代码,仅仅使用 UseKestrel 就可以配置侦听地址和端口,如果有多块网卡的朋友,注意最好还是指定 IP 地址。
2. 开始发布
2.1 发布到本地文件夹
定位到项目 D:\Learning\Deploy.Linux\Deploy.Linux,输入 cmd 启动命令行,输入以下命令
dotnet publish --runtime centos.7-x64 --framework netcoreapp2.2 --configuration release
执行上述命令后,将会在项目 bin\release\netcoreapp2.2\centos.7-x64\publish 下看到有发布好的项目文件和依赖项目
- 注意:参数 --runtime 是有固定 RID 的,想了解更多有关 RID 的知识,请移步 .NET Core RID 目录
接下来,在服务器中新建一个文件夹,在控制台中输入命令
sudo mkdir -p /data/sites/demo
// 修改权限为当前登录用户,否则无法上传
sudo chown -R ron:ron /data
将 publish 文件夹上传到服务器上刚才创建好的文件夹 /data/sites/demo 下,我这里使用的是 SecureFx ,简单粗暴,直接复制上传

2.2 测试启动
上传成功后,先不要着急的写服务文件,先测试一下是否可以启动,先使用控制台进行测试,输入命令定位到 publish 文件夹
cd /data/sites/demo/publish
// 启动,因为要侦听端口,而且我们使用的不是 root 用户,这里需要使用 sudo 进行提权,如果提示输入密码,请输入当前登录用户的密码即可
sudo dotnet Deploy.Linux.dll

测试启动成功,上面输出的信息表示,我们的发布是没有问题的,先来了解一下上面的输出信息
// 主机环境:Production
Hosting environment: Production
// 根目录
Content root path: /data/sites/demo/publish
// 侦听地址和端口
Now listening on: http://0.0.0.0:80
// 提示关闭技巧,Ctrl+C 可以关闭此主机
Application started. Press Ctrl+C to shut down.
没有太多的信息,同样的简单明了,实际上,现在我们已经通过 80 端口来访问该站点了,但是作为服务,必须要常驻内存中运行,而不是关闭窗口就停止了站点。
2.3 创建常驻服务
所以,接下来我们就编写一个脚本文件,将该站点托管到 Linux 服务中,这个脚本文件官网有示例,我们可以直接拿过来用,但是首先,我们得先在系统中创建一个服务文件 kestrel-dotnet.service
定位到文件夹 /etc/systemd/system,输入命令
sudo vi kestrel-dotnet.service
// 按 i 将编辑器转换为输入模式
// 将以下内容 copy 到当前编辑器中
[Unit]
Description=Example .NET Web Site running on Centos
[Service]
WorkingDirectory=/data/sites/demo/publish
ExecStart=/usr/bin/dotnet Deploy.Linux.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
// 按 esc 键推出编辑模式,输入命令 :wq! 保存并退出
通过上面这波操作以后,你就得到了一个服务文件 kestrel-dotnet.service,这是一个标准的 Linux 服务配置文件

经过上面的一系列操作,对于还没有接触过 Linux 的同学来说,已经有点疲惫了,再坚持一下,马上就好
现在将创建好的服务文件注册到系统中,然后启动它,依次输入以下命令
// 注册服务
sudo systemctl enable kestrel-dotnet.service
// 启动服务
sudo systemctl start kestrel-dotnet.service
好了,现在访问我们的站点,目前我的站点是:
http://139.219.9.102/
在服务没有到期之前,大家应该都是该地址应该是可以访问的
结束语
写到这里,发现文章居然有点长了,对于入门文章来说,这是不合适的,好吧,下一篇再继续介绍使用 Supervisor 进行托管部署 Asp.Net Core 应用程序
演示代码下载:
https://github.com/lianggx/EasyAspNetCoreDemo/tree/master/Deploy.Linux
Asp.NetCore轻松学-部署到 Linux 进行托管的更多相关文章
- Asp.NetCore轻松学-部署到 IIS 进行托管
前言 经过一段时间的学习,终于来到了部署服务这个环节,.NetCore 的部署方式非常的灵活多样,但是其万变不离其宗,所有的 Asp.NetCore 程序都基于端口的侦听,在部署的时候仅需要配置侦听地 ...
- Asp.NetCore轻松学-使用Supervisor进行托管部署
前言 上一篇文章 Asp.NetCore轻松学-部署到 Linux 进行托管 介绍了如何在 Centos 上部署自托管的 .NET Core 应用程序,接下来的内容就是介绍如何使用第三方任务管理程序来 ...
- 目录---Asp.NETCore轻松学系列【目录】
随笔分类 - Asp.NETCore轻松学系列 Asp.NETCore轻松学系列阅读指引目录 摘要: 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进 ...
- 【目录】Asp.NETCore轻松学系列
随笔分类 - Asp.NETCore轻松学系列 Asp.NETCore轻松学系列阅读指引目录 摘要: 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进 ...
- Asp.NETCore轻松学系列阅读指引目录
前言 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进阶,适合没有 .NETCore 编程经验到小白同学,也适合从 .NET Framework 迁移 ...
- Asp.NetCore轻松学-配置服务 apollo 部署实践
前言 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置 ...
- Asp.NetCore轻松学-使用Docker进行容器化托管
前言 没有 docker 部署的程序是不完整的,在写了 IIS/Centos/Supervisor 3篇托管介绍文章后,终于来到了容器化部署,博客园里面有关于 docker 部署的文章比比皆是,作为硬 ...
- Asp.NetCore轻松学-实现一个轻量级高可复用的RabbitMQ客户端
前言 本示例通过对服务订阅的封装.隐藏细节实现.统一配置.自动重连.异常处理等各个方面来打造一个简单易用的 RabbitMQ 工厂:本文适合适合有一定 RabbitMQ 使用经验的读者阅读,如果你还没 ...
- Asp.NetCore轻松学-业务重点-实现一个简单的手机号码验证
前言 本文纯干货,直接拿走使用,不用付费.在业务开发中,手机号码验证是我们常常需要面对的问题,目前市场上各种各样的手机号码验证方式,比如正则表达式等等,本文结合实际业务场景,在业务级别对手机号 ...
随机推荐
- 使用opencv调用24*24点阵字库和8*16ASCII字库在图片显示文字数字
课程实验:编程读汉字点阵字库,把自己的名字和学号叠加到图片的右下位置. 主要步骤分为三部分 第一部分:读取图片(文件读取) 第二部分:读取文字并从字库中提取相应的编码(字库的存储原理) 第三部分:将相 ...
- Java面向对象(二、继承)
Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法 ...
- Global一点小经验
Global: Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法,他位于应用程序根目录下. 这个 Global.asax ...
- 第七章之S5PV210移植到Nandflash
1,之前的操作都是基于SD卡进行运行的,如今在Nandfalsh中运行u-boot.因为s5p_goni.h配置文件没有配置Nand相关文件,所以先配置Nand文件. 在include/configs ...
- PAT1052:Linked List Sorting
1052. Linked List Sorting (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A ...
- capwap学习笔记——初识capwap(三)(转)
2.5.6 CAPWAP状态机详解 2.5.6.1 Start to Idle 这个状态变迁发生在设备初始化完成. ¢ WTP: 开启CAPWAP状态机. ¢ AC: 开启CAPWAP状态机. ...
- 一次数组越界的bug经历
数组和指针都是C里面的好东西,但是一旦使用不当,真的会让人抓狂. 下面是写程序时遇到的一次数组越界的经历,感觉对以后写程序有点启发,所以记录下来. 起因: 我想用OLED动态显示一组浮点数,而且浮点数 ...
- Spring Boot中使用Actuator的/info端点输出Git版本信息
对于Spring Boot的Actuator模块相信大家已经不陌生了,尤其对于其中的/health./metrics等强大端点已经不陌生(如您还不了解Actuator模块,建议先阅读<Sprin ...
- mac升级到php7
使用homebrew安装php7 brew update #更新源 brew search php #查找源中的php,发现有php7.1版本,安装最新的php7.1 brew install php ...
- 2. 引入springmvc
springboot提供了spring-web-starter-web为web开发提供了支持,并且内嵌了tomcat及spring mvc的依赖,而且通过spring-boot-autoconfigu ...