• .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
  • 相关阅读:
    [原] JT SQL Server 性能调优札记之三
    [转]SQL Server 2000执行计划成本(4/5)
    [转]Oracle的Online Redo Log 相关操作
    [原]成功在ESX上搭建SQL Server 2005集群
    我的软设、系分考试经验(书)
    [转]Linux软RAID的技术概要及实现
    [原]Console小技巧——七彩输出
    SQL SERVER 2005 压缩日志及数据库文件大小
    [转]SQL Server 2000执行计划成本(2/5)
    [原]在SQL Server 2005 中使用.net程序集的一项注意
  • 原文地址:https://www.cnblogs.com/hamu/p/5587220.html
Copyright © 2020-2023  润新知