向net core 3.0进击——多平台项目发布与部署

前言

在经历过好多折腾后,总算是把部署走通了一遍,以前只是简单建立个工程在linux下部署,后来一直将这件事搁置,直到最近恰好团队入手一个小服务器,很显然是linux的,那就没啥说的了,Come On!html

发布

在这个时候我挺想也秀一把命令行,什么dotnet build啊,publish什么的,可是仍是老老实实用个人宇宙第一神器吧。linux

右键工程发布。
发布
发布
发布web

这个地方我引用下官网的介绍。docker

依赖框架json

优势:windows

  • 不须要设置部署的系统,由于都是通用的pe文件,这就是跨平台很嗨皮的地方
  • 部署包小
  • 容许程序使用net core最新的runtime
  • 多应用可通用一个net core类库

缺点:centos

  • 主机系统必须安装当前程序net core版本或更高的版本
  • 若是net core高版本砍掉部分使用的功能,那升级可能就会有问题

独立部署api

优势:缓存

  • 能够单独维护当前使用的net core
  • 目标系统也能够运行你的net core

缺点:服务器

  • 须要提早选择你部署的系统
  • 部署包大,由于独立嘛
  • 每一个应用本身自己都会带个net core,重复率,emm

其余的倒没有太多注意的地方,我这里选择的是依赖框架。

以后就是生成文件了,咱们来看下这一堆玩意儿。
发布

这里注意本身复制下April.xml这个文件,由于我没连带发布,留个坑。。。

测试

Windows

咱们来试下dotnet命令吧。
测试

直接访问https://localhost:5001吧,这里没有输出内容。
测试

好了,这说明发布直接在Windows运行,应该是没啥问题。

IIS部署

自己想着这里都很少说了,后来一想,算了,既然写相关部署了,那哪能少的了这伴随了好长时间的IIS啊。

新建网站
新建站点

这里注意下标注的模块,IIS部署net core须要单独安装一个.NET Core Windows Server Hosting,而后置于sdk到这一步了应该是都安装过了,路径就选择本身发布的路径。

而后在应用池中更改下托管。
新建站点

以后运行网站就能够了,测试这块儿我就不放了,毕竟通常这地方没啥问题,若是前面都能运行的话,有问题的朋友能够私信我。

Linux

这里我用的是Centos 7(虚拟机Vmware),相关的安装软件什么的我在以前新手向相关的也已经介绍过了,这里很少说了,直接开始吧。

首先咱们把publish下发布的文件打包上传到linux,我这里放的目录是/www/april-webapi/,这里咱们直接运行的话,是不行的,毕竟linux下咱们尚未安装dotnet相关的环境,已经安装的忽视。
Linux部署

一个是运行库dotnet,一个是运行时库runtime,这个均可以经过官网来下载的,固然能够直接经过docker(直接跳过这块儿往下看),可是我这里只是把我本身趟的一遍复述下而已。

$ sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
$ sudo yum install dotnet-sdk-3.0

 

$ sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
$ sudo yum install aspnetcore-runtime-3.0

 

ok,小等会儿就能够安装完了,完成以后,咱们来切到工程目录下。

$ cd /www/april-webapi/publish/

 

来试下dotnet的命令吧。

$ dotnet April.WebApi.dll

 

运行以后,若是不出意外,咱们会看到下面这个错误,固然若是你的工程比较简洁(什么引用都没有,就是个空工程),那这个地方你就彻底运行了,可是那样的工程除了demo毫无卵用(就像我当年那么天真觉得走一遍新建工程发布就已经大结局了同样)。

问题

好了,不扯了,咱们来看下这个问题,提示咱们在对应lib/xxx路径下找不到xxx.dll,可是为什么咱们windows就能够了呢,这是由于类库缓存,在你运行程序的时候这些类库已经有了,默认会从net core的安装目录也就是系统盘下对应的不知道哪一个文件夹下/lib/netstandardx.x/xxx.dll,因此windows下就没有报错。

这里我第一反应就是,那既然这样我就把须要的dll文件都放过来,而后路径换换不就得了(不得不说确实好麻烦),因而就这样一通操做,把类库都单独放到一个文件夹,其实发布以后的工程已然包含这些类库了,对April.WebApi.deps.json这个文件修改路径以后(我是全改为/lib/netcore-libs/xxx.dll),咱们运行以后仍是提示找不到。

