欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Asp.NetCore轻松学-部署到 Linux 进行托管

程序员文章站 2022-10-01 11:48:15
接下来就要说说应用 Asp.Net Core 的特性(跨平台),将 .NetCore 部署到 Linux 中,主流的 Linux 有多个版本的操作系统,这里以 Centos-7.5 为例子 ......

前言

上一篇文章介绍了如何将开发好的 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 的友情支持

Asp.NetCore轻松学-部署到 Linux 进行托管

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

Asp.NetCore轻松学-部署到 Linux 进行托管

大家拿到一台机器的时候,一定要确认一下操作系统的版本,因为 ubuntu 和 centos 下的有些命令是不同的,比如 ubuntu 使用 apt-get,而 centos 使用 yun

1. 自托管的部署-使用 kestrel

好了,机器已经拿到,系统已经确认,下面的工作首先就是要在 centos 上安装 .net core,因为是 azure ,我抱着幻想输入 dotnet --version,果然,提示命令不存在,这很工业标准。

1.1 安装环境

好的,没问题,我们就按照 的指引进行安装即可,依次输入下面的命令

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 输出下面的信息,证明安装成功了

Asp.NetCore轻松学-部署到 Linux 进行托管

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 ,简单粗暴,直接复制上传

Asp.NetCore轻松学-部署到 Linux 进行托管

2.2 测试启动

上传成功后,先不要着急的写服务文件,先测试一下是否可以启动,先使用控制台进行测试,输入命令定位到 publish 文件夹

cd /data/sites/demo/publish
// 启动,因为要侦听端口,而且我们使用的不是 root 用户,这里需要使用 sudo 进行提权,如果提示输入密码,请输入当前登录用户的密码即可
sudo dotnet deploy.linux.dll

Asp.NetCore轻松学-部署到 Linux 进行托管

测试启动成功,上面输出的信息表示,我们的发布是没有问题的,先来了解一下上面的输出信息

// 主机环境: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 服务配置文件

Asp.NetCore轻松学-部署到 Linux 进行托管

经过上面的一系列操作,对于还没有接触过 linux 的同学来说,已经有点疲惫了,再坚持一下,马上就好

现在将创建好的服务文件注册到系统中,然后启动它,依次输入以下命令

// 注册服务
sudo systemctl enable kestrel-dotnet.service
// 启动服务
sudo systemctl start kestrel-dotnet.service

好了,现在访问我们的站点,目前我的站点是:

在服务没有到期之前,大家应该都是该地址应该是可以访问的

结束语

写到这里,发现文章居然有点长了,对于入门文章来说,这是不合适的,好吧,下一篇再继续介绍使用 supervisor 进行托管部署 asp.net core 应用程序

演示代码下载:
https://github.com/lianggx/easyaspnetcoredemo/tree/master/deploy.linux