前言

  在CentOS7上部署ASP.Net Core应用是我的技术路线验证的一部分,下一个产品计划采用ASP.Net Boilerplate Framework开发。因此需要求提前进行一下技术验证,在这次验证过程中采坑较多。所以决定对采坑过程做一个仔细记录,以便今后备查。

ASP.Net Core部署CentOS7的必备条件

  如果你的CentOS7是最小安装模式安装的,那么在部署ASP.Net Core应用前,需要为CentOS7安装以下功能模块。

  1. Wget功能包
  2. Nginx服务
  3. yum功能包
  4. ASP.Net Core运行环境
  5. lsof功能包

  同时建议你最好准备一个FTP工具,这样在上传ASP.Net程序时比较方便。推荐使用Xshell+Xftp这套组件,可以方便实现SSH管理与文件上传功能。同时这套软件还对家庭及学校提供免费版本。

通过应用发布和复制

  应用发布可以使用DotNet SDK中的dotnet命令进行发布,也可以通过Visual Studio进行发布。在发布前先要了解发布中的两个发布的概念,“框架依赖”和“独立”。如果你部署的服务器上没有安装ASP.Net Core Runtime,那么你可以选择“独立模式”,如果已经部署了ASP.Net Core Runtime,使用“框架依赖”模式。“独立”模式就是打包了ASP.Net Core Runtime的应用程序。但从性能角度来说“框架依赖”的性能更高。

  1. 使用Visutal Studio发布ASP.Net程序,选择中要发布的项目,右键-》选择发布。
  2. 进发布管理功能界面,可以参赛过“配置”按钮对发布参数进行调整。
  3. 如果要修改发布位置及发布模式,可以单击“配置”按钮。

    调整参数后,保存设置。

  4. 配置确认后,即可发布应用了。

配置反向代理服务器

  在Linux上运行的ASP.Net Core应用是通过Kestrel服务器解析与处理的,但因为Kestrel服务器的安装性与重写功能都不是很完善。因此通常我们需要将Apache或Nginx配置为反向代理服务器来为Kestrel提供服务。这里需要补充一点Kestrel服务器是ASP.Net Core Runtime的一部分,并不需要单独安装。这里也要说一下,使用反向代理服务器的好处。 反向代理服务器可以卸载 HTTP 服务器的工作负载,如提供静态内容、缓存请求、压缩请求和 HTTPS 终端。 反向代理服务器可能驻留在专用计算机上,也可能与 HTTP 服务器一起部署。如果只需要反向代理服务,推荐使用Nginx作为反向代理服务器。Nginx本身就是为反向代理服务而开发的,其实代理性能及资源消耗上都比Apache小得多。如果你的服务器资源比较紧张,那么Nginx是不二的选择。但如果你面要在服务器上提供PHP服务的话,那么还是使用Apache服务器更好一点。Apache对于PHP支持更简单一些。

  在CentOS7上安装Nginx有两种方法,一种是使用yum进行安装,别一种是从官方下载Nginx服务器压缩包,手动安装。推荐使用yum进行安装,但CentOS7本身的资料库中是没有Nginx服务器包的,因此如果你需要在CentOS7上部署Nginx的话,更新服务器上的yum源。最近Nginx官方yum源“http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm”。

  1. 添加源

    sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  2. 安装Nginx前,可以通过“yum search nginx”命令查看源是否已经添加成功。如果已经成功则执行以下命令。

    sudo yum install -y nginx
  3. Nginx安装成功后需要先修改nginx.conf & default.conf配置文件才能保证Nginx可正确启动。可以对通过“vim /etc/nginx/nginx.conf”命令来打开文件。

    注:使用“I”启动“插入”模式,修改完成后使用“:wq”命令进行保存。

  4. 使用“vim /etc/nginx/conf.d/default.conf”命令打开默认配置文件,使用以下内容替换文件全部内容。

    server {
    listen default_server;
    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;
    }
    }

    注:如果Nginx需要同时对Signalr进行WebSockets代理的话,需要增加新的配置小节。

    server {
    listen default_server;
    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;
    } location /signalr {
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    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;
    }
    }
  5. 配置文件修改完成后,选择使用“nginx -t”命令验证配置文件是否正确。如果看到以下结果即代表配置文件修改正确。

  6. 启动Nginx并设置开机自动运行
    sudo systemctl start nginx.service
    sudo systemctl enable nginx.service

    注:如果在启动Nginx过程中出现端口占用问题,可以先使用“lsof -i :80"命令查看占用端口的应用,然后通过”kill [pid]“命令杀掉相应的进程。然后再重新启动Nginx。如果遇到”找不到nginx.pid“的问题,可通过在/etc/nginx/目录下运行nginx即可。

