Loading

Asp-Net-Core学习笔记:5.构建和部署

从上次开始学习Asp.Net Core以来,一直都是玩一玩,还没有什么机会用来实战,最近单位有个新的小项目,于是我用Asp.Net Core来尝尝新,结果也是非常OK,熟悉之后开发效率感觉和Django基本没差。

那么进入正题,本文简单说说Asp.Net Core应用的构建和部署。

构建

构建是使用build命令,不过一般我们都用vs或者rider之类的IDE,应该比较少会用到这个命令:

dotnet build

发布

本文着重说一下发布这块。发布顾名思义就是把项目编译成一个可执行的文件,可以方便我们拿到其他机器或者是部署到服务器上去运行,对于Java,就是打包成jar包,依赖JavaRuntime运行,或者是可以放到Tomcat运行的war包;对于go语言,是生成一个可执行的文件,一把梭执行就完事了;对于Python语言,不好意思,好像没有什么很好的方案,可以打包成wheel包,也可以pyinstaller打包exe,不过对于web应用的部署,一般还是用docker。

那么对于我们Asp.Net Core应用来说,和go语言一样,非常方便,可以打包成单个的可执行文件,一个字,爽!

参考:https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-publish

最简单的发布命令是:

dotnet publish

使用了这个命令,会在publish目录生成一大堆的文件,包括依赖啊,应用的核心dll包,以及对应平台的可执行文件。请注意,这样生成的一大堆文件是要依赖于本机上的.NetCore Runtime来执行的。

为了方便起见,我们肯定不想在部署的时候还需要在服务器上安装.NetCore Runtime呀,所以看下面。

构建不依赖DotNet Sdk的可执行文件,需要制定目标平台:

dotnet publish -r <RID>

其中,RID参考:https://docs.microsoft.com/zh-cn/dotnet/core/rid-catalog

附上几个常用的吧:

  • Windows
    • win-x86
    • win-x64
    • win-arm
    • win-arm64
  • Linux
    • linux-x64
    • linux-arm
    • linux-arm64

例如我要构建一个在Linux服务器上可以使用的可执行文件,使用以下命令:

dotnet publish -r linux-x64

生成的文件如下:

可以看到这一大坨有三百多个文件夹和文件,这样放到服务器是真的麻烦,又占地方又丑,再看看大小:

一百多M,这也太占空间了,上传到服务器都要等好久,不过别急,接下来微软的黑魔法来了~

搭配上这俩选项

dotnet publish -r linux-x64 -c Release -p:PublishSingleFile=true -p:PublishTrimmed=true

运行一下,嗖!
再看看生成的文件,只有一个可执行文件和几个配置文件、web静态文件目录!(因为我用Debug版,所有有pdb调试文件)比刚才清爽多了!

我们再看看文件大小:

比刚才小了几十M!这下舒服了!

接下来介绍一下多的那两个参数,感觉不用介绍大家也猜到了~

  • -c Release 表示以Release配置来生成
  • -p:PublishSingleFile=true 表示生成单个可执行文件,像go那样
  • -p:PublishTrimmed=true 表示裁剪可执行文件的大小,就像大家看到的那样,大小缩减了几十M!

这样直接把这个可执行文件丢到服务器上就可以运行了,不过ssh一断开就又没有了~

所以接下来介绍使用supervisor来监控web应用的运行

部署

我们选择supervisor这个简单的工具来管理和监控web应用的运行,它是python写的,简单好用。

首先需要安装,可以使用pip:

pip install supervisor

然后在/etc/supervisord.d/目录下创建我们的配置,这里有个模板可以参考。

[program:swatow_affairs]
# 脚本目录
directory = /path/dotnet/swatow_affairs
# 脚本执行命令
command = /path/to/swatow_affairs/SwatowAffairsBackend --urls "http://*:15001;"

# supervisor启动的时候是否随着同时启动,默认True
autostart = true
# 当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,
# 有三个选项,false,unexpected和true。
# 如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的
autorestart = true
# 这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs = 1

# 脚本运行的用户身份 
user = root

# 日志输出 
stderr_logfile = /path/to/swatow_affairs/log/stderr.log
stdout_logfile = /path/to/swatow_affairs/log/stdout.log
# 把stderr重定向到stdout,默认 false
redirect_stderr = true
# stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20
# stdout日志文件备份数
stdout_logfile_backups = 20

把这个文件配置好之后就可以启动supervisor了,命令如下:

systemctl start supervisord.service

也可以使用:

service supervisord start

不同的Linux发行版命令有所差别,可以自行查阅文档。

启动supervisor之后,我们的配置文件会自动加载,然后我们的web应用也就随之启动啦。

更多配置可以查看supervisor的官方文档:https://github.com/Supervisor/supervisor

参考资料

欢迎交流

我整理了一系列的技术文章和资料,在公众号「程序设计实验室」后台回复 linux、flutter、c#、netcore、android、kotlin、java、python 等可获取相关技术文章和资料,同时有任何问题都可以在公众号后台留言~

posted @ 2024-02-08 15:45  程序设计实验室  阅读(61)  评论(0编辑  收藏  举报