ASP.NET Core部署系列二:发布到CentOS上
前言:
在上一节中,通过一系列的步骤,已经将项目部署到IIS上,虽然遇到了一些问题,但最终解决并成功运行了。而在这一节中,将尝试通过linux系统的环境下,部署项目,实现Net Core跨平台的亮点。
虽然网上已经有很多关于asp.net core在linux下的部署教程了,但我还是想写一篇,主要增强我自己的记忆,同时分享下我部署遇到的坑。
我在我电脑win7的操作系统中用来虚拟机建了个CentOS7,来演示,我们的项目如何发布在Linux上运行。
开始:
一、安装.Dotnet Core 2.2
Linux上运行Dotnet Core程序的前提是安装Dotnet Core Runtime,如果想要在Linux做 .NET Core的开发和编译工作,那么需要安装 Dotnet Core SDK。Dotnet Core SDK中包括了Dotnet Core Runtime,所以这里就直接安装了Dotnet Core SDK

Step 1:安装Dotnet产品的必要前提
在安装Dotnet Core前,需要注册Microsoft签名密钥并添加Microsoft产品提要,每台机器只需注册一次,执行如下命令:
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
Step 2:安装Dotnet Core SDk,执行下列命令
sudo yum update
y
sudo yum install dotnet-sdk-2.2
y
大家注意,会有两个“y”的原因是,命令执行的中途停顿了,让你确认下是否进行安装,你要输入“y”确认安装才会执行安装 安装完后,我们输入如下命令看下是否安装成功

二、部署Asp.net Core 应用程序
在CentOS系统中,新建publish文件夹

上传上一节发布的文件到至/home/publish/。
这边我使用了Xftp进行文件的上传。(如果是在本地虚拟机操作的话,也可以直接复制到系统对应的文件夹目录下)
进入目录:cd publish

检查是否可以运行:dotnet LCzarCms.Admin.dll

如果出现这些信息则表示成功运行

到此,项目就运行成功了,这时候我们是无法访问到这个页面的,这时候我们需要部署一个web容器来进行转发,我们可能还要安装 nginx 、配置我们的 FireWall 以及配置守护服务 Supervisor 等等
三、配置Nginx托管
微软官方提供的https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.2#monitor-the-app,把dotnet创建成一个服务
安装nginx
curl -o nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

rpm -ivh nginx.rpm

yum install nginx

启动 Nginx:
systemctl start nginx
设置开机启动(linux宕机、重启会自动运行nginx不需要连上去输入命令):
systemctl enable nginx

四、配置防火墙
开放80端口:
firewall-cmd --zone=public --add-port=/tcp –permanent
重启防火墙以使配置即时生效:
systemctl restart firewalld

测试nginx是否可以访问

五、配置Nginx对ASP.net Core 应用的转发
修改Nginx的default.conf文件

将文件内容替换为:
server {
listen ;
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;
}
}
进行修改覆盖
重新加载,即时生效:
nginx -s reload

再次运行ASP.NET Core应用程序

但是,测试我们再次浏览运行的时候,会出现如下这种情况:

这是什么情况?经过后续了解,这个问题是由于SELinux保护机制所导致,我们需要将nginx添加至SELinux的白名单
接下来我们通过一些命令解决这个问题
① yum install policycoreutils-python

② sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx

③ sudo semodule -i mynginx.pp
我们再次访问运行一下:

这次已经可以成功的运行起来了。
至此基本完成了部署。
但是,我们还是存在着其他的问题:
1.ASP.NET Core应用程序运行在shell之中,如果关闭shell则会发现ASP.NET Core应用被关闭,从而导致应用无法访问,这种情况当然是我们不想遇到的,而且生产环境对这种情况是零容忍的。
2.如果ASP.NET Core进程意外终止那么需要人为连进shell进行再次启动,往往这种操作都不够及时。
3.如果服务器宕机或需要重启我们则还是需要连入shell进行启动。
为了解决这些问题,我们需要有一个程序来监听ASP.NET Core 应用程序的状况。
那么要解决这些问题,我们就必须要实现这么一个功能:如果ASP.NET Core 意外终止,那么我们要自动重启;如果服务器服务器重启后,我们要有个类似脚本命令一样,自动执行 dotnet 命令。现在正好有个基于 Python 开发的工具 Supervisor 可以解决我们上述问题
六、配置Supervisor守护服务
在应用程序停止运行的时候立即重新启动。这边我们用到了Supervisor这个工具,Supervisor使用Python开发的。
安装Supervisor:
yum install python-setuptools

easy_install supervisor

配置Supervisor:
①运行supervisord 服务的时候,需要指定 Supervisor 配置文件,所以,先通过如下命令创建目录,以便让 supervisor 成功加载默认配置:
mkdir /etc/supervisor
②目录创建成功后, 通过 echo_supervisord_conf 程序(用来生成初始配置文件,文件名可以自定义)来初始化一个配置文件:
echo_supervisord_conf > /etc/supervisor/supervisord.conf
③通过vim命令修改创建好的supervisord.conf配置信息:
vi /etc/supervisor/supervisord.conf
④最下边找到如下文本片段:

修改为:

