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 的友情支持

640?wx_fmt=png

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

640?wx_fmt=png

大家拿到一台机器的时候,一定要确认一下操作系统的版本,因为 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 的指引进行安装即可,依次输入下面的命令

  1. sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

  2. sudo yum update

  3. sudo yum install dotnet-sdk-2.2

因为现在我们登录的账号不是 root,所以执行命令期间可能会提示输入密码,照做即可,由于是新机器第一次进行 yum update ,可能各种依赖比较多,请耐心等待安装完成。如果是第一次使用 Linux 的同学,请把 Linux 想象成 Windows 下的 dos 系统操作,这样就可以实现平滑过渡了。

安装完成,输入 dotnet --version 输出下面的信息,证明安装成功了

640?wx_fmt=png

1.2 配置服务运行的端口

配置服务运行的端口有两种方式,之前的文章介绍了使用 hosting.json 文件的方式,这里演示为了方便,因为 linux 下要配置防火墙等操作会把新手搞懵逼,我们直接的代码中指定 80 端口,代码如下

  1.    public class Program

  2.    {

  3.        public static void Main(string[] args)

  4.        {

  5.            CreateWebHostBuilder(args).Build().Run();

  6.        }


  7.        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

  8.            WebHost.CreateDefaultBuilder(args)

  9.                   .UseKestrel(options =>

  10.                   {

  11.                       options.Listen(IPAddress.Parse("0.0.0.0"), 80);

  12.                   })

  13.                   .UseStartup<Startup>();

  14.    }

非常简洁的代码,仅仅使用 UseKestrel 就可以配置侦听地址和端口,如果有多块网卡的朋友,注意最好还是指定 IP 地址。

2. 开始发布

2.1 发布到本地文件夹

定位到项目 D:\Learning\Deploy.Linux\Deploy.Linux,输入 cmd 启动命令行,输入以下命令

  1. 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 目录

接下来,在服务器中新建一个文件夹,在控制台中输入命令

  1. sudo mkdir -p /data/sites/demo

  2. // 修改权限为当前登录用户,否则无法上传

  3. sudo chown -R ron:ron /data

将 publish 文件夹上传到服务器上刚才创建好的文件夹 /data/sites/demo 下,我这里使用的是 SecureFx ,简单粗暴,直接复制上传

640?wx_fmt=png

2.2 测试启动

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

  1. cd /data/sites/demo/publish

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

  3. sudo dotnet Deploy.Linux.dll

640?wx_fmt=png

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

  1. // 主机环境:Production

  2. Hosting environment: Production

  3. // 根目录

  4. Content root path: /data/sites/demo/publish

  5. // 侦听地址和端口

  6. Now listening on: http://0.0.0.0:80

  7. // 提示关闭技巧,Ctrl+C 可以关闭此主机

  8. Application started. Press Ctrl+C to shut down.

没有太多的信息,同样的简单明了,实际上,现在我们已经通过 80 端口来访问该站点了,但是作为服务,必须要常驻内存中运行,而不是关闭窗口就停止了站点。

2.3 创建常驻服务

所以,接下来我们就编写一个脚本文件,将该站点托管到 Linux 服务中,这个脚本文件官网有示例,我们可以直接拿过来用,但是首先,我们得先在系统中创建一个服务文件 kestrel-dotnet.service

定位到文件夹 /etc/systemd/system,输入命令

  1. sudo vi kestrel-dotnet.service


  2. // 按 i 将编辑器转换为输入模式

  3. // 将以下内容 copy 到当前编辑器中

  4. [Unit]

  5. Description=Example .NET Web Site running on Centos


  6. [Service]

  7. WorkingDirectory=/data/sites/demo/publish

  8. ExecStart=/usr/bin/dotnet Deploy.Linux.dll

  9. Restart=always

  10. # Restart service after 10 seconds if the dotnet service crashes:

  11. RestartSec=10

  12. KillSignal=SIGINT

  13. SyslogIdentifier=dotnet-example

  14. User=root

  15. Environment=ASPNETCORE_ENVIRONMENT=Production

  16. Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false


  17. [Install]

  18. WantedBy=multi-user.target


  19. // 按 esc 键推出编辑模式,输入命令 :wq! 保存并退出

通过上面这波操作以后,你就得到了一个服务文件 kestrel-dotnet.service,这是一个标准的 Linux 服务配置文件

