引言

       本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个Nginx-Powered AspNet Core Web准生产应用。
在开始之前,我们还是重温一下部署原理,正如你所常见的.Net Core 部署图:

在Linux上部署.Net Core App最好的方式是在Linux机器上使用Kestrel 服务在端口5000上支撑web应用; 然后设置Nginx作为反向代理服务器,将输入请求转发给Kestrel服务器, 这个模式称为 边缘代理服务器(edge-origin proxy)。

使用这种部署模型有如下优势:

  • 可扩展性: 反向代理服务器和Web服务器可以设置在一台或者不同的机器上,为伸缩部署提供可能, 可按需部署多个Web服务器,Nginx反向代理服务器本身可充当优秀的负载均衡器。

  • 数据安全性:edge-origin 模式隐藏了 Web服务器进程的细节,对外只暴露80端口,对外暴露的只有Nginx 反向代理服务器,减少了网络攻击的可能性。

  • 高性能:反向代理服务器可以为后端服务器配置 内容缓存,减少对后端服务器的请求,这是个很重要的性能提升,避免DDOS攻击和暴力恶意攻击。

  • 多功能性:本文虽然是在讲述Linux-only 部署, 这种模式允许你高效、透明地混合使用Linux和Windows服务器,以上Web服务器也可以是 IIS-Powered的Web服务器。

 

 准备部署

     首先明确dotnet程序是一个独立进程, 原本可不依赖反向代理服务器运行;  必备知识点

  第二明确Nginx反向代理服务器的作用,  这里我们需要为.NetCore 程序添加必要的中间件

// Invoke the UseForwardedHeaders middleware and configure it to forward the X-Forwarded-For and X-Forwarded-Proto headers.
// NOTE: This must be put BEFORE calling UseAuthentication or similar authentication scheme middlewares.
// ref.: https://www.ryadel.com/en/asp-net-core-2-publish-deploy-web-application-linux-centos-tutorial-guide-nginx
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

第三明确dotnet程序需要在Linux系统中以守护进程的方式运行,可使用 supervisor、systemd等方式。

 

1. 安装环境

sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm       -- rpm是一种软件包管理方式,这里的微软软件包仓库以rpm包的形式提供,包含仓库配置和供发行版认证软件包的公钥,你可以理解为添加了一个nuget包仓库

sudo yum update
sudo yum install aspnetcore-runtime-2.2                                -- yum基于rpm包管理,能够从指定服务器自动下载rpm包并且安装,可自动处理依赖关系,并一次安装所有依赖软件包。

2. dotnet程序发布、测试

  - 使用VS项目右键发布到指定目录

- 使用zip方式打包

- 使用scp、SFTP工具上传到Linux服务器, 一般情况下拷贝到var目录

scp D:\production\eqidproxyServer.zip root@10.201.80.126:/var/www   --以下命令将zip包拷贝到 /var/www目录下

- 在CentOS服务器上解压

unzip -d eqidproxyServer eqidproxyServer.zip

-  执行dotnet EqidProxyServer.dll

3. 使用systemd将dotnet进程设置成Linux守护进程

   完成以上步骤,dotnet程序并不能在后台作为服务运行,Nginx虽然能作为反向代理服务器转发请求到dotnet进程, 但是并不具备管理dotnet进程的能力。

下面使用 systemd来将dotnet进程设定为系统服务。

systemd是一个Linux的系统服务管理器,其作用是提供系统服务依赖管理 、实现系统初始化时服务的并行启动。

① 创建服务文件:vim /etc/systemd/system/kestrel-eqidproxyserver.service
[Unit]
Description=EqidProxyServer deploy on centos

[Service]
WorkingDirectory=/var/www/eqidproxyserver/eqidproxyServer
ExecStart=/usr/bin/dotnet /var/www/eqidproxyserver/eqidproxyServer/EqidProxyServer.dll
Restart=always
# Restart service after  seconds if the dotnet service crashes:
RestartSec=
TimeoutStopSec=
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

