zoukankan      html  css  js  c++  java
  • 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目

    目录索引 

    【无私分享:ASP.NET CORE 项目实战】目录索引

     

    简介

      

      ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下,我们windows上的项目如何发布项目到Linux上运行。我这里有个在windows上搭建过的程序,我们主要演示如何在linux上运行,所以大家不要纠结于这些,大家可以新建一个web项目尝试一下。

      

    安装.NET Core SDK for CentOS

       一、.Netcore 1.0 微软有详细的安装命令,可以参考 Install .NET Core SDK

      ① 安装 libicu 依赖: sudo yum install libunwind libicu

      

      安装成功:

      

        ② 下载 SDK 压缩包:curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=809131

       

      ③ 解压缩:sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet

      

      ④ 创建连接:sudo ln -s /opt/dotnet/dotnet /usr/local/bin

      

       二、.Netcore 2.0 微软有详细的安装命令,可以参考 Install .NET Core SDK

    (注意:安全之前要删除旧的 .net core 版本 删除home目录下的dotnet)

    注册 Microsoft 签名密钥:sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc

    添加 Microsoft 产品源:sudo sh -c 'echo -e "[packages-microsoft-com-prod] name=packages-microsoft-com-prod baseurl=https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod enabled=1 gpgcheck=1 gpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'

      更新:sudo yum update

      安装 libicu 依赖: sudo yum install libunwind libicu

      安装sdk: sudo yum install dotnet-sdk-2.1.4

         将 dotnet 添加到 PATH:export PATH=$PATH:$HOME/dotnet

    dotnet --version

    三、NetCore 2.1.1

    The specified framework 'Microsoft.AspNetCore.App', version '2.1.1' was not found.

    注册源:

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

     安装SDK

    sudo yum update
    sudo yum install aspnetcore-runtime-2.1

    测试安装是否成功

      通过 dotnet --info  来查看一下,出现如下界面,表示成功:

      

    测试项目运行

      注意:不熟悉Linux的朋友请注意,Liunx下路径是区分目录大小写的。

      ① 新建一个目录:mkdir TestApp

      

      ② 进入目录:cd TestApp

      

      ③ 新建一个默认的 web 项目:dotnet new -t web

      

      ④ 还原包:dotnet restore

      这个时间可能比较长,看网速了,大家要耐心等待。

      

      ⑤ 我们来运行一下:dotnet run

      

     

    发布我们的项目到Linux

      大家可以使用Ftp等方式将文件发布到服务器上,我这里直接发布到本地文件夹中,然后通过FileZilla 发送到服务器上。

      发布项目的方式有多种,比如可以使用 dotnet publish 命令,我们这里使用 VS :

      首先,我们打开 Project.json 来添加几个发布的运行时(这一步可以不要,如果不配置这里,那么发布的时候是 Any,我们待会讲到

      

      

      然后,右击我们的项目,选择发布:

      

      新建一个发布配置文件,发布方法选择 文件系统

      

      设置里,我们选择目标运行时:centos.7-x64在上面,我们讲到 Project.json 里添加了 几个运行时,如果没有那一步,那么这里 没有选项,只有一个 Any

      

      然后点击发布,我们把发布完的文件上传到CentOS上:我放到了 Wwwroot 目录下

      

      

      我们来编译我们的文件:dotnet XXX.dll

      这里先为大家演示一个 错误 :我的 wkmvc.dll 是在 Wwwroot 目录下的 ,所以 我执行命令(注意路径大小写,Linux区分大小写,我们上面提到) dotnet Wwwroot/wkmvc.dll

      

      

      显示成功了,我们打开浏览器,输入 localhost:5000

      

      是空白的,我们修改一下我们的程序,输出一下日志看看:

      

      这是什么原因呢?为什么没找到Index.cshtml呢?请大家再次注意一下 我们的 Content root path,答案是 她没有对 root 的操作权限的,我们来对比一下 我们安装过程中 测试成功的 web  和 我们这个 web 的 Content root path

      

      我们来尝试一下:我们进入Wwwroot目录下,然后执行 dotnet wkmvc.dll

      

      

      我们再次打开浏览器,输入 localhost:5000

      

      是不是 OK 了,我们来进入我们的区域的 登录页 测试一下:

      

      

      也没有问题,到此,项目就运行成功了,但是在实际中,我们可能还要安装 nginx 、配置我们的 FireWall 以及配置守护服务 Supervisor 等等,这里就不演示了。

      

      既然大家不是很了解,或者网上找资料比较繁琐,对于 nginx firewall 以及 supervisor 的配置,我就再一步一步给大家演示一下。

    安装Nginx

      Nginx 的安装比较简单,就三条命令:

      ① curl -o  nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

       

      rpm -ivh nginx.rpm

      

      

      ③ yum install nginx

     

       启动 Nginx:systemctl start nginx 

      设置开机启动(linux宕机、重启会自动运行nginx不需要连上去输入命令):systemctl enable nginx

     

       

    配置防火墙

      ① 开放80端口:firewall-cmd --zone=public --add-port=80/tcp --permanent

      ② 重启防火墙以使配置即时生效:systemctl restart firewalld

       

      

      我们来测试一下Nginx是否可以访问:

      

    配置Nginx对ASP.net Core 应用的转发

      修改 Nginx 的 default.conf 文件(目录:/etc/nginx/conf.d/default.conf

      

      将内容替换为(配置Nginx转发):

      

      server {

          listen 80;
          location / {
              proxy_pass http://localhost:5000;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection keep-alive;
              proxy_set_header Host $host;
              proxy_cache_bypass $http_upgrade;
          }
      }

      上传覆盖default.conf文件

      重新加载,即时生效:nginx -s reload 

      我们来测试一下:

      

      

      这是什么鬼?这个问题是由于SELinux保护机制所导致,我们需要将nginx添加至SELinux的白名单。

      我们通过命令来解决这个问题:

      ① yum install policycoreutils-python

      

     

      ② sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx

      

      

      ③ sudo semodule -i mynginx.pp

      我们再次尝试访问:

      

    Supervisor 守护服务

      为什么要这个玩意呢?

      我们先来看下我们存在的问题:① 我们在上面演示中,运行我们的应用都是通过 dotnet  ***.dll 或者 dotnet run ,也就是我们的 ASP.NET Core应用程序运行在shell之中,如果关闭shell则会发现ASP.NET Core应用被关闭,从而导

                      致应用无法访问。

                     ② 如果ASP.NET Core进程意外终止那么需要人为连进shell进行再次启动。

                     ③ 如果服务器宕机或需要重启我们则还是需要连入shell进行启动。

      那么要解决这些问题,我们就必须要实现这么一个功能:如果ASP.NET Core 意外终止,那么我们要自动重启;如果服务器服务器重启后,我们要有个类似脚本命令一样,自动执行 dotnet 命令。

      现在正好有个基于 Python 开发的工具 Supervisor 可以解决我们上述问题:

      安装Supervisor

        1.1:yum install python-setuptools

        1.2:easy_install supervisor

       ② 配置Supervisor

       mkdir /etc/supervisor

       echo_supervisord_conf > /etc/supervisor/supervisord.conf  

      ③ 配置 Supervisor 对 Asp.net Core 应用的守护

      这里有个重要说明:很多文档包括微软的官方文档都是 在/etc/supervisor 目录下 新建一个目录 conf.d  然后在conf.d 目录下新建一个conf文件,将下面这段代码放到这个文件里,然后修改 /etc/supervisor/supervisord.conf的最后一行 [include] files= relative/directory/*.ini 修改为 [include] files = /etc/supervisor/conf.d/*.conf,但是我一直没有成功,尝试了各种办法,排查了各种错误,都没有成功,所以,我直接写在了/etc/supervisor/supervisord.conf里(如下),成功了,所以,大家可以尝试以下上述。

      

      修改 supervisord.conf 文件(目录:/etc/supervisor/supervisord.conf),添加程序:

      [program:wkmvc]

      command=dotnet /root/Wwwroot/wkmvc.dll
      directory=/root/Wwwroot/
      autostart=true
      autorestart=true
      stderr_logfile=/var/log/wkmvc.err.log
      stdout_logfile=/var/log/wkmvc.out.log
      environment=ASPNETCORE_ENVIRONMENT=Production
      user=root
      stopsignal=INT

      

      如果服务已经启动,则需要使用 supervisorctl reload 命令来使新的配置生效,当然,我们这里并没有启动,所以不需要这一步。

      执行:  

      supervisord -c /etc/supervisor/supervisord.conf

      启动服务,然后我们来看下:

      ps -ef | grep wkmvc

     

       

      

      配置Supervisor开机启动

      新建一个“supervisord.service”文件 

      # dservice for systemd (CentOS 7.0+)
      # by ET-CS (https://github.com/ET-CS)
      [Unit]
      Description=Supervisor daemon

      [Service]
      Type=forking
      ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
      ExecStop=/usr/bin/supervisorctl shutdown
      ExecReload=/usr/bin/supervisorctl reload
      KillMode=process
      Restart=on-failure
      RestartSec=42s

      [Install]
      WantedBy=multi-user.target

      将文件拷贝至:“/usr/lib/systemd/system/supervisord.service”

      systemctl enable supervisord

      

      验证一下是否为开机启动:systemctl is-enabled supervisord

       

     

    希望跟大家一起学习Asp.net Core 

    刚开始接触,水平有限,很多东西都是自己的理解和翻阅网上大神的资料,如果有不对的地方和不理解的地方,希望大家指正!

    虽然Asp.net Core 现在很火热,但是网上的很多资料都是前篇一律的复制,所以有很多问题我也暂时没有解决,希望大家能共同帮助一下!

     

    原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com

     

  • 相关阅读:
    Java SE 第十二,三,四,五六讲 Java基础知识回顾
    Java SE第二十一 抽象类
    Java SE 第二十讲 static与final关键字详解
    使用AspNetPager分页的范例
    AJax错误"WebForm1"没有定义的javascript错误的解决方法
    如何为自定义的控件在工具箱中自定义个性化的图标
    C#面向对象名词比较(转ttyp 的文章)
    vs2003自带的报表使用load("rpt.rpt")方式,显示不出报表工具的图片解决方案
    DropDownlist常见的小错误
    Ajax获取数据库中的字段
  • 原文地址:https://www.cnblogs.com/yuangang/p/5787122.html
Copyright © 2011-2022 走看看