前言

目前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

.NET Core RC2在Linux下部署的更多相关文章

  1. Linux下部署FTP服务器

    Linux下部署FTP服务器 下载安装包 在这里介绍的是离线部署FTP,首先下载对应的rpm包,下载链接为: 下载vsftpd服务 下载FTP客户端 安装ftp服务器 关闭防火墙 service ip ...

  2. linux下部署项目问题

    1. 今天linux下部署thinkphp项目,数据库用的mysql. 页面其他都是正常的,但是从数据库中取出的数据都是乱码.最后查了资料 解决方案: 在ThinkPHP里面 Library\Thin ...

  3. linux 下部署nodejs(两种方式)

    本次博客的编写时用的系统环境,刚装好的Centos 6.4  64位虚拟机. 另外关于linux 其他系统的安装 可以参考https://github.com/joyent/node/wiki/Ins ...

  4. Linux下部署Symfony2对app/cache和app/logs目录的权限设置

    在linux下部署完Symfony2,可能在访问的时候会报app/logs或者app/cache目录没有写权限的错误.在linux下,如果我们在命令行登陆的用户和web应用服务器(apache.ngi ...

  5. linux下部署php项目-Apache、php、mysql关联

    linux下部署php项目环境可以分为两种,一种使用Apache,php,mysql的压缩包安装,一种用yum命令进行安装. 使用三种软件的压缩包进行安装,需要手动配置三者之间的关系.apache和p ...

  6. Linux下部署多个Tomcat(完整)

    Linux下部署多个Tomcat 1.环境:1.1.Centos 5.01.2.apache-tomcat-6.0.18 2.需要解决一下几个问题2.1.不同的tomcat启动和关闭监听不同的端口2. ...

  7. Linux 下部署Django项目

    Linux 下部署Django项目   说明:本文所使用的环境为CentOS 6+Python2.7+Django1.11 安装Django.Nginx和uWSGI 1.确定已经安装了2.7版本的Py ...

  8. Linux下部署SSM,通过启动tomcat即可运行

    Linux下部署SSM项目 1. Java环境配置(JRE&JDK) 安装JDK8:sudo yum install java-1.8.0-openjdk 将操作系统配置为默认使用JDK8:s ...

  9. linux 下部署web 程序

    linux 下部署web 程序 1. 创建ucenter用户 一般情况下,发布应用程序都不是使用root用户的,需要创建一个普通用户来发布程序: 创建ucenter用户: useradd -d /uc ...

随机推荐

  1. elasticsearch start

    启动.停止服务 默认官方版启动: linux:./bin/elasticsearch start window:直接运行bin/elasticsearch.bat 默认官方版停止: linux:kil ...

  2. mongoose ObjectId.toString()

    node中一般我们经常对id进行判断,有的id是string类型,有的是ObjectId(''),这时候就可以使用mongoose的toString方法,将它转换成string

  3. Formview单文档或对话框项目接受不到按键消息的解决办法

    当对话框或formview界面上有控件时,由于焦点在控件上,因此wm_char,wm_keydown等按键消息会被控件捕获,而导致对话框或formview无法接受该类按键消息.这时候通常的解决方法是在 ...

  4. Method of offloading iSCSI TCP/IP processing from a host processing unit, and related iSCSI TCP/IP offload engine

    A method of offloading, from a host data processing unit (205), iSCSI TCP/IP processing of data stre ...

  5. C# WPF QQ新消息托盘悬浮窗效果实现

    原文:C# WPF QQ新消息托盘悬浮窗效果实现 今天在做一个项目的时候需要这么一个效果,但是网上找了一会发现并没有现成的给我参考(复制),但是呢,我千(到)辛(处)万(抄)苦(袭)想(复)破(制)头 ...

  6. thread、Task、async & await

    学习 Jesse 的文章 async & await 的前世今生(Updated) 而来 Thread是最开始使用的多线程.new一个Thread对象,将方法传进去.手动Start() 还可以 ...

  7. wpf 屏蔽热键

    原文:wpf 屏蔽热键 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a771948524/article/details/9428923   us ...

  8. C#引用CefSharp并屏蔽鼠标右键和禁止拖动放置事件

    原文:C#引用CefSharp并屏蔽鼠标右键和禁止拖动放置事件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013564470/article/ ...

  9. Matlab随笔之矩阵入门知识

    原文:Matlab随笔之矩阵入门知识 直接输入法创建矩阵 – 矩阵的所有元素必须放在方括号“[ ]”内: – 矩阵列元素之间必须用逗号“,”或空格隔开,每行必须用“;”隔开 – 矩阵元素可以是任何不含 ...

  10. Bootstrap 屏幕类型

    /* 超小屏幕(手机,小于 768px) */ /* 没有任何媒体查询相关的代码,因为这在 Bootstrap 中是默认的(还记得 Bootstrap 是移动设备优先的吗?) */ /* 小屏幕(平板 ...