前言:html
在上一节中,经过一系列的步骤,已经将项目部署到IIS上,虽然遇到了一些问题,但最终解决并成功运行了。而在这一节中,将尝试经过linux系统的环境下,部署项目,实现Net Core跨平台的亮点。python
虽然网上已经有不少关于asp.net core在linux下的部署教程了,但我仍是想写一篇,主要加强我本身的记忆,同时分享下我部署遇到的坑。linux
我在我电脑win7的操做系统中用来虚拟机建了个CentOS7,来演示,咱们的项目如何发布在Linux上运行。nginx
开始:web
1、安装.Dotnet Core 2.2shell
Linux上运行Dotnet Core程序的前提是安装Dotnet Core Runtime,若是想要在Linux作 .NET Core的开发和编译工做,那么须要安装 Dotnet Core SDK。Dotnet Core SDK中包括了Dotnet Core Runtime,因此这里就直接安装了Dotnet Core SDKvim
Step 1:安装Dotnet产品的必要前提centos
在安装Dotnet Core前,须要注册Microsoft签名密钥并添加Microsoft产品提要,每台机器只需注册一次,执行以下命令:服务器
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
Step 2:安装Dotnet Core SDk,执行下列命令app
sudo yum update y sudo yum install dotnet-sdk-2.2 y
你们注意,会有两个“y”的缘由是,命令执行的中途停顿了,让你确认下是否进行安装,你要输入“y”确认安装才会执行安装
安装完后,咱们输入以下命令看下是否安装成功
2、部署Asp.net Core 应用程序
在CentOS系统中,新建publish文件夹
上传上一节发布的文件到至/home/publish/。
这边我使用了Xftp进行文件的上传。(若是是在本地虚拟机操做的话,也能够直接复制到系统对应的文件夹目录下)
进入目录:cd publish
检查是否能够运行:dotnet LCzarCms.Admin.dll
若是出现这些信息则表示成功运行
到此,项目就运行成功了,这时候咱们是没法访问到这个页面的,这时候咱们须要部署一个web容器来进行转发,咱们可能还要安装 nginx 、配置咱们的 FireWall 以及配置守护服务 Supervisor 等等
3、配置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
4、配置防火墙
开放80端口:
firewall-cmd --zone=public --add-port=80/tcp –permanent
重启防火墙以使配置即时生效:
systemctl restart firewalld
测试nginx是否能够访问
5、配置Nginx对ASP.net Core 应用的转发
修改Nginx的default.conf文件
将文件内容替换为:
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
再次运行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 能够解决咱们上述问题
6、配置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应用程序的守护即配置完成。
7、配置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.不少东西都是翻阅了网上大神的资料加上本身的实践理解总结记录的。若是有不对的或不理解的地方,但愿你们能够指正和多多交流