安装ASP.Net Core运行环境

  如果不需要在服务器上开发的话,是不需要安装ASP.Net Core SDK的,只需要安装ASP.Net Core Runtime即可。当前最新的发布版本是.Net Core 2.2,下载地址:https://dotnet.microsoft.com/download/dotnet-core/2.2。
  

  选择Linux版本的完整包选项后,再选择CentOS对应的版本。

  

  按照说明执行即可,执行过程中询问过程时选择”y“。

上传本地发布的应用

  在这时就要用到一开始提到的FTP工具,通常应用都部署以/var目录中。在var目录中新建/www/cdpmapp/目录 ,并使用FTP将本地发布的应用上传至此处。

  

  文件上传完成后,在应用程序目录中运行”dotnet <app_assembly.dll>“测试应用,看到以下信息即代表应用可正常启动。
  

  测试应用完成后,请在命令提示符处按Ctrl+C关闭应用。

  注:dotnet <app_assembly.dll>这条命令一定要在应用程序所在的目录中运行,否则你就会看到以下的错误:  

Unhandled Exception: System.ArgumentNullException: Value cannot be null.
Parameter name: value
at System.Boolean.Parse(String value)
at MobileWorkOrder.Web.Startup.AuthConfigurer.Configure(IServiceCollection services, IConfiguration configuration)
at MobileWorkOrder.Web.Startup.Startup.ConfigureServices(IServiceCollection services) in C:\My Project\WorkOrder\aspnet-core\src\WorkOrder.Web.Mvc\Startup\Startup.cs:line
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.ConfigureServices(IServiceCollection services)
at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()
at Microsoft.AspNetCore.Hosting.Internal.WebHost.Initialize()
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at MobileWorkOrder.Web.Startup.Program.Main(String[] args) in C:\My Project\WorkOrder\aspnet-core\src\WorkOrder.Web.Mvc\Startup\Program.cs:line
已放弃

防火墙配置及安全配置

  1. 配置防火墙,打开80端口,并应用配置。

    sudo firewall-cmd --zone=public --add-port=/tcp --permanent
    sudo systemctl restart firewalld
  2. 关闭SELinux ,使用getenforce 查询

    临时关闭(不用重启机器):

          setenforce 0 ##设置SELinux 成为permissive模式

          ##setenforce 1 设置SELinux 成为enforcing模式

        修改配置文件需要重启机器:

          修改/etc/selinux/config 文件

          将SELINUX=enforcing改为SELINUX=disabled

          重启机器即可。

监视应用

  服务器设置为将对 http://<serveraddress>:80 发起的请求转接到在 http://127.0.0.1:5000 中的 Kestrel 上运行的 ASP.NET Core 应用。 但是,未将 Nginx 设置为管理 Kestrel 进程。 systemd 可用于创建服务文件以启动和监视基础 Web 应用。 systemd 是一个 init 系统,可以提供用于启动、停止和管理进程的许多强大的功能。

  建议在使得记录本或UltraEdit创建服务定义文件,以下是一个事例文件。  

[Unit]
Description=Example .NET Web API App running on Ubuntu [Service]
WorkingDirectory=/var/www/cdpmapp
ExecStart=/usr/bin/dotnet /var/www/cdpmapp/cdpmapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install]
WantedBy=multi-user.target

  Linux 具有区分大小写的文件系统。 将 ASPNETCORE_ENVIRONMENT 设置为“生产”会导致搜索配置文件 appsettings.Production.json,而不是 appsettings.production.json。

  保存该文件并启用该服务

sudo systemctl enable kestrel-helloapp.service

  启用该服务,并确认它正在运行。

sudo systemctl start kestrel-helloapp.service
sudo systemctl status kestrel-helloapp.service ● kestrel-helloapp.service - Example .NET Web API App running on Ubuntu
Loaded: loaded (/etc/systemd/system/kestrel-helloapp.service; enabled)
Active: active (running) since Thu -- :: NZDT; 35s ago
Main PID: (dotnet)
CGroup: /system.slice/kestrel-helloapp.service
└─ /usr/local/bin/dotnet /var/www/helloapp/helloapp.dll

  在配置了反向代理并通过 systemd 管理 Kestrel 后,Web 应用现已完全配置,并能在本地计算机上的浏览器中从 http://localhost 进行访问。 也可以从远程计算机进行访问,同时限制可能进行阻止的任何防火墙。 检查响应标头,Server 标头显示由 Kestrel 所提供的 ASP.NET Core 应用。

