• .NET Core RC2在Linux下部署


    前言

    目前ASP.NET Core RC2已经正式发布了,可以参考如下链接:

    https://blogs.msdn.microsoft.com/dotnet/2016/05/06/net-core-rc2-improvements-schedule-and-roadmap/

    https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-net-core-rc2/

     虽然提供了关于publish的文档(见参考资料部分),但是目前的文档有几个问题:

    1. 针对Ubuntu的,我们公司服务器都是Centos,所以文档里的安装方式对于我们来说不合适,所以这里详细说明在Centos 7.x版本上如何发布.NET Core RC2应用程序。
    2. 这个文档明显过时了,没有及时更新,目前还是基于RC1的,而不是RC2的。(比如需要配置commands,这明显过时了,因为RC2中已经移除了commands设置)
    3. 这个文档有错误,清理socket资源部分,应该用 -S 而不是 -f 来判断socket文件是否存在。

    环境搭建

    操作系统

    要求是Centos 7.1以上版本即可,这里使用Centos 7.2

    安装.NET Core

    可以参考.NET Core的官方安装说明,https://www.microsoft.com/net/core#centos。 实际安装时发现.NET Core的安装包在公司虚机上无法下载。解决方案:

    1. 可以先下载到本地(这也比较慢),然后上传到服务器root家目录下
    2. 将文件解压到 /root/dotnet 目录下
    3. 在/usr/local/bin目录下创建 /root/dotnet/dotnet 文件的连接档:ln -s /root/dotnet/dotnet /usr/local/bin/dotnet
    4. 创建新目录,在这个目录下可以运行 dotnet new、dotnet restore、dotnet run,来验证dotnet运行环境是否安装成功

    安装Nginx

    主要参考Nginx官方文档:https://nginx.org/en/linux_packages.html

    1. 创建/etc/yum.repos.d/nginx.repo,内容如下: 
      [nginx]
      name=nginx repo
      baseurl=http://nginx.org/packages/centos/7/$basearch/
      gpgcheck=0
      enabled=1
    2. yum install nginx,就可以安装了

    安装Supervisor

    1. 先安装setuptools,https://pypi.python.org/pypi/setuptools
    2. 然后运行easy_install supervisor,即可完成Supervisor的安装了
    3. 配置supervisor,在/etc/supervisor目录下添加supervisord.conf,内容如下: 
      [supervisord]
      logfile = /tmp/supervisord.log
      logfile_maxbytes = 50MB
      logfile_backups=10
      loglevel = info
      pidfile = /tmp/supervisord.pid
      nodaemon = false
      minfds = 1024
      minprocs = 200
      umask = 022
      user = root
      identifier = supervisor
      directory = /tmp
      nocleanup = true
      childlogdir = /tmp
      strip_ansi = false
    4. 在bash下运行supervisord,如果没有错误的话就说明supervisor可以运行了
    5. 配置为Service。在/usr/lib/systemd/system目录下添加supervisord.service文件,内容如下: 
      [Unit]
      Description=Supervisor daemon 

      [Service]
      Type=forking
      ExecStart=/usr/bin/supervisord
      ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
      ExecReload=/usr/bin/supervisorctl $OPTIONS reload
      KillMode=process
      Restart=on-failure
      RestartSec=42s [Install]
      WantedBy=multi-user.target
    6. 启动服务,service supervisord start

    网站发布

    1. 将网站监听的URL修改为可配置的,这样方便修改,示例代码如下

      IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("config.json").Build();
      var host = new WebHostBuilder()
         .UseConfiguration(configuration)
         .UseKestrel()
         .UseContentRoot(Directory.GetCurrentDirectory())
         .UseIISIntegration()
         .UseStartup<Startup>()
         .Build();
      
         host.Run();
      {
      "server.urls": "http://+:5000" //注意这里用+,而不是localhost,用localhost的话只能在本机访问,其他机器不能访问
      }
    2. 先运行dotnet publish命令发布网站,将网站上传到Linux服务器。然后进入网站目录,运行dotnet app.dll,启动网站。在浏览器查看 http://serverip:5000/ 是否可以正常响应。如果这步成功的话,说明.NET Core相关的已经发布成功了。接下来开始配置Nginx。

    配置Nginx作为反向代理服务器

    1. 修改Nginx的运行帐号为root。编辑/etc/nginx/nginx.conf文件,将其中user配置改为root
    2. 将网站监听的URL修改为监听unix socket,这里修改为:http://unix:/var/aspnet/WebApplication1/kestrel.sock
    3. 修改Nginx的配置,添加.NET Core的WebServer配置,注意修改proxy_pass配置,如下: 
      server{
        listen 8080;
        server_name localhost;
        location / {
           proxy_pass http://unix:/var/aspnet/WebApplication1/kestrel.sock;
           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;
        }
      }
    4. 访问 http://serverip:8080 验证是否可以正常响应

    需要注意的几点

    1. Nginx是通过unix socket将请求转发给.NET Core的网站,这里是向一个socket文件写入请求来实现的。所以运行Nginx的帐号需要有向socket文件的写权限,我这里简单配置为root帐号
    2. 如果遇到dotnet进程以外关闭的情况,.sock文件可能不会自动清理,导致.sock资源泄漏。此时需要清理下.sock。否则启动网站的话会遇到下面的错误: 
      Unhandled Exception: System.AggregateException: One or more errors occurred. (Error -98 EADDRINUSE address already in use) ---> Microsoft.AspNetCore.Server.Kestrel.Networking.UvException: Error -98 EADDRINUSE address already in use
    3. 监听socket时,.sock文件所在目录必须首先存在,不存在的话需要先创建,否则报下面的错误: 
      Unhandled Exception: System.AggregateException: One or more errors occurred. (Error -13 EACCES permission denied) ---> Microsoft.AspNetCore.Server.Kestrel.Networking.UvException: Error -13 EACCES permission denied
    4. 如果有问题的话,可以看下Nginx的error.log和access.log来排查问题。路径为:/var/log/nginx

    监控网站应用

    1. 在网站根目录下添加web.sh的bash脚本,内容如下,这个脚本的主要目的是每次启动网站前都先清理socket资源,避免因为socket没有清理导致网站无法启动: 
      if [ -S "/var/aspnet/WebApplication1/kestrel.sock" ]; then
        rm "/var/aspnet/WebApplication1/kestrel.sock"
      fi
      dotnet /root/WebApp2/WebApplication1.dll
    2. 在上面的supervisord.conf文件中追加如下配置: 
      [program:WebApplication1]
      command=bash /root/WebApp2/web.sh
      autostart=true
      autorestart=true
      stderr_logfile=/root/WebApp2/WebApplication1.err.log
      stdout_logfile=/root/WebApp2/WebApplication1.out.log
      environment=Hosting__Environment=Production
      user=root
      stopsignal=INT
    3. 重启Supervisor service 
      service supervisor stop
      service supervisor start

    参考资料

    1. https://docs.asp.net/en/1.0.0-rc2/publishing/linuxproduction.html
  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/hamu/p/5587220.html
Copyright © 2020-2023  润新知