对于这种现象,我只能说,世界之大~,而后继续查资料吧,最终在一个Nate McMaster的博客中找到了这个问题的解决方法,原来还有这个April.WebApi.runtimeconfig.json的属性additionalProbingPaths配置,这种要不是深刻还真是不行啊,国外的钻研精神不得不说,值得学习,看过以后也发现,原来发布的文件夹中有一个这种写法的配置,注意看April.WebApi.runtimeconfig.dev.json,下面是我改动以后的April.WebApi.runtimeconfig.json

{
  "runtimeOptions": {
    "tfm": "netcoreapp3.0",
    "framework": {
      "name": "Microsoft.AspNetCore.App",
      "version": "3.0.0"
    },
    "configProperties": {
      "System.GC.Server": true
    },
    "additionalProbingPaths": [
      "/lib/netcore-libs/"
    ]
  }
}

 

配置好对应路径以后,咱们来测试下,若是没有其余问题,应该跟我看到的界面效果同样,ok,那这样不就已经结束了。

测试

Docker

docker的配置这块儿,我也是在Linux配置部署_新手向(五)——Docker的安装与使用简单的介绍了,包括基本用到的命令语句什么的。

这里直接来个Dockerfile吧,这里也只是简单写下须要的环境,端口,路径等基础配置。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY . /app
ENTRYPOINT ["dotnet", "April.WebApi.dll"]

 

而后咱们在当前目录下,运行如下命令生成镜像,注意末尾,还有个点,意思就是当前目录。

$ docker build -t april-webapi .

 

稍等一下子(网速很差的话可能很长时间),提示完成的时候,咱们来看下镜像。

$ docker images

 

测试

看到有镜像那就说明走了一大半了,而后咱们只须要运行镜像建立容器就好了。

$ docker run --name april-webapi-demo -d -p 8080:80 april-webapi
$ docker ps -a

 

指定8080来接收80端口,指定名字叫april-webapi-demo,而后看下运行容器的状况。

测试

这里咱们看到已经建立了容器,可是注意状态EXIT(140),这很明显咱们的程序跑了可是没有持久,emm,不持久可不行。

看下日志是咋回事吧。

$ docker logs april-webapi-demo

 

测试

一看,哟,又是一样的错误,可是咱们的路径已经指向绝对路径了,为啥还错呢,这里注意下,咱们的类库是在linux下的根目录下的指定文件夹,可是docker呢,能够理解为单独的虚拟机,那很显然docker当中没有这个路径下的文件,那既然这样,咱们就好解决了,由于Dockerfile中咱们的WorkingDir是/app,那么咱们是否是只要指定到这个目录下就能够了呢?Let's 踹踹。

首先咱们在publish下建立个packages,而后把类库包复制到文件夹下,以后替换April.WebApi.deps.json中/lib/netcore-libs/为/app/packages/,这里说下为啥是/app/xxx呢,由于Dockerfile中配置的工做区为app。

一番替换以后,咱们来从新走一遍build,此次改个名字(固然能够删除以前的无效镜像跟容器),从新运行下咱们再看容器的状态,咦好像是能够了,那咱们来访问下,此次用主机访问这个地址,看到这个界面以后,不由感慨,路漫漫啊。

测试

测试

小结

这篇一样没有测试,由于一路都捎带着测试,全部的走完一遍以后,我在想,为什么会这么麻烦,按说通用的话,一个文件夹移哪都能用才对,至于相对路径我也是试过,可是没有效果,应该仍是那个配置查找路径的属性问题,咱们仍是须要先指明从哪读类库,后续看看有啥新进展的话,我仍是会继续更新的。

在net core刚开始的时候,咱们都已经知道这是一个要跨平台的,可是直到如今我才开始鼓捣linux下部署,实在是惭愧,一直在windows下让我有点儿过于温馨(固然仍是由于windows服务器到期了),仍是来一句结束吧,咱们老是想的太多,而却作的太少,总觉得理所固然,可现实四处碰壁,生活在于折腾,而折腾令人进步,树欲静而风不止,那就可劲儿刮吧。

 

 

from:https://www.cnblogs.com/AprilBlank/p/11757027.html

相关文章
相关标签/搜索