原文:CentOS 7 部署 ASP.NET Core 应用程序

看了几篇大牛写的关于 Linux 部署 ASP.NET Core 程序的文章,今天来实战演练一下。2017年最后一个工作日,提前预祝大家伙元旦快乐。不扯淡,直接进入正题。您有任何问题请在评论区留言。

环境准备

网上看了一下,Linux 云服务器还挺贵的,那就只好先用 VMware 虚拟机搭建个吧。这里我选装的 Linux 系统版本的是 CentOS,Linux 系统众多发行版之一,相信各位园友也不陌生。

软件版本信息如下:

虚拟机安装、系统镜像配置过程,大家参考网上教程应该没啥问题,我这不再赘述。

成功安装并登陆 CentOS 7 Minimal 系统后,发现无法上网,后来搜索找到原因:CentOS 7 Minimal 默认没有启动网络配置。

接下来就通过vi命令编辑网卡配置文件ifcfg-ens33(其他版本名称可能略有不同,但路径一致)。具体命令如下:

vi /etc/sysconfig/network-scripts/ifcfg-ens33

ONBOOT=no改为ONBOOT=yes,设置随系统开机运行。然后:wq强制保存并退出编辑文件即可。

最后,需要重启一下网络服务。命令如下:

service network restart

目前应该可以上网了,可以尝试用命令ping www.baidu.com来检查下网络是否通畅。

如上图,可以接收响应,证明网络畅通。反之,证明你的网络还是不通,就需要考虑其他原因了。

暂时还没有安装VMware Tools,直接在虚拟机中编(复)写(制)命令多有不便,这里可以通过连接工具 PuTTY 在Window系统中连接虚拟机中的 CentOS 系统,连接服务器也同样适用。

软件截图:

选择SSH连接协议,输入CentOS系统IP地址,点击【Open】按钮连接。输入系统用户名密码即可登录系统。

问:怎么知道虚拟机中CentOS系统的IP地址呢?

答:可以通过ifconfig命令来获取系统的IP地址。说明一点,因为这里我选的是 CentOS 7 Minimal 最小化安装,需要联网后先执行命令yum install net-tools下载网络工具包,然后才能使用ifconfig命令。

安装 .NET Core SDK

Linux各个发行版如何安装 .NET Core SDK,微软官方已经给出了标准答案,我这里就把在 CentOS 上的安装方法做一个简要说明。

Step1:安装 dotnet 产品提要

要开始安装 .NET,您需要注册 Microsoft 签名密钥并添加 Microsoft 产品提要。每台机器只需要做一次。 打开命令提示符并运行以下命令:

sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'

Step2:安装 .NET SDK

更新可用于安装的产品,安装 .NET 所需的组件,然后安装 .NET SDK。
在命令提示符下,运行以下命令:

sudo yum update
sudo yum install libunwind libicu
sudo yum install dotnet-sdk-2.1.3 #最新版本请关注官网

两步即可完成 .NET Core SDK 在 CentOS7 系统下的安装,最后可执行一下命令dotnet --version,如果正常输出版本号则说明安装没有出现问题。

Linux 其他发行版安装 .NET Core SDK 教程请参见官方教程 Get started with .NET in 10 minutes

部署 ASP.NET Core 应用程序

下面就尝试把我用 ASP.NET Core Web API 开发的一个接口网站部署到我们已经安装 .NET SDK 的 CentOS 系统(下文简称服务器)中。

程序发布过程省略,把编译后的程序发布到了本地F:\wwwroot\Scorpio文件夹。

然后借助 FTP 工具 FileZilla 把程序文件传输到服务器/home/wwwroot/scorpio文件夹。

上传截图:

上传完毕后,需要先通过cd命令进入网站根目录/home/wwwroot/scorpio/,再输入如下命令启动网站程序:

dotnet Scorpio.WebApi.dll 

如果在任意非站点根目录,通过下面这种方式直接运行,程序会抛异常,不知是程序原因还是其他原因。

dotnet /home/wwwroot/scorpio/Scorpio.WebApi.dll 

如果你可以看到如下界面则表示程序启动成功。

Nginx配置反向代理