黄色背景行是需要你注意配置的,这里我们使用root来执行dll, 一般情况下需要创建一个web账户,并给予项目文件夹owner权限。

 下面在root用户组下创建www-data用户,并给予owner权限。
 sudo useradd -m -g root www-data
 sudo chown www-data var/www/eqidproxyserver

注意:Linux 是大小写敏感的文件系统,设定ASPNETCORE_ENVIRONMENT=Production 会在配置文件中搜索如下配置文件: appsettings.Production.json, 故配置和文件名需要留意匹配。

② 启用、启动服务
sudo systemctl enable kestrel-eqidproxyserver.service       // 启用服务
sudo systemctl start kestrel-eqidproxyserver.service        // 指定服务名启动
sudo systemctl status kestrel-eqidproxyserver.service       // 验证服务状态
 以下是验证服务状态的输出:
● kestrel-eqidproxyserver.service - EqidProxyServer deploy on centos
   Loaded: loaded (/etc/systemd/system/kestrel-eqidproxyserver.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu -- :: CST; 3min 2s ago
 Main PID:  (dotnet)
   Memory: 46.3M
   CGroup: /system.slice/kestrel-eqidproxyserver.service
           └─ /usr/bin/dotnet /var/www/eqidproxyserver/eqidproxyServer/EqidProxyServer.dll

Feb  :: gs-server- dotnet-eqidproxyserver[]: ]
Feb  :: gs-server- dotnet-eqidproxyserver[]: Request finished .6715ms
Feb  :: gs-server- dotnet-eqidproxyserver[]: ]
Feb  :: gs-server- dotnet-eqidproxyserver[]: Request starting HTTP/1.1 GET http://127.0.0.1/
Feb  :: gs-server- dotnet-eqidproxyserver[]: ]
Feb  :: gs-server- dotnet-eqidproxyserver[]: Request finished .5599ms
Feb  :: gs-server- dotnet-eqidproxyserver[]: ]
Feb  :: gs-server- dotnet-eqidproxyserver[]: Request starting HTTP/1.1 GET http://10.201.80.126/
Feb  :: gs-server- dotnet-eqidproxyserver[]: ]
Feb  :: gs-server- dotnet-eqidproxyserver[]: Request finished .3498ms 

4. 搭配Nginx部署web程序

 
① 安装Nginx

    -  sudo yum install nginx      【首次安装需要显式启动: sudo service nginx start】

 CentOS安装的nginx并没有作为守护进程运行,执行sudo systemctl enable nginx 启用nginx守护进程: https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7
 Ubuntu 中使用 apt-get 安装的nginx, 安装器会创建systemd init script,也就是说nginx会随着系统启动作为守护程序运行。

  -    在终端使用curl localhost 测试nginx

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

   - 修改/etc/nginx/nginx.conf 文件: sudo vi /etc/nginx/nginx.conf

   - 配置nginx在80端口将请求转发到Kestrel服务器(localhost:5000)

