CentOS7上部署ASP.Net Core 2.2应用
前言
在CentOS7上部署ASP.Net Core应用是我的技术路线验证的一部分,下一个产品计划采用ASP.Net Boilerplate Framework开发。因此需要求提前进行一下技术验证,在这次验证过程中采坑较多。所以决定对采坑过程做一个仔细记录,以便今后备查。
ASP.Net Core部署CentOS7的必备条件
如果你的CentOS7是最小安装模式安装的,那么在部署ASP.Net Core应用前,需要为CentOS7安装以下功能模块。
- Wget功能包
- Nginx服务
- yum功能包
- ASP.Net Core运行环境
- lsof功能包
同时建议你最好准备一个FTP工具,这样在上传ASP.Net程序时比较方便。推荐使用Xshell+Xftp这套组件,可以方便实现SSH管理与文件上传功能。同时这套软件还对家庭及学校提供免费版本。
通过应用发布和复制
应用发布可以使用DotNet SDK中的dotnet命令进行发布,也可以通过Visual Studio进行发布。在发布前先要了解发布中的两个发布的概念,“框架依赖”和“独立”。如果你部署的服务器上没有安装ASP.Net Core Runtime,那么你可以选择“独立模式”,如果已经部署了ASP.Net Core Runtime,使用“框架依赖”模式。“独立”模式就是打包了ASP.Net Core Runtime的应用程序。但从性能角度来说“框架依赖”的性能更高。
- 使用Visutal Studio发布ASP.Net程序,选择中要发布的项目,右键-》选择发布。
- 进发布管理功能界面,可以参赛过“配置”按钮对发布参数进行调整。
如果要修改发布位置及发布模式,可以单击“配置”按钮。
调整参数后,保存设置。配置确认后,即可发布应用了。
配置反向代理服务器
在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”。
- 添加源
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装Nginx前,可以通过“yum search nginx”命令查看源是否已经添加成功。如果已经成功则执行以下命令。
sudo yum install -y nginx
Nginx安装成功后需要先修改nginx.conf & default.conf配置文件才能保证Nginx可正确启动。可以对通过“vim /etc/nginx/nginx.conf”命令来打开文件。
注:使用“I”启动“插入”模式,修改完成后使用“:wq”命令进行保存。使用“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;
}
}配置文件修改完成后,选择使用“nginx -t”命令验证配置文件是否正确。如果看到以下结果即代表配置文件修改正确。
- 启动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
已放弃
防火墙配置及安全配置
- 配置防火墙,打开80端口,并应用配置。
sudo firewall-cmd --zone=public --add-port=/tcp --permanent
sudo systemctl restart firewalld 关闭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应用的更多相关文章
- Web Server 在IIS上部署ASP.NET Core项目
在IIS上部署ASP.NET Core项目 一.配置应用程序池为无托管: 二.安装ASPNETCoreModule:(核心) 下载地址:https://go.microsoft.com/fwlink/ ...
- .NET开发框架(五)-IIS上部署ASP.NET Core项目教程
系列教程:从初学者到架构师的一步步蜕变 本篇经验将和大家介绍如何在IIS上部署ASP.NET Core项目,希望对初学.NET CORE的童靴入门有所帮助! 1.打开VS,创建项目,选择ASP.NET ...
- 在 Azure 上部署 Asp.NET Core Web App
在云计算大行其道的时代,当你要部署一个网站时第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core的网站呢?Azure 的 Web App ...
- 以self-contained方式在Linux上部署ASP.NET Core站点
今天准备将一个在Windows上用VS2015开发的ASP.NET Core程序部署到阿里云Linux服务器上,部署时发现这台服务器是内网服务器,无法直接安装.NET Core SDK,于是想到尝试用 ...
- 【翻译】使用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 ...
- 在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.总结 ...
- 在 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.总结 ...
- 尝试在Linux上部署Asp.net Core应用程序
快两个月没接触.net,倒是天天在用Linux,所以想尝试一下在Linux运行喜欢的.net 应用. 安装CentOS 安装.Net core for Linux 创建Asp.net Core应用程序 ...
- 在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. 部署过 ...
随机推荐
- exits, in, left join性能比较
exits in left join性能比较 ,笔者使用的是MYSQL数据库,这三个关键字方法在其他的关系数据库里也是大同小异,如果各种有兴趣,自行比较. 我这里有一个249_account 表,总 ...
- Oracle从一个用户导出数据到另一个用户
如果想导入的用户已经存在: 1. 导出用户 expdp user1/pass1 directory=dumpdir dumpfile=user1.dmp 2. 导入用户 impdp user2/pas ...
- linux用户相关及/etc/passed,/etc/group,/etc/shadow
useradd:新建用户 usermod:修改用户相关信息 userdel:删除用户分(-r选项) 组的操作与用户的操作类似 选项 userdel相关选项: -f:强制删除用户,即使用户已登录 -r: ...
- Alpha冲刺(5/10)——追光的人
1.队友信息 队员学号 队员博客 221600219 小墨 https://www.cnblogs.com/hengyumo/ 221600240 真·大能猫 https://www.cnblogs. ...
- Java实现Package编译和访问
Java实现Package编译和访问 说明 所有文件都是使用UTF-8编码来写的,请不要用Windows记事本随便打开 Test.java文件中注释的方法说明了该类是不能访问其方法的 文件目录树 bi ...
- c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义
4.malloc(free)和new(delete)的区别 malloc()函数: 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void ...
- libmxml数据结构(源码分析)
libmxml是一个开源.小巧的C语言xml库.这里简单分析一下它是用什么样的数据结构来保存分析过的xml文档. mxml关键的结构体mxml_node_t是这样的实现的: struct mxml_n ...
- golang 实现海明距离 demo
Simhash的算法简单的来说就是,从海量文本中快速搜索和已知simhash相差小于k位的simhash集合,这里每个文本都可以用一个simhash值来代表,一个simhash有64bit,相似的文本 ...
- 高德地图API(流程法)整理分析
[高德地图API(流程法)分析]: 前言:公司现在的网约车项目,使用的是高德地图,因为地图导航这一块的功能占比量比较大,为了方便大家对高德地图API的了解和学习使用,使用流程图把高德API分析整理了下 ...
- Scala中的类学习
Scala中的类学习 从java了解类的情况下,了解Scala的类并不难.Scala类中的字段自动带getter和setter方法,用@BeanProperty注解生成javaBean对象的getXX ...