Nginx 是一个高性能的Web服务器软件。这是一个比 Apache HTTP Server 更加灵活和轻量级的程序。

我们的网站程序启动的端口是5000,可以借助 Nginx 把程序5000端口映射到80端口。

Nginx官方文档 & Nginx开发从入门到精通 - Tengine

安装 Nginx

首先,我们需要在服务器上安装 Nginx。

Step1:添加 Nginx 存储库

要添加 CentOS 7 EPEL 仓库,请打开终端并使用以下命令:

sudo yum install epel-release

Step2:安装 Nginx

现在 Nginx 存储库已经安装在您的服务器上,请使用以下yum命令安装 Nginx:

sudo yum install nginx

Step3:启动 Nginx

Nginx 不会自行启动。要运行 Nginx,请输入:

sudo systemctl start nginx

如果您正在运行防火墙,请运行以下命令以允许 HTTP 和 HTTPS 通信:

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

此时,可以在本机的浏览器中访问服务器的 IP 地址http://192.168.83.128来验证 Nginx 是否成功运行。

如果能看到 Nginx 的默认转发网页则说明一切正常。如下截图:

如果拒绝访问,考虑服务器80端口是否开放。可尝试通过下面两条命令开放80端口、重启防火墙使修改即时生效。

firewall-cmd --zone=public --add-port=80/tcp --permanent
systemctl restart firewalld

设置 Nginx 开机启动

避免开机需要手动开启 Nginx,可以通过如下快捷命令把 Nginx 配置成系统服务,并设置为开机启动:

systemctl enable nginx  #设置开机启动

其他命令:

systemctl disable nginx   #禁止开机启动
systemctl status nginx #查看运行状态
systemctl restart nginx #重启服务

修改 Nginx 配置文件

首先,拿到 Nginx 的默认配置文件/etc/nginx/nginx.conf,把默认80端口转发配置server节点用#符注释掉。

然后,我们新建一个配置文件netcore.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 的配置加载目录/etc/nginx/conf.d,最后执行命令nginx -s reload重载 Nginx 配置,使其生效。

在本地浏览器上访问服务器地址,运行结果如下:

这个问题是由于 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

再次访问,运行结果如下:

可以看到,访问的接口成功返回数据,证明 Nginx 已经完成对我们部署应用程序的转发。

Supervisor 配置守护进程

Supervisor 是用 Python 开发的 Linux/Unix 系统下的一个进程管理工具。它可以使进程脱离终端,变为后台守护进程(daemon)。实时监控进程状态,异常退出时能自动重启。

Supervisor 不支持任何版本的 Window 系统;仅支持在 Python2.4 或更高版本,但不能在任何版本的 Python 3 下工作。

其主要组成部分:

supervisord:Supervisor 的守护进程服务,用于接收进程管理命令;

supervisorctl:Supervisor 命令行工具,用于和守护进程通信,发送管理进程的指令;

Web Server:Web 端进程管理工具,提供与 supervisorctl 类似功能,管理进程;

XML-RPC Interface:提供 XML-RPC 接口,请参阅 XML-RPC API文档

安装 Supervisor

联网状态下,官方推荐首选安装方法是使用easy_install,它是setuptools(Python 包管理工具)的一个功能。所以先执行如下命令安装 setuptools:

yum install python-setuptools

请更换root用户,执行如下命令安装 Supervisor:

easy_install supervisor

配置 Supervisor

运行supervisord服务的时候,需要指定 Supervisor 配置文件,如果没有显示指定,默认会从以下目录中加载:

$CWD/supervisord.conf  #$CWD表示运行 supervisord 程序的目录
$CWD/etc/supervisord.conf
/etc/supervisord.conf
/etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
../etc/supervisord.conf (Relative to the executable)
../supervisord.conf (Relative to the executable)

所以,先通过如下命令创建目录,以便让 Supervisor 成功加载默认配置:

mkdir /etc/supervisor

加载目录有了,然后通过echo_supervisord_conf程序(用来生成初始配置文件)来初始化一个配置文件:

echo_supervisord_conf > /etc/supervisor/supervisord.conf