为我们部署的.NET Core添加进程配置文件:
①创建配置文件LCzarCmsAdmin.ini(文件名自定义)
[program:LCzarCmsAdmin]
command=dotnet /root/publish/LCzarCms.Admin.dll
directory=/root/publish/
autostart=true
autorestart=true
stderr_logfile=/var/log/LCzarCms.err.log
stdout_logfile=/var/log/LCzarCms.out.log
environment=ASPNETCORE_ENVIRONMENT=Production
user=root
stopsignal=INT
②在/etc/supervisor/目录下创建一个文件夹conf.d
mkdir /etc/supervisor/conf.d/
将刚创建的配置文件LCzarCmsAdmin.ini移到conf.d文件夹下

如果服务已经启动,则需要使用 supervisorctl reload 命令来使新的配置生效,当然,我们这里并没有启动,所以不需要这一步。
启动 Supervisor 服务
supervisord -c /etc/supervisor/supervisord.conf
启动服务后,我们可以检测看一下:
ps -ef | grep LCzarCms.Admin.dll

这个时候, 我们已经不需要使用dotnet命令运行程序, 同样可以访问我们部署的.NET Core程序了。
至此关于ASP.NET Core应用程序的守护即配置完成。
七、配置Supervisor开机启动:
①进入/usr/lib/systemd/system/目录,并创建supervisord.service文件(或者在本地写好了再通过ftp工具传输到指定目录下)
vi /usr/lib/systemd/system/supervisord.service
修改文件
[Unit]
Description=Supervisor daemon [Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
②设置开机启动
激活开机启动:
systemctl enable supervisord.service

启动supervisor进程:
systemctl start supervisord.service systemctl daemon-reload
验证一下是否为开机启动:
systemctl is-enabled supervisord

重启,测试是否可以开机自启
好了。最终也成功的在重启之后,可以访问地址。
总结:
1.在虚拟机上安装CentOS7操作系统,这里就不做具体的安装内容了,可以参考VMwear安装Centos7
2.学习了linux(CentOS) 环境下,新建、删除、移动文件夹和文件的命令。同时,Linux下路径是区分目录大小写的
3.很多东西都是翻阅了网上大神的资料加上自己的实践理解总结记录的。如果有不对的或不理解的地方,希望大家可以指正和多多交流
ASP.NET Core部署系列二:发布到CentOS上的更多相关文章
- ASP.NET Core部署系列一:发布到IIS上
前言: 当构建一个ASP.NET Core应用程序并且计划将其运行在IIS中时,你会发现Core应用程序和之前版本的ASP.NET程序在IIS中的运行方式是完全不一样的.与ASP.NET时代不同,AS ...
- 无法下载apk等格式的文件的解决方案---ASP .NET Core 2.0 MVC 发布到IIS上以后无法下载apk等格式的文件的解决方案
ASP .NET Core MVC 发布到 IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...
- ASP .NET Core 2.0 MVC 发布到 IIS 上以后 无法下载apk等格式的文件
ASP .NET Core MVC 发布到 IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...
- ASP NET Core 部署 IIS 和发布
1. 微软官网原文链接: https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/index?view=aspnetcore- ...
- Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)
上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ...
- [亲测]ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问
前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...
- [亲测]七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问
前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...
- 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— 准备
==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...
- ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成
ASP.NET Boilerplate 学习 1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...
随机推荐
- .NET Core的JWT认证的学习
今天学习下JWT,遇到了两个坑爹问题,这里记录下.在 ASP.NET Core 中,授权的设置方式有两种,可以使用角色,也可以使用策略,这里也将简单举例角色.策略的使用. JWT这里不做介绍,如果想了 ...
- C# 中的 bool、char 和 string 类型
上一篇(地址:https://www.vinanysoft.com/c-sharp-basics/data-types/fundamental-numeric-types/)只介绍了基本数值类型,本篇 ...
- TP框架对数据库的操作
1.添加数据 1.1添加一条数据 $user = new User; $user->name = 'thinkphp'; $user->email = 'thinkphp@qq ...
- java工作流系统-流程引擎执行自定义URL
关键词:工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 bpm工作流系统 java工作流主流框架 自定义工作流引擎 概要介绍: 用户在表达自己的业务逻辑时 ...
- 更改Android设备System目录的文件的写入权限
有时候我们需要修改/system目录中文件的权限,比如将该目录下的脚本设置写入权限等,但该目录默认只有read权限,此时应该怎么办? 1.安卓设备请确保root;2.连接安卓设备,确保安卓设备打开了“ ...
- LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da | ε (3)B -> cC (4)C -> aADC | ε (5)D -> b | ε 验证文法 G ...
- 【MySQL】LIMIT以及LIMIT OFFSET
LIMIT两种方法: 两种方法: ()LIMIT A; #表示从第一条记录开始取A条记录: ()LIMIT A,B; #参数A为可选参数,表示跳过A条数据(默认为0) #参数B为必选参数,表示取B行数 ...
- Vue自定义指令使用场景
当你第一次接触vue的时候,一定会使用到其中的几个指令,比如:v-if.v-for.v-bind...这些都是vue为我们写好的,用起来相当的爽.如果有些场景不满足,需要我们自己去自定义,那要怎么办呢 ...
- 基于canvas二次贝塞尔曲线绘制鲜花
canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...
- Java 读取excel表格文件
注意,本文使用的Jar包为jxl.jar,只能处理97-03版本xls格式的Excel jar包 maven依赖: <dependency> <groupId>net.sour ...