server {
        listen       80;
        server_name  default_website;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        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;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

  一旦nginx配置完成,可以使用sudo nginx -t 测试配置文件的语法;

  如果配置文件合法,就可以重启nginx: sudo nginx -s reload

  完成以上步骤之后,现在已经可以从127.0.0.1、127.0.0.1:5000、 服务器IP访问web程序。

5.查看进程日志

     使用systemd方式管理进程,所有事件和进程都会记录到某个集中日志,该集中日志包含所有被systend管理的服务和进程的日志。

这个日志功能相当于windows服务器中的事件查看器。

查看刚才建立的服务日志, 可使用下面的命令:

sudo journalctl -fu kestrel-eqidproxysever.service

时间过滤:

sudo journalctl -fu kestrel-eqidproxysever.service --since "2018-11-18" --until "2019-03-28 04:00"

  

    部分内容参考: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?viw=aspnetcore-2.2

  rpm包源: https://docs.microsoft.com/en-us/windows-server/administration/linux-package-repository-for-microsoft-software

  rpm/yum区别: https://zhuanlan.zhihu.com/p/27724520

  Linux进程管理:https://linux.cn/article-3801-1.html

作者:Julian_酱

感谢您的认真阅读,如有问题请大胆斧正,如果您觉得本文对你有用,不妨右下角点个或加关注。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置注明本文的作者及原文链接,否则保留追究法律责任的权利。

ASP.NET Core在CentOS上的最小化部署实践的更多相关文章

  1. ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

    一.前言 在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core ...

  2. asp.net core in centos

    CentOS 7部署ASP.NET Core应用程序   看了几篇大牛写的关于Linux部署ASP.NET Core程序的文章,今天来实战演练一下.2017年最后一个工作日,提前预祝大家伙元旦快乐.不 ...

  3. ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)

    早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...

  4. 在ASP.NET Core Web API上使用Swagger提供API文档

    我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...

  5. asp.net core 一 Centos 环境部署

             .netcore的运行环境,创建asp.net core 项目    CentOS 7 ,dotnet-sdk-2.0.0-2.0.0-1.x86_64 直接在liunx创建项目并运 ...

  6. 记一次asp.net core 在iis上运行抛出502.5错误

    asp.net core 在iis上运行抛出502.5异常的部分原因以及解决方案 环境说明 已安装 .net core runtime 2.1.401 已安装 .net core windows ho ...

  7. asp.net core流式上传大文件

    asp.net core流式上传大文件 首先需要明确一点就是使用流式上传和使用IFormFile在效率上没有太大的差异,IFormFile的缺点主要是客户端上传过来的文件首先会缓存在服务器内存中,任何 ...

  8. asp dotnet core 支持客户端上传文件

    本文告诉大家如何在 asp dotnet core 支持客户端上传文件 新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息 public class Kanaj ...

  9. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...

随机推荐

  1. 下载Github上某个项目的子文件夹和单个文件

    preface Github下的项目可能很大,里面有很多的子文件夹,我们可能只需要使用某个子目录下的资源,可以不用下载完整的repo就能使用. 例如,我想下载这个repo中的字典文件:https:// ...

  2. JAVA 第一张 使用记事本编写代码

    使用记事本开发JAVA程序的步骤

  3. Coursera-AndrewNg(吴恩达)机器学习笔记——第二周

    一.多变量线性回归问题(linear regression with multiple variables) 搭建环境OctaveWindows的安装包可由此链接获取:https://ftp.gnu. ...

  4. Lenghth of Last Word

    description: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', ...

  5. 关于Spring的HibernateTemplate的findByExample方法使用时的一点注意。

    此前我们已经介绍了HibernateTemplate的使用配置方法,但是对其使用没有仔细说明.因为最近比较忙,我先不去介绍,而是重点说明一下容易引起问题的findByExample方法. 我尝试反编译 ...

  6. SSM博客

    最近在写基于SSM 的博客,用的是spring+springmvc+mybatis搭建的,用的maven+github管理项目,目前完成了登录注册以及用户管理员的增删改查,后续的功能还需要完善,如何建 ...

  7. Xamarin.Android 使用AsyncTask提示上传动态

    我们有时候会通过WebServices上传数据,如果信息量过大并没有提示,用户会觉得是死机,或是系统崩溃,这时候我们可以用到AsyncTask(异步任务)来提示上传信息,例如:正在上传数据... 这里 ...

  8. .NET之AutoMapper对象映射工具运用

    AutoMapper对象映射工具:主要是将某一个实体转成另一个实体. 1.引用NuGet包;搜索:AutoMapper 2.创建实体类 using System; using System.Colle ...

  9. Scrapy爬虫框架补充内容三(代理及其基本原理介绍)

    前言:(本文参考维基百科及百度百科所写) 当我们使用爬虫抓取数据时,有时会产生错误比如:突然跳出来了403 Forbidden 或者网页上出现以下提示:您的ip访问频率太高 或者时不时跳出一个验证码需 ...

  10. centos tftp和samba的安装与配置

    Tftp服务器的安装于配置 1 安装: 命令:#yum –y install tftp 2 安装完毕之后,将tftp服务器设置为开机启动,方法:(命令)#setup→选择system server→选 ...