打开supervisord.conf文件,可以看到echo_supervisord_conf已经帮我们初始化好了一个样例配置,我们需要简单修改一下。

尾部找到如下文本片段:

;[include]
;files = relative/directory/*.ini

改为:

[include]
files = conf.d/*.conf

即,把注释去除、设置/etc/supervisor/conf.d为 Supervisor 进程配置文件加载目录。

这样,Supervisor 会自动加载该目录下.conf后缀的文件作为共同服务配置。Supervisor 管理的每个进程单独写一个配置文件放在该目录下,supervisord.conf配置文件中保留公共配置。

创建进程配置加载目录:

mkdir /etc/supervisor/conf.d

接下来就需要为我们已经部署的 ASP .NET Core 程序的宿主进程创建一个进程配置文件netcore.conf,保存并上传到/etc/supervisor/conf.d目录。

配置文件netcore.conf内容如下:

[program:Scorpio.WebApi]                        ;自定义进程名称
command=dotnet Scorpio.WebApi.dll ;程序启动命令
directory=/home/wwwroot/scorpio ;命令执行的目录
autostart=true ;在Supervisord启动时,程序是否启动
autorestart=true ;程序退出后自动重启
startretries=5 ;启动失败自动重试次数,默认是3
startsecs=1 ;自动重启间隔
user=root ;设置启动进程的用户,默认是root
priority=999 ;进程启动优先级,默认999,值小的优先启动
stderr_logfile=/var/log/Scorpio.WebApi.err.log ;标准错误日志
stdout_logfile=/var/log/Scorpio.WebApi.out.log ;标准输出日志
environment=ASPNETCORE_ENVIRONMENT=Production ;进程环境变量
stopsignal=INT ;请求停止时用来杀死程序的信号

启动 Supervisor 服务,命令如下:

supervisord -c /etc/supervisor/supervisord.conf

这时,在会发现我们部署的网站程序不在 shell 中通过dotnet xxx.dll启动,同样可以访问。

设置 Supervisor 开机启动

首先为 Supervisor 新建一个启动服务脚本supervisor.service,然后保存并上传至服务器/usr/lib/systemd/system/目录。

脚本内容如下:

# supervisord service for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[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 [Install]
WantedBy=multi-user.target

设置开启启动:

systemctl enable supervisor

验证是否成功:

systemctl is-enabled supervisor

如果输出enabled则表示设置成功,也可重启服务器验证。

其它 Linux 发行版开机启动脚本 User-contributed OS init scripts for Supervisor

Supervisorctl 管理进程

Supervisor 服务启动后,受其管理的进程会在后台运行。可以通过supervisorctl客户端管理进程。

输入如下命令进入supervisorctl交互终端,按Ctrl+C键退出:

supervisorctl

输入help查询帮助:

supervisor> help

default commands (type help <topic>):
=====================================
add exit open reload restart start tail
avail fg pid remove shutdown status update
clear maintail quit reread signal stop version

输入help ****查询详细命令,比如输入help stop

supervisor> help stop

stop <name>             Stop a process
stop <gname>:* Stop all processes in a group
stop <name> <name> Stop multiple processes or groups
stop all Stop all processes

如何启动、停止、重启进程等命令,我这里就不在记录,大家自行查找吧。

除此之外,Supervisor 还提供了 Web 管理界面用来管理进程,如何配置启动请参考官方文档。

至此,我们已经完成了 ASP.NET Core 应用程序在 CentOS7 服务器上的部署。

相关阅读

CentOS 7 部署 ASP.NET Core 应用程序的更多相关文章

  1. CentOS 7部署ASP.NET Core应用程序

    看了几篇大牛写的关于Linux部署ASP.NET Core程序的文章,今天来实战演练一下.2017年最后一个工作日,提前预祝大家伙元旦快乐.不扯淡,直接进入正题.您有任何问题请在评论区留言. 1.环境 ...

  2. 【转载】CentOS 7部署ASP.NET Core应用程序

    看了几篇大牛写的关于Linux部署ASP.NET Core程序的文章,今天来实战演练一下.2017年最后一个工作日,提前预祝大家伙元旦快乐.不扯淡,直接进入正题.您有任何问题请在评论区留言. 1.环境 ...

  3. 【转】CentOS 7部署ASP.NET Core应用程序

    很早就看过关于net core部署在Linux上的文章,自己也曾亲自将项目部署在Linux上,今天看到这篇文章,为其格式之工整而转! 1.环境准备 网上看了一下,Linux云服务器还挺贵的,那就只好先 ...

  4. 【详细】【转】CentOS 7部署ASP.NET Core应用程序

    很早就看过关于net core部署在Linux上的文章,自己也曾亲自将项目部署在Linux上,今天看到这篇文章,为其格式之工整而转! 1.环境准备 网上看了一下,Linux云服务器还挺贵的,那就只好先 ...

  5. 部署ASP.NET Core应用程序在CentOS 7

    CentOS 7部署ASP.NET Core应用程序 看了几篇大牛写的关于Linux部署ASP.NET Core程序的文章,今天来实战演练一下.2017年最后一个工作日,提前预祝大家伙元旦快乐.不扯淡 ...

  6. 使用docker来部署asp.net core的程序

    使用docker来部署asp.net core程序 暂不介绍docker是个什么东西?不知道的自己百度. 第一步安装docker: 我的docker是装在centos7系统上,windows上我的也用 ...

  7. Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器

    前言: 本篇文章主要讲解的是如何在Linux CentOS7操作系统搭建.NET Core运行环境并发布ASP.NET Core应用程序,以及配置Nginx反向代理服务器.因为公司的项目一直都是托管在 ...

  8. 尝试在Linux上部署Asp.net Core应用程序

    快两个月没接触.net,倒是天天在用Linux,所以想尝试一下在Linux运行喜欢的.net 应用. 安装CentOS 安装.Net core for Linux 创建Asp.net Core应用程序 ...

  9. 使用Docker部署ASP.NET Core应用程序实践

    前言 最近把很火的Docker给看了,于是就磨拳擦掌要去实践一下.于是就拿之前一个aps.net core的项目(已被停止)去练手.该项目之前在ubuntu14.04上确保可以正常运行,所以docke ...

随机推荐

  1. Java基础学习总结(28)——Java对各种排序算法的实现

    这里总结下各种排序算法的java实现 冒泡排序 public class BubbleSort { publicstaticint[] bubbleSort(int[] array) { if(arr ...

  2. [Android5.1]ActivityManagerService启动过程分析

    ActivityManagerService(简称AMS)是Android系统的关键服务之中的一个.它的主要作用例如以下: 管理系统中全部应用进程的整个生命周期 管理应用进程中的Activity.Se ...

  3. [Angular] Setup automated deployment with Angular, Travis and Firebase

    Automate all the things!! Automation is crucial for increasing the quality and productivity. In this ...

  4. dinic算法学习(以poj1273为例)

    Dinic 算法模板  Dinic算法是一种比較easy实现的.相对照较快的最大流算法. 求最大流的本质,就是不停的寻找增广路径.直到找不到增广路径为止. 对于这个一般性的过程,Dinic算法的优化例 ...

  5. android 蓝牙各种UUID

    ServiceDiscoveryServerServiceClassID_UUID = '{00001000-0000-1000-8000-00805F9B34FB}' BrowseGroupDesc ...

  6. HDU 1251统计难题 字典树

    字典树的应用. 数据结构第一次课的作业竟然就需要用到树了!!!这不科学啊.赶紧来熟悉一下字典树. 空间开销太大T T #include<cstdio> #include<cstrin ...

  7. OC学习篇之---文件的操作

    今天我们来介绍OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了 ...

  8. 请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径

    转自原文 请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径. 打开C:\Windows\System32\inetsrv\config路径 找到applicationH ...

  9. Snail—Hibernate各种异常

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXExNzkxNDIyMDE4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  10. 看朋友日志发现的一个ios下block相关的内存管理问题,非常奇怪,请大家帮忙一起来回答!

    http://blog.csdn.net/fengsh998/article/details/38090205 这篇文章以下是我的回复.相同的代码仅仅是把变量的定义从局部变量改为类的成员变量就发现了非 ...