CentOS7上部署ASP.Net Core 2.2应用的更多相关文章

  1. Web Server 在IIS上部署ASP.NET Core项目

    在IIS上部署ASP.NET Core项目 一.配置应用程序池为无托管: 二.安装ASPNETCoreModule:(核心) 下载地址:https://go.microsoft.com/fwlink/ ...

  2. .NET开发框架(五)-IIS上部署ASP.NET Core项目教程

    系列教程:从初学者到架构师的一步步蜕变 本篇经验将和大家介绍如何在IIS上部署ASP.NET Core项目,希望对初学.NET CORE的童靴入门有所帮助! 1.打开VS,创建项目,选择ASP.NET ...

  3. 在 Azure 上部署 Asp.NET Core Web App

    在云计算大行其道的时代,当你要部署一个网站时第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core的网站呢?Azure 的 Web App ...

  4. 以self-contained方式在Linux上部署ASP.NET Core站点

    今天准备将一个在Windows上用VS2015开发的ASP.NET Core程序部署到阿里云Linux服务器上,部署时发现这台服务器是内网服务器,无法直接安装.NET Core SDK,于是想到尝试用 ...

  5. 【翻译】使用Visual Studio在Azure上部署Asp.Net Core Web应用

    配置运行环境 Install the latest Azure SDK for Visual Studio. The SDK installs Visual Studio if you don't a ...

  6. 在Linux CentOS上部署Asp.Net Core项目(Tengine、Asp.Net Core、Centos、MySql)

    一.前言 1.简单记录一下Linux CentOS 7中安装与配置Tengine的详细步骤. 2.简单比较一下Tengine 和Nginx 3.搭建Asp.net Core和部署 Web程序 4.总结 ...

  7. 在 CentOS 7(Linux)上部署ASP.NET Core 2.2 Web应用程序(Tengine、Asp.Net Core MVC、Centos 7、MySql)

    一.前言 1.简单记录一下Linux CentOS 7中安装与配置Tengine的详细步骤. 2.简单比较一下Tengine 和Nginx 3.搭建Asp.net Core和部署 Web程序 4.总结 ...

  8. 尝试在Linux上部署Asp.net Core应用程序

    快两个月没接触.net,倒是天天在用Linux,所以想尝试一下在Linux运行喜欢的.net 应用. 安装CentOS 安装.Net core for Linux 创建Asp.net Core应用程序 ...

  9. 在IIS上部署Asp.Net Core 2.2.0

    1. .NET Core与Windows环境 Asp.Net Core 2.2.0 Windows 10 2. 先决条件   下载并安装.Net Core Hosting Bundle. 3. 部署过 ...

随机推荐

  1. KVOController原理解析

    1.使用类似动态代理的模式和消息派发中枢模式实现整个架构: 2.使用NSMapTable和NSHashTable进行切面信息的增删查维护:主要用于去重和查看是否存在. 实现方式 消息流 KVOCont ...

  2. AE-----界面介绍

    AE-----界面介绍 一.大纲leiji 层级: 比如:高楼一层一层的盖起来的.千层蛋糕(一层一层的).地质(一层一层构造的) 图层的特征:有顺序.上面的一层总会覆盖掉下面的一层. AfterEff ...

  3. ethers.js-3-Providers

    Providers A Provider abstracts a connection to the Ethereum blockchain, for issuing queries and send ...

  4. python中numpy.sum()函数

    讲解清晰,转载自:https://blog.csdn.net/rifengxxc/article/details/75008427 众所周知,sum不传参的时候,是所有元素的总和.这里就不说了. 1 ...

  5. 苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置

    苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置,首先要做好如下的准备: 第一:数据的备份:第二:保证正常的wifi连接:第三:有线的鼠标键盘连接: 具体恢复操作步骤: 步骤一:电脑 ...

  6. 为什么企业依赖于 NoSQL

    如果你关注大数据科技动向,你对 NoSQL 一定不陌生,NoSQL 是一个分布式数据库.在过去时间,数据存储一直关系型数据库天下,有着良好的控制并发操作.事务功能.虽然RDBMS很优秀,但是随着时间的 ...

  7. Redis全方位讲解--主从复制

    前言 前面介绍了redis持久化和容灾备份,这篇会介绍redis主从复制和redis持久化在主从复制中的一些应用.因为本人没有那么多服务器或机器,所以这里主要介绍下如何在docker容器中搭建主从复制 ...

  8. Hive--可执行SQL的Hadoop数据仓库管理工具

    Hive是一个基于HDFS的数据仓库软件,可理解为数据库管理工具:Hive的功能主要有: 1. 支持使用SQL对分布式存储的大型数据集进行读.写.管理,将SQL转化成MapReduce任务执行: 2. ...

  9. Web安全0003 - MySQL SQL注入 - union查询核心语法

    注:本文是学习网易Web安全进阶课的笔记,特此声明. 查库,select schema_name from information_schema.schemata; 查表,select table_n ...

  10. maven第一天——入门与基本概念

    一.什么是maven? 1.概述 核心点:项目构建.依赖管理.[更新]:源码关联 (如何关联源码:在依赖的jar上右击 maven download source即可) Maven是一个项目管理和综合 ...