640?wx_fmt=png

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

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

  1. // 注册服务

  2. sudo systemctl enable kestrel-dotnet.service

  3. // 启动服务

  4. sudo systemctl start kestrel-dotnet.service

好了,现在访问我们的站点,目前我的站点是: http://139.219.9.102/ 在服务没有到期之前,大家应该都是该地址应该是可以访问的

结束语

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

演示代码下载: https://github.com/lianggx/EasyAspNetCoreDemo/tree/master/Deploy.Linux

原文地址:https://www.cnblogs.com/viter/p/10408012.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevC++ 用C语言的多线程 实现简单的客户端和服务器

知识来源一&#xff1a; 使用Dev-C实现简单的客户端和服务器-CSDN博客 此先生的博客使用的是win32 SDK来创建多线程&#xff0c;然后鄙人对这个版本的多线程细节不明。于是又重新用C语言的线程替代win32API,以此继续学习服务器代码。 知识来源二&#xff1a;DevC 多线程创建…

[2021-09-09 T3] 序列/luogu P3943 星空(异或差分+bfs最短路+状压dp)

序列descriptionsolutioncodedescription 题目描述 长度为nnn的序列&#xff0c;初始全为000&#xff0c;每次可以选择⼀个数ai(1≤i≤l)a_i(1\le i\le l)ai​(1≤i≤l)&#xff0c;然后选择连续aia_iai​个元素异或上111 求最少的次数&#xff0c;使得对于所有i(1≤i≤k)i(…

HDU - 4608 I-number

题意&#xff1a; 给你一个x&#xff0c;让你构造一个y&#xff0c;y的要求&#xff1a; y>xy的各项之和为10的倍数在满足前两个的前提下&#xff0c;y尽可能小 题解&#xff1a; 模拟&#xff0c;尽可能的模拟&#xff0c;用字符串模拟 先将各位相加得到sum&#xff0c…

从初创公司的角度来看微服务

在开展微服务的过程中&#xff0c;了解要考虑哪些因素可能是非常有挑战性的事情。没有可以直接使用的金科玉律。每个过程都是不同的&#xff0c;因为每个组织面临的都是不同的环境。在本文中&#xff0c;我将从初创公司的角度分享我们学习到的经验和面临的挑战&#xff0c;以及…

洛谷P2056:[ZJOI2007]捉迷藏(点分树、STL)

解析 见到动态维护最远点对&#xff0c;不难想到利用 set 维护最大值和次大值&#xff0c;每个点维护两个 set 的杂技做法。 但是问题是…T了啊。 咋办嘞。 一个在本题至关重要的 trick&#xff1a;利用两个堆来支持访问最大值和删除 具体也很好理解&#xff1a;当删除的时候…

[NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

[NOI2018] 归程descriptionsolution1code1solution2codedescription 题目描述 本题的故事发生在魔力之都&#xff0c;在这里我们将为你介绍一些必要的设定 魔力之都可以抽象成一个nnn个节点、mmm条边的无向连通图&#xff08;节点的编号从111至nnn&#xff09;我们依次用 l,…

CodeForces - 616D Longest k-Good Segment

CodeForces - 616D Longest k-Good Segment 题意&#xff1a; 有包含n个数的序列a&#xff0c;求能找到最长的区间包含不超过k个不同的元素。 题解&#xff1a; 尺取法&#xff0c;先固定L&#xff0c;然后移动R&#xff0c;R每次移动&#xff0c;当超过k后&#xff0c;L再…

MySQL 集群方案介绍

mysql集群方案这里介绍2种&#xff0c;PXC 和 Replication。大型互联网程序用户群体庞大&#xff0c;所以架构设计单节点数据库已经无法满足需求。大家也深有体会&#xff0c;有一万人在学校网站查成绩或是选课的时候网站时常是访问不了或者相应特别特别慢。这种情况就凸显出来…

模板:回文自动机(PAM)

所谓回文自动机&#xff0c;就是关于回文的自动机。 &#xff08;逃&#xff09; 前言 小清新自动机。 经历过SAM的大风大浪&#xff0c;这个相比而言好理解多了&#xff0c;感觉也许应该先学这个再学SAM… 解析 和trie、AC自动机、SAM等类似的&#xff0c;PAM的每个结点表…

Gym - 215177C 玩游戏

题意&#xff1a; ljcc和他的学妹在玩游戏&#xff0c;这个游戏共有 n 轮&#xff0c;在第 i 轮获胜会获得 i 分&#xff0c;没有平局。 现在给出ljcc和学妹的得分&#xff0c;求是否有一种方案符合当前得分。 题解&#xff1a; 第i轮得到i分&#xff0c;一共n轮&#xff0…

Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)

