引言

       本文从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. python importlib动态导入模块

    一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过import module 或者 from * import module的方式导入,这属于静态导入,很容易理解. 而 ...

  2. Scala编程入门---数组操作之Array.ArrayBuffer以及遍历数组

    在Scala中,Array代表的含义与Java类似,也是长度不可改变的数组.此外,由于Scala与java都是运行在JVM中,双方可以互相调用,因此Scala数组底层实际上是java数组.列如字符串数 ...

  3. flash builder 4.6与myecilpse 10.7集成

    一.在flash builder 4.0以后就没有单独提供插件版的flash builder了,因此必须先安装完整版的flash builder,再进行插件集成. 二.集成过程比较简单但也有几个要注意 ...

  4. 关于Java的散列桶, 以及附上一个案例-重写map集合

    为速度而散列: SlowMap.java说明了创建一个新的Map并不困难.但正如它的名称SlowMap所示,它不会很快,如果有更好的选择就应该放弃它.它的问题在于对键的查询,键没有按照任何特定的顺序保 ...

  5. OAuth 2 开发人员指南

    这是支持OAuth2.0的用户指南.对于OAuth1.0,一切都是不同的,所以看它的用户指南. 本用户指南分为两个部分,第一部分是OAuth2.0提供端(OAuth 2.0 Provider),第二部 ...

  6. ZooKeeper 安装、配置

    http://blog.csdn.net/franklysun/article/details/6424582 如题本文介绍的是ZooKeeper 的安装和配置过程,此过程非常简单,关键是如何应用(将 ...

  7. javascript快速入门之BOM模型—浏览器对象模型(Browser Object Model)

    什么是BOM? BOM是Browser Object Model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对 ...

  8. 14.app后端如何设计api

    app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入app后端的小伙伴会一无头绪,不知道怎么入门.下面根据自己3年的app后端经验,总结出下几个api设计原则,给小伙伴参 ...

  9. Python3 requests与http.cookiejar的使用(cookie的保存与加载)

    在学习Python之余,发现Python2与Python3 有很大的变化,之前使用urllib和cookielib来保存cookie,发现很繁琐,于是改用requests.发现cookielib在3. ...

  10. nginx 开启 停止 重启

    Nginx的启动.停止与重启 启动 启动代码格式:nginx安装目录地址 -c nginx配置文件地址 例如: [root@LinuxServer sbin]# /usr/local/nginx/sb ...