.NET Core RC2跨平台部署

前言

目前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
时间: 2024-08-09 05:11:21

.NET Core RC2跨平台部署的相关文章

使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台

使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台. 前面讲解了VSCode开发调试 .NET Core.都只是在windows下运行. .NET Core真正的核心是跨平台,我们现在来了解学习 .NET Core 跨平台. 在windows 下开发.NET Core 应用程序,然后部署到Linux 平台运行. .NET Core RC2版基本上已经完成. https://github.com/dotnet/cli/milestones 可以看到 1.0.0-rc2

【dotnet跨平台】微软昨天宣布正式发布.NET Core RC2和.NET Core SDK Preview 1,还有Entity Framework Core RC2

?? [dotnet跨平台]微软昨天宣布正式发布.NET Core RC2和.NET Core SDK Preview 1,还有Entity Framework Core RC2 期待已经的版本终于在昨天发布了 微软昨天宣布正式发布.NET Core RC2和.NET Core SDK Preview 1:https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-net-core-rc2/ 微软昨天宣布正式发布Entity Fra

.NET Core跨平台部署

.NET Core跨平台部署 1. Windows-IIS 大家对于在IIS上部署.NET站点已经驾轻就熟了,部署.NET Core也没有什么本质区别,但是这其中仍然有一些细节是不同的,下面记录了一些我在部署时遇到的问题 1.1 安装.NET Core Windows Server Hosting 要在IIS上运行ASP.NET Core,必须安装.NET Core Windows Server Hosting 安装完成后最好重启IIS 如果没有安装该组件就直接打开部署的网站会出现 500.19

ASP.NET Core 1.0 部署 HTTPS

ASP.NET Core 1.0 部署 HTTPS ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1) 提示 更新时间:2016年01月23日. 在目前介绍 ASP.NET Core 1.0 的中英文文章中,我没有找到关于部署HTTPS的, 究其原因,除了暂时无法跨平台外,就算是很少人有这个需求,但我还是决定写一下. 警告 目前( 1.0.0-rc1-update1 )仅支持完整版的dnx451,dnxcore5需要rc2的支持.目前只能运行在Win

ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)

ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)? 警告 您当前查看的页面是未经授权的转载! 如果当前版本排版错误,请前往查看最新版本:http://www.cnblogs.com/qin-nz/p/aspnetcore-using-https-on-dnx451.html 提示 更新时间:2016年01月23日. 在目前介绍 ASP.NET Core 1.0 的中英文文章中,我没有找到关于部署HTTPS的, 究其原因,除了暂时无法跨平台外,就算是

win10与ubuntu下演示运行.net core rc2 1.0.0.3002702程序

随着.net core rc2(1.0.0.002702)发布的同时,我们也来在本地 win10与ubuntu玩一下吧. 先简单说下.net core ,在.net core rc1中用的是dnx 工具链可参考http://www.cnblogs.com/shanyou/p/4589930.html, .net core rc2中完全用dotnet工具链代替,具体说明见 dotnet new:初始化一个控制台C#项目 dotnet restore:恢复项目的依赖包 dotnet build:构建

ASP.NET Core 1.0 部署 HTTPS (.NET Core 1.0)

这两个月要做一个项目,正逢ASP.Net Core 1.0版本的正式发布.由于现代互联网的安全要求,HTTPS加密通讯已成主流,所以就有了这个方案. 本方案启发于一个旧版的解决方案: ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1) http://www.cnblogs.com/qin-nz/p/aspnetcore-using-https-on-dnx451.html?utm_source=tuicool&utm_medium=referral

关于.net core程序的部署

最近发布.net core程序的时候,发现它是可以独立部署的,它支持如下两种部署方式: 依赖框架的部署FDD.只发布我们的程序,运行前用户需要手动安装.net core runtime. 独立部署SCD.发布我们的程序和.net core runtime,即我们的程序可以运行在没有安装..net core runtime的机器上. 大多数时候,我们采用的是FDD模式,这样发布的东西比较少,就几个dll就够了,并且能够跨平台,经常是windows版本写好的拿到linux上直接运行,非常方便. 一个

ASP.NET Core使用TopShelf部署Windows服务

asp.net core很大的方便了跨平台的开发者,linux的开发者可以使用apache和nginx来做反向代理,windows上可以用IIS进行反向代理. 反向代理可以提供很多特性,固然很好.但是还有复杂性,我们也可以使用windows service来直接启动kestrel. asp.net core官方网站提供了一种基于windows服务部署的方法:在 Windows 服务中托管 ASP.NET Core 这种方式需要修改代码,然后部署的时候,使用命令行创建.安装服务,然后再启动. 感觉