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

简介: 看了几篇大牛写的关于Linux部署ASP.NET Core程序的文章,今天来实战演练一下。2017年最后一个工作日,提前预祝大家伙元旦快乐。不扯淡,直接进入正题。您有任何问题请在评论区留言。环境准备网上看了一下,Linux云服务器还挺贵的,那就只好先用VMware虚拟机搭建个吧。

看了几篇大牛写的关于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来检查下网络是否通畅。

img_0dc368868bec2cdb46ef7480b6200852.png

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

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

软件截图:

img_1ab39b11e854b3a3a7fb43e7fa73079c.png

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

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

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

img_c40c8a9823098c19c8a14fbfdba01032.png

安装.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文件夹。

上传截图:

img_69e5c6a721e3e84a2b03cacbb4945d69.png

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

dotnet Scorpio.WebApi.dll 

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

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

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

img_143029385c32dced812f4c484dbe5e54.png

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的默认转发网页则说明一切正常。如下截图:

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节点用#符注释掉。

img_ab12f4b38b91ea1f7b918c6e1348cf41.png

然后,我们新建一个配置文件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即可。

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

img_df9f8de2f74cf6de21284e0720a7776f.png

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

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

img_d2584560c5f3b94695bcd2905b79826b.png

可以看到,访问的接口成功返回数据,证明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服务器上的部署。

相关阅读

目录
相关文章
|
14天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
1月前
|
分布式计算 关系型数据库 MySQL
Sqoop【部署 01】CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
【2月更文挑战第8天】Sqoop CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
95 1
|
8天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
8天前
|
JavaScript Linux 数据安全/隐私保护
如何在CentOS7部署Wiki.js知识库并实现分享好友公网远程使用【内网穿透】
如何在CentOS7部署Wiki.js知识库并实现分享好友公网远程使用【内网穿透】
|
14天前
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
24 0
|
14天前
|
分布式计算 Hadoop Java
centos 部署Hadoop-3.0-高性能集群(一)安装
centos 部署Hadoop-3.0-高性能集群(一)安装
14 0
|
24天前
|
Linux Shell 开发工具
CentOS8中Docker安装及部署
CentOS8中Docker安装及部署
73 0
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
1月前
|
存储 监控 Linux
Flume【部署 02】Flume监控工具Ganglia的安装与配置(CentOS 7.5 在线安装系统监控工具Ganglia + 权限问题处理 + Flume接入监控配置 + 图例说明)
【2月更文挑战第17天】Flume【部署 02】Flume监控工具Ganglia的安装与配置(CentOS 7.5 在线安装系统监控工具Ganglia + 权限问题处理 + Flume接入监控配置 + 图例说明)
28 1
Flume【部署 02】Flume监控工具Ganglia的安装与配置(CentOS 7.5 在线安装系统监控工具Ganglia + 权限问题处理 + Flume接入监控配置 + 图例说明)
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
61 0