前言

  在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. mysql分页(ajax)

    分页有多种方式,mysql的limit是个不错的选择,通过ajax实现异步刷新,将当前页数和每页数量传入后台即可 1. 首先后台要拿到总记录数和所需显示数据列表,所以要分别写两个sql方法 我这里是通 ...

  2. [USACO08DEC]Patting Heads

    嘟嘟嘟 这题还是比较水的.首先O(n2)模拟显然过不了,那就换一种思路,考虑每一个数对答案的贡献,显然一个数a[i]会对后面的a[i] * 2, a[i] * 3,a[i] * 4……都贡献1,.那么 ...

  3. 【题解】洛谷P1070 道路游戏(线性DP)

    次元传送门:洛谷P1070 思路 一开始以为要用什么玄学优化 没想到O3就可以过了 我们只需要设f[i]为到时间i时的最多金币 需要倒着推回去 即当前值可以从某个点来 那么状态转移方程为: f[i]= ...

  4. HDU 1698 Just a Hook(线段树模板之区间替换更新,区间求和查询)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. python 位置参数和关键字参数 *args **kwargs

    #!/usr/bin/env pythondef foo(*args,**kwargs): print('args: {0}'.format(args)) print('kwargs {0}'.for ...

  6. openstack self-service 实例 连接外网数据表流程

    我的openstack的架构是最简单的controller-compute架构,在provider基础上创建self-service  self-service的实例上外网的流量走向 登陆实例,pin ...

  7. iOS 计算源码行数

    如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 1.列出每个文件的行数 find . -name "*.m" -or -name "*.h&qu ...

  8. 30秒搞定String面试

    Java 语言中,无论新菜鸟,还是老司机,真正了解String内存的很少.关于String 的试题,花样很多.== 在什么情况下是true,什么情况是false.我总结出如下3点让你彻底结束对Stri ...

  9. Linux的常用基础命令

    初入运维界,从Linux开始学起.首先掌握的是Linux的部分常用命令,总结如下: 1. ls ls = list 查看当前目录下所有文件信息,常用参数组合:ls -al (l 指详细信息 a指所有文 ...

  10. Linux 和 ubuntu安装redis

    Linux 下安装reids 下载地址:http://redis.io/download,下载最新稳定版本. 本教程使用的最新文档版本为 2.8.17,下载并安装: $ wget http://dow ...