温州定制网站建设电话,郑州大型网站建设价格,较好的网站模板,网站建设pdf下载随着2020进入4季度#xff0c;.NET5正式版也已经与大家见面了。不过#xff0c;尽管 .NET Core发布已经有四五年的时间#xff0c;但到目前为止#xff0c;依旧有很多.NET开发者在坚守者.NET4#xff0c;原因不尽相同#xff0c;但最大的问题可能还是不熟悉Linux#xf… 随着2020进入4季度.NET5正式版也已经与大家见面了。不过尽管 .NET Core发布已经有四五年的时间但到目前为止依旧有很多.NET开发者在坚守者.NET4原因不尽相同但最大的问题可能还是不熟悉Linux更别说在Linux服务器中部署.NET服务了。而 .NET Core在飞速发展的这四五年里微服务、云原生等概念也在飞速发展。.NET Core在微服务和云原生的场景下也已日趋稳定生态也在逐步完善相信.NET5正式发布后对于我们苦逼多年了的.NET开发者绝对是个机遇。所以你还有什么理由继续坚守.NET4呢笔者在开始使用 .NET Core时在如何部署到Linux服务器上也是踩了挺多坑顺便也总结了一些经验在此分享给大家如有更好方案还望不吝赐教。准备工作操作系统。操作系统可选择你比较熟悉的Linux发行版如果你是第一次接触Linux那我推荐使用CentOs因为本文的内容都是在CentOs中进行演示的。至于系统的安装你可以选择云服务器或者使用虚拟机安装。虚拟机安装CentOs的方式比较简单在此就不赘述了。连接工具笔者推荐使用XSHELL作为连接工具下载地址https://www.netsarang.com/zh/xshell-download/安装完成后打开软件点击左上角的新建回话按钮打开新建回话框如下图所示在【主机】中填写服务器的ip地址然后点击【连接】按钮会依次提示输入用户名和密码。连接成功的界面如下所示文件上传工具要想把服务部署到Linux服务器那就必须把文件传输到服务器中这是句废话。根据不同的使用场景笔者推荐两种方案分别是XFTP工具上传和git仓库中转。使用XFTP上传的方式需要在开发的机器上安装此工具下载地址https://www.netsarang.com/zh/xftp-download/安装完成后可以通过XSHELL一键打开XFTPXFTP打开后在软件的右侧可以切换要上传文件的目标路径然后将文件拖到右侧释放后就会自动上传了如下图所示使用git仓库进行中转的方式是笔者比较推荐的方式因为在频繁的迭代更新中如果通过现在本地编译发布后再将文件拷贝到服务器这个操作流程稍显繁琐。而通过git仓库周转的方式则相对比较简单开发者仅需要将开发好的代码推到git仓库然后在服务器中执行buildpublish等操作少了繁琐的拷贝文件的过程同时由于build和publish都是在服务器中执行那么我们就可以通过编写部署脚本的方式可以最终实现一键快速部署。使用git的方案需要在服务器安装git客户端并配置ssh公钥配置公钥的目的是拉取私有的仓库公共参考无需配置公钥。下面来看具体的操作步骤首先执行如下命令安装git客户端yum -y install gitgit安装后通过如下命令生成sshkey:# 这里的xxxxx.com只是生成的sshkey的名称并不约束货要求具体命名为某个邮箱。ssh-keygen -t rsa -C xxxxx.com 按照提示按三次回车即可生成sshkey如下图所示通过如下命令可查看公钥cat ~/.ssh/id_rsa.pub复制生成后的sshkey配置到代码仓库的公钥中。下面简单演示下gitee代码托管平台下如何配置公钥其他平台大同小异。进入私有仓库的【管理】页面找到【公钥管理】点击【添加公钥】将刚刚生成的公钥复制过去如下图所示添加后在终端中输入如下命令ssh -T gitgitee.com次使用需要确认并添加主机到本机SSH可信列表如下图所示输入yes后出现类似于Hi xxx的字样则表示git公钥配置成功了。.NET Core SDK和运行时.NET运行时是.NET程序运行的先决条件而SDK并不是必须的但如果通过git方式进行文件中转的话就涉及到在服务器端进行编译所以SDK也需要安装。注docker部署方式无需在服务器安装SDK和运行时下文回提到下面一起看看在CentOs中如何安装SDK和运行时其他环境可参考官方文档https://docs.microsoft.com/zh-cn/dotnet/core/install/linux。运行如下命令将 Microsoft 包签名密钥添加到受信任密钥列表并添加 Microsoft 包存储库。sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm通过如下命令安装SDK:sudo yum install -y dotnet-sdk-3.1.NET Core SDK 使你可以通过 .NET Core 开发应用。如果安装 .NET Core SDK则无需安装相应的运行时。通过如下命令安装运行时sudo yum install -y aspnetcore-runtime-3.1注上述命令中的最后的3.1表示的是版本号如果安装其他版本修改对应的版本号即可。参考资料https://dotnet.microsoft.com/download/dotnet-core发布程序到服务器在准备工作中已经介绍了两种将文件发布到服务器的方式下面具体演示下步骤。通过XFTP发布到服务器首先准备好要发布的程序下图是我创建的一个.NET Core3.1的示例代码打开vs的程序包管理器控制台执行如下命令dotnet publish -o ./publish执行结果如下图所示在上图可以看到发布之后的文件的路径为D:\code\test\BuildTest\publish\打开XFTP将publish文件夹拖到右侧窗口即可完成上传。通过git中转。首先将代码推送到git仓库中复制SSH地址。如下图所示然后再服务器中执行克隆命令mkdir codecd codegit clone gitgitee.com:billsking/build-test.git执行结果如下图所示此时项目代码已经下载到服务器中切换工作到解决方案所在的目录cd build-test然后我们需要执行dotnet publish命令对程序进行编译发布。dotnet publish -o /root/web/publish执行完毕后编译后的文件将被保存在/root/web/publish目录中。将工作目录切换到/root/web/publish执行如下命令dotnet BuildTest.dll执行结果如下图到这里为止咱们的程序已经在linux服务器运行起来了。但直接通过dotnet命令仅适合临时测试使用并不能成为生产场景的解决方案。下面进来跟我一起了解下可用于生产环境的部署方式吧。SupervisorNginx组合Supervisor是用Python开发的一套通用的进程管理程序能将一个普通的命令行进程变为后台daemon并监控进程状态异常退出时能自动重启。下面是Supervisor安装方法。执行如下命令yum install -y supervisor执行以上代码如果提示没有可用软件包 supervisor。则需要先安装EPEL源后再执行上面的命令。安装EPEL源的命令如下yum install -y epel-release设置开机启动systemctl enable supervisord启动supervisordsystemctl start supervisord查看状态systemctl status supervisord通过vi命令或者XFTP修改配置文件开启web界面访问如下图所示分别取消inet_http_server等四个配置的注释执行如下命令重新加载配置文件supervisorctl reload然后在浏览器打开http://你的ip:9001输入用户名密码后如图所示看到这个界面就表示supervisor安装完成了。切换到/etc/supervisord.d目录在此目录创建ini文件内容如下:[program:buildtest] ;表示程序名称用于在supervisor中显示无特殊意义。command/bin/bash -c dotnet BuildTest.dll; 输入执行命令这里表示执行的是dotnet BuildTest.dlldirectory/root/web/publish ; 应用程序根目录autostarttrue ; 是否自动启动当 supervisor 加载该配置文件的时候立即启动它autorestarttrue ; 是否自动重启 程序异常退出后自动重启logfile_maxbytes50MB ; 该配置文件输出单个日志文件的大小默认50Mlogfile_backups10 ; 日志备份个数loglevelinfo ; 记录日志级别stdout_logfile/root/data/logs/buildtest/buildtest.out.log ; 指定标准输出日志文件environmentASPNETCORE_ENVIRONMENTProduction;环境变量。userroot ;启动服务的用户redirect_stderrtrue;把 stderr 重定向到 stdout默认 false注stdout_logfile指向的文件夹一定要先创建否则无法启动。然后执行如下命令supervisorctl reload命令执行成功后 刷新浏览器可以看到如下界面当界面显示running时则表示我们我们刚刚配置的应用程序运行起来了。但现在还存在一个问题我们的应用程序默认是绑定的5000端口如果要指定80端口或者配置域名该怎么处理呢下面就该nginx登场了。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件IMAP/POP3代理服务器在BSD-like 协议下发行。其特点是占有内存少并发能力强事实上nginx的并发能力在同类型的网页服务器中表现较好中国大陆使用nginx网站用户有百度、京东、新浪、网易、腾讯、淘宝等。来源自百度百科安装方式参考http://nginx.org/en/linux_packages.html#RHEL-CentOS安装先决条件yum install -y yum-utils设置yum存储库先创建一下内容的文件/etc/yum.repos.d/nginx.repo[nginx-stable]namenginx stable repobaseurlhttp://nginx.org/packages/centos/$releasever/$basearch/gpgcheck1enabled1gpgkeyhttps://nginx.org/keys/nginx_signing.keymodule_hotfixestrue[nginx-mainline]namenginx mainline repobaseurlhttp://nginx.org/packages/mainline/centos/$releasever/$basearch/gpgcheck1enabled0gpgkeyhttps://nginx.org/keys/nginx_signing.keymodule_hotfixestrue默认情况下使用稳定 nginx 包的存储库。如果要使用主线 nginx 包请运行以下命令yum-config-manager --enable nginx-mainline运行如下命令安装nginxyum install -y nginx设置开机启动systemctl enable nginx启动nginxsystemctl start nginx此时就可以在浏览器通过ip访问了http://你的ip界面如下nginx安装完成后切换到/etc/nginx/conf.d目录修改default.conf文件内容如下所示server {listen 80;server_name localhost;location / {proxy_pass http://0.0.0.0:5000;}error_page 500 502 503 504 /50x.html;location /50x.html {root /usr/share/nginx/html;}}保存后执行如下命令重新加载配置nginx -s reload然后再次访问http://你的ip幸运的话你应该可以看到如下的界面表示你的.NET Core程序已经完美运行在linux系统了。如果你不幸的看到了如下界面不要着急继续往下看。出现这个问题的原因是因为SeLinux的限制执行如下命令之后再刷新页面setenforce 0 如果还是看到的错误页面就需要去查看nginx的日志了默认的日志路径为/var/log/nginx通过setenforce 0命令只是临时实效重启后回失效的。一劳永逸的做法是修改/etc/selinux/config 文件 将SELINUXenforcing改为SELINUXdisabled然后重启机器。后面如果你需要更新你的应用程序只需要将代码提交到git仓库然后在服务器中执行git pull和dotnet publish就行了。如果你对shell比较熟悉的话还可以通过编写shell命令一键执行应用程序的更新下面是我写的示例# !/bin/bashcd /root/code/build-testgit pulldotnet publish -o /root/web/publishsupervisorctl restart buildtest将上述的代码保存问sh文件上传到服务器并设置权限。如下图所示代码提交到git仓库后执行如下命令./build.sh执行结果如下图所示总结一下这种方式需要在服务端安装两个软件supervisor和nginxsupervisor一个作为守护线程用于维护应用程序的生命周期的。nginx则是作为反向代理使用。维护起来相对麻烦那么有没有一个像IIS一样既可以维护应用程序的生命周期又可以对外暴露服务呢答案是肯定的继续往下看。Jexus Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关服务器以支持ASP.NET、ASP.NET CORE、PHP为特色同时具备反向代理、入侵检测等重要功能。可以这样说Jexus是.NET、.NET CORE跨平台的最优秀的宿主服务器如果我们认为它是Linux平台的IIS这并不为过因为Jexus不但非常快而且拥有IIS和其它Web服务器所不具备的高度的安全性。同时Jexus Web Server 是完全由中国人自主开发的的国产软件真正做到了“安全、可靠、可控” 具备我国党政机关和重要企事业单位信息化建设所需要的关键品质。以上内容摘自jexus官网https://www.jexus.org/废话不多说直接进入正题首先是安装。jexus的安装非常简单执行如下命令curl https://jexus.org/release/x64/install.sh|sudo sh注如果在这之前你已经安装了nginx需要先将nginx绑定的80端口释放或者卸载nginx。安装完成后切换到/usr/jexus目录修改/usr/jexus/siteconf目录下的default内容如下所示port80 #端口hosts* #域名AppHost{cmddotnet BuildTest.dll; root/root/web/publish; port0}然后执行如下命令/usr/jexus/jws restart当你看到执行结果为OK时即可认为应用程序已经启动了。最后执行如下命令看下执行的结果ps -aux关于jexus更详细的使用说明请参考官方文档。DockerNginx或Jexus上面讲到的 不管是通过supervisornginx还是jexus都需要在服务器安装 .NET Core的SDK或者运行时假如咱们有好多个应用程序有的用 .NET Core2.1有的用 .NET Core3.1有的用.NET5那么上面的做法就需要咱们分别安装对应的SDK或者运行时对于维护还是比较麻烦的。Docker的出现可以完美解决上述问题。关于Docker的介绍有兴趣的可自行百度。下面来跟我一起来看下如何安装并使用Docker。执行如下命令curl -fsSL get.docker.com -o get-docker.shsudo sh get-docker.sh --mirror Aliyun执行这个命令后脚本就会自动的将一切准备工作做好并且把Docker的稳定版本安装在系统中。执行如下命令设置docker开机启动systemctl enable docker执行如下命令启动docker:systemctl start docker安装docker之后我们需要在代码里增加dockerfile文件。什么不会docker不要紧万能的Visual Studio可以帮你自动生成。在解决方案中右击项目名称依次选择【添加】【Docker支持】如下图所示生成的dockerfile文件如下所示FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS baseWORKDIR /appEXPOSE 80FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS buildWORKDIR /srcCOPY [BuildTest/BuildTest.csproj, BuildTest/]RUN dotnet restore BuildTest/BuildTest.csprojCOPY . .WORKDIR /src/BuildTestRUN dotnet build BuildTest.csproj -c Release -o /app/buildFROM build AS publishRUN dotnet publish BuildTest.csproj -c Release -o /app/publishFROM base AS finalWORKDIR /appCOPY --frompublish /app/publish .ENTRYPOINT [dotnet, BuildTest.dll]将代码推送到git仓库然后再linux服务器中拉取最新代码。切换到/root/code/build-test目录执行如下命令拉取最新代码git pull然后执行如下命令将代码打包为镜像docker build -f ./BuildTest/Dockerfile -t buildtest .由于首次打包镜像的时候涉及到拉取.NET Core的官方镜像拉取速度可能较慢请耐心等待。打包完成后执行如下命令可查看当前服务器已存在的镜像docker images镜像打包完成后我们就可以通过docker run运行下命令如下docker run -p 82:80 -dit --restartalways --name buildtest buildtest执行结果如下通过浏览器访问http://ip:82。如无意外你将看到你的应用程序已经成功运行了。相同的道理我们也是可以通过编写shell脚本的方式实现一键更新应用程序的。在/root目录中创建dockerbuild.sh文件文件内容如下# !/bin/bashcd /root/code/build-testgit pullimtag$(uuidgen |sed s/-//g)docker build -f ./BuildTest/Dockerfile -t buildtest:${imtag} .docker stop buildtestdocker rm buildtestdocker run -dit --restartalways --name buildtest -p 82:80 buildtest:${imtag}给dockerbuild.sh文件设置执行权限命令如下chmod 777 dockerbuild.sh当有新代码推送到git仓库时进入服务器执行dockerbuild.sh即可快速更新应用程序。到这里.NET Core部署到linux服务器的方案已“基本”介绍完毕了。为什么说是“基本”呢不知道大家有没有发现虽然目前的方案可以实现一键部署更新但。。。。我们还是需要登陆到linux服务器去执行这个命令显然这不是最好的方法。有没有更好的方案呢如果当我们提交给git仓库后自动出发部署命令是不是就更方便了呢答案是肯定的我们可以借助jenkins来实现。限于篇幅本篇文章就不讲解了如有兴趣你也可以先自行研究或者敬请期待下次的讲解。最后说明下以上的方案还是存在很多的问题对于小型团队已经够用大型项目的终极解决方案应该是基于k8s实现的devops。其实k8s实现devops的原理和我上述介绍的方案基本一致。借助与gitlab的runner或者jenkins监听git仓库的状态当发现指定的分支发生变化后打包镜像然后通过替换k8s的deployment的镜像来实现自动更新。同时k8s实现了弹性伸缩、滚动更新等功能。