ASP.NET Core部署系列二:发布到CentOS上


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

img

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”确认安装才会执行安装

  安装完后,我们输入如下命令看下是否安装成功

img

二、部署Asp.net Core 应用程序

在CentOS系统中,新建publish文件夹

img

上传上一节发布的文件到至/home/publish/。

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

进入目录:cd publish

img

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

img

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

img

到此,项目就运行成功了,这时候我们是无法访问到这个页面的,这时候我们需要部署一个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

img

 rpm -ivh nginx.rpm

img

yum install nginx

img

启动 Nginx

systemctl start nginx

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

systemctl enable nginx

img

四、配置防火墙

开放80端口

firewall-cmd --zone=public --add-port=80/tcp –permanent

重启防火墙以使配置即时生效

systemctl restart firewalld

img

测试nginx是否可以访问

img

五、配置Nginx对ASP.net Core 应用的转发

修改Nginx的default.conf文件

img

将文件内容替换为:

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

img

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

img

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

img

这是什么情况?经过后续了解,这个问题是由于SELinux保护机制所导致,我们需要将nginx添加至SELinux的白名单

接下来我们通过一些命令解决这个问题

①   yum install policycoreutils-python

img

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

img

③     sudo semodule -i mynginx.pp

我们再次访问运行一下:

img

这次已经可以成功的运行起来了。

至此基本完成了部署

但是,我们还是存在着其他的问题:

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

img

easy_install supervisor

img

配置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

④最下边找到如下文本片段:

img

修改为:

img

为我们部署的.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文件夹下

img

如果服务已经启动,则需要使用 supervisorctl reload 命令来使新的配置生效,当然,我们这里并没有启动,所以不需要这一步。

启动 Supervisor 服务

supervisord -c /etc/supervisor/supervisord.conf

启动服务后,我们可以检测看一下

ps -ef | grep LCzarCms.Admin.dll

img

这个时候, 我们已经不需要使用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

img

启动supervisor进程:

systemctl start supervisord.service

systemctl daemon-reload

验证一下是否为开机启动:

systemctl is-enabled supervisord

img

重启,测试是否可以开机自启

好了。最终也成功的在重启之后,可以访问地址。

总结:

  1. 在虚拟机上安装CentOS7操作系统,这里就不做具体的安装内容了,可以参考VMwear安装Centos7

  2. 学习了linux(CentOS) 环境下,新建、删除、移动文件夹和文件的命令。同时,Linux下路径是区分目录大小写的

  3. 很多东西都是翻阅了网上大神的资料加上自己的实践理解总结记录的。如果有不对的或不理解的地方,希望大家可以指正和多多交流


文章作者: 艾三元
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 艾三元 !
 上一篇
【干货分享】C# 实体类生成工具 【干货分享】C# 实体类生成工具
【干货分享】C# 实体类生成工具前言 项目实战中不论是业务编码还是通用编码,总会归纳出一些通用的工具类。放入项目中一劳永逸,让兄弟姐妹们避免编写重复代码。所以利用了工作之余的时间,将这些散落在多个项目中精致优雅的工具类,归纳起来形成工程,方
2019-06-22
下一篇 
微信公众号开发 —— 用户管理 微信公众号开发 —— 用户管理
微信公众号开发 —— 用户管理前言 微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同时,微信公众号提供了相应的接口方便我们调用,可方便的把用户同步到本地,这样我们可以自己为用户定
2019-05-31
  目录