Zju2112 Dynamic Rankingsdescriptionsolutioncodedescription 给定一个含有n个数的序列a[1],a[2],a[3]……a[n]&#xff0c;程序必须回答这样的询问&#xff1a;对于给定的i,j,k&#xff0c;在a[i],a[i1 ],a[i2]……a[j]中第k小的数是多少(1≤k≤j-i1)&#xff0c;并且&…

ML.NET案例详解:在.NET下使用机器学习API实现化学分子式数据格式的判定

半年前写过一篇类似的文章&#xff0c;题目是&#xff1a;《在.NET中使用机器学习API&#xff08;ML.NET&#xff09;实现化学分子式数据格式的判定》&#xff0c;在该文中&#xff0c;我介绍了化学分子式数据格式的基本知识&#xff0c;同时给出了一个案例&#xff0c;展示了如…

洛谷P4762: [CERC2014]Virus synthesis(PAM)

解析 自己对PAM的理解不够深刻。 最优方案必然是先选择一个偶回文串&#xff0c;递归构造出它的一半。花一步逆序&#xff0c;然后暴力解决剩下的。 这似乎已经依稀出现了某种dp的思路。 考虑如何更好的转移。设计 transxtrans_xtransx​ 表示长度不超过 xxx 一半的最长回文后…

Triangle HDU - 5914

Triangle HDU - 5914 题意&#xff1a; 有长度分别是1到n的n给木棍&#xff0c;问最少拿走几个木棍&#xff0c;使得剩下木棍无法组成三角形 题解&#xff1a; 组不成三角形的恰巧情况就是ab<c&#xff0c;也就是我们要让剩下的木棍&#xff0c;两者之和等于或小于第三个…

CodeForces - 336A Vasily the Bear and Triangle

CodeForces - 336A Vasily the Bear and Triangle 题意&#xff1a; 给你一个点x&#xff0c;现在这个点和原点组成了矩形&#xff0c;让你在x和y轴分别求一个点&#xff0c;与原点构成的三角形&#xff0c;要求矩形在三角形内&#xff0c;点x在斜边上 题解&#xff1a; 这…

数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf

文章目录[HNOI2012]永无乡Lomsat gelral「POI2011 R2 Day2」旋转树木 Tree RotationsEscape Through Leaf线段树合并与 fhq-treap合并很类似&#xff0c;也是将两个不同根的线段树暴力合并至于时间复杂度&#xff0c;线段树合并一次是可以达到O(n)O(n)O(n)的&#xff0c;但是大…

吉特仓储管理系统--开源2018年源码

应该说今天过完&#xff0c;这个年就算真正意义上的过完了&#xff0c;没有想到的是又是在出差的路上写这样的文章。废话也不多说&#xff0c;写这篇文章主要的目的是想将去年吉特仓储管理系统开发的一个版本源代码开放出来&#xff0c;供各位开发者阅读使用。github 源代码地址…

模板:广义SAM(字符串)

所谓广义SAM&#xff0c;就是更广泛意义下的SAM &#xff08;逃&#xff09; 前言 感觉字符串的理解难度的巅峰还是在SAM&#xff0c;广义SAM只是在套一些特判罢了&#xff0c;并不是太难理解。 可以解决多字符串的子串问题&#xff0c;几乎就是把SAM能做的东西从单串变成了多…

自定义Visual Studio.net Extensions 开发符合ABP vnext框架代码生成插件[附源码]

介绍我很早之前一直在做mvc5 scaffolder的开发功能做的已经非常完善,使用代码对mvc5的项目开发效率确实能成倍的提高,就算是刚进团队的新成员也能很快上手,如果你感兴趣 可以参考 http://neozhu.github.io/MVC5-Scaffolder/#/ https://github.com/neozhu/MVC5-Scaffolder但是m…

QDU-Training-01

QDU-Training-01 题号题目知识点难度CodeForces 76EPoints数论HDU 4608I-number模拟CodeForces 616DLongest k-Good Segment尺取法Gym 215177C玩游戏思维题HDU 5914Triangle构造题CodeForces 336AVasily the Bear and Triangle思维题 同时纪念我第700篇文章&#xff0c;我还是…