ASP.NET Core部署手册:5.Linux篇
1.Xshell远程登录Linux系统
在实际的项目部署工作中,远程登录到服务器上是绕不开的弯。本文远程登录Linux系统选用工具的是目前最常用、最好用的Xshell。Xsheel是一个强大的安全终端模拟软件,它支持SSH1、SSH2以及Windows系统的Telnet协议。它的运行速度流程并且完美解决了中文乱码的问题。Xsheel最主要的一点是:它可以在我们常用的Windows系统下远程访问不同操作系统的服务器,从而实现良好的远程控制服务器的需求。
本文选择Ubuntu-16.04.2 x64版本的Linux系统作为演示服务器,并将Linux系统安装在Hyper-V虚拟机中运行。如果你还没有安装虚拟机可以参考《ASP.NET Core部署手册:Hyper-V虚拟机安装》文章进行安装使用。关于本文涉及的其他工具安装包提供如下:
安装包 |
下载地址 |
提取码 |
Xshell7.0中文破解版 |
4v1l |
|
Ubuntu-16.04.2 x64 |
ogzp |
在具备了Linux的部署环境和远程登录工具后,我们首先需要在Xsheel工具中新建一个用于连接Linux系统的连接会话,具体的步骤如下:
1.安装SSH
通常Xsheel是使用SSH协议来远程登录到Linux系统的,那么我们首先需要在Linux系统中安装并启动SSH,如果没有安装的话会导致Xsheel连接失败。请在Linux系统中打开终端命令窗口输入SSH安装并启用的命令:
sudo apt install openssh-server
上图的“ps -e | grep ssh”命令是用于检查SSH启动状态的,输入命令后无任何数据返回表示未启用,如果输入返回SSHD服务表示已启用,那么该系统可以使用SSH协议进行远程控制。
2.新建会话
打开Xsheel工具在左侧“会话管理器”中新建会话,并在窗口填写连接的基本信息。连接信息填写的内容可以参考下图,其中“名称”表示Xsheel连接会话的名称可以根据使用场景自定义,协议为默认的SSH即可,端口号为默认的22,主机则需要填写Linux服务器的IP地址。
3.身份验证
在左侧节点树种选中“用户身份验证”节点,然后在表单种输入用于登录Linux系统的用户名和密码,方法选择Password,输入完后点击确定即可连接成功。
4.确定连接
连接后可能会出现“SSH安全警告”,其中【一次性接受】表示每次登录系统都要输入用户名和密码;【接受并保存】表示将当前用户名和密码进行加密生成密钥,下一次则不用输入用户名和密码进行连接,推荐点击【接受并保存】。
连接成功后的界面如图:
2.Linux上运行.NET Core 的先决条件
2.1.Microsoft包
在通过Xshell工具登录到Linux系统后,我们首先需要将Microsoft包的签名密钥添加到受信任密钥列表,并安装注册Microsoft包存储库,该步骤每台服务器只需要注册一次即可,无需重复注册。命令如下:
下载(2条命令)
wget https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb -O
packages-microsoft-prod.deb
解压注册
sudo dpkg -i packages-microsoft-prod.deb
2.2.ASP.NET Core运行时
由于本文采用的部署模式是“框架依赖”,所以此处需要安装.NET运行时。读者可以根据自身情况选择安装和项目框架所匹配的运行时版本,安装命令如下:
sudo apt install aspnetcore-runtime-6.0
安装完成后,可以通过.NET CLI命令:“dotnet --info”,来验证是否安装成功。
3.编译发布
1.打开我们解决方案中启动项目的目录,鼠标右击空白处,在展开的菜单栏中点击“在终端中打开”。
2.使用.NET CLI命令结合命令窗口编译发布Web站点,在命令窗口输入以下命令:
dotnet publish --configuration Release -o LinuxPublish
以上的命令表示我们将代码生成配置为Release模式,-o表示将编译发布后的文件存放在项目根目录中的“LinuxPublish”的文件夹中。
3.输入.NET CLI命令后进行回车,如果执行没有异常且发布的文件成功创建,则表示发布成功。
4.文件上传和解压
4.1.上传
在对项目成功发布后,我们需要将发布的文件上传到Linux系统中,由于使用Xshell工具以命令行的方式连接的系统,无法通过界面功能来完成,所以我们需要安装一款支持命令操作的文件传输工具lrzsz,该工具安装即用,不需要任何的配置,就能方便快捷的在 Linux 和 Windows 之间传输文件。
安装命令:
sudo apt install lrzsz
创建发布站点的目录,请根据自身的情况定义要将发布站点发在哪个目录,下面命令会在home目录下创建一个目录:
mkdir WebSite
进入站点目录:
cd WebSite
在安装完lrzsz工具和创建站点目录后,我们先将项目的发布文件压缩成ZIP文件,然后直接将压缩包拖动到Xshell的命令窗口中,就可以实现文件的上传操作。在文件成功上传后会出现以下窗口的提示,点击关闭即可。
4.2.解压
在解压文件前,我们需要安装一个Linux系统中的解压工具unzip,命令如下:
sudo apt install unzip
安装完成后我们在项目发布压缩文件所在的目录下,执行解压命令:
sudo unzip 文件名.zip
5.开启应用服务
在完成对项目发布文件的压缩包解压后,我们进入解压后的发布文件目录,命令如下:
cd 项目发布目录名称
在进入目录后,我们输入“ls”命令就可以加载出发布文件目录中包含的所有文件。
然后我们在发布文件目录输入以下命令,启动ASP.NET Core应用服务:
dotnet 项目文件名.dll --urls "http://0.0.0.0:5000"
命令中的项目文件名需要替换为“启动项目”的名称,一般是我们解决方案中启动项目的名称。命令中urls后面的IP地址则表示,应用服务侦听IP地址,该地址代表监听不局限于某个IP,即使用服务器分配的IP加上5000端口号就可以访问。
在输入完命令后回车,出现类似下图的界面则表示应用服务以及启动,此时就可以对站点进行访问,保持正常的访问必须要求Xshell不能断开连接。
6.nohup
在Linux系统中我们无法使用IIS服务器,而采用的是ASP.NET Core内置的Kestrel服务器,使用Kestrel服务器则必须保证ASP.NET Core应用服务是开启的,但是在Xshell远程终端工具关闭之后,我们的项目的应用服务也会随之关闭。而使用nohup命令可以快速解决这一问题,使用 nohup 命令的主要作用就是:当Xshell远程终端关闭之后,依然可以让项目的应用服务在后台执行。nohup命令如下:
nohup dotnet 项目名称.dll --urls "http://0.0.0.0:5000" &
执行完nohup命令后,出现类似下图中的提示(返回一个进程ID)则代表执行成功。
部署到当前阶段,我们的ASP.NET Core应用其实就可以进行访问和使用了,这是由于ASP.NET Core应用本身都内置了一个Kestrel的Web服务器,该服务器可以支撑我们Web应用程序的运行,我们现在可以使用相应的URL对站点进行访问测试。
本文截止到目前位置,对于当前部署阶段而言,它不失为一个快速简单的部署方案,但是这种方式比较适用于测试或演示环境,而不适用于生产环境。原因主要有两点:
- 当前服务器系统重启或出现服务意味关闭的情况,ASP.NET Core应用服务不会自动开启,从而导致站点无法访问;
- 对于访问量高频的复杂项目而言,不会将Kestrel作为直接处理HTTP请求的服务器,而是加入代理服务器并实现负载均衡的方式,从而缓解服务器的承受压力提高速度;
7.守护进程
nohup命令可以实现:Web应用在脱离“终端”(类似Xshell等远程登录工具)的连接后仍然可以继续运行,且使用简单方便。但是当服务器系统重启或出现服务意外关闭的情况,我们部署的应用服务不会自动启动,这对于生产环境而言无疑是很大的灾难。
为了解决nohup命令的短板,以及保障应用程序的稳定运行,我们可以在Linux系统中为应用服务添加守护进程,它是一种运行在后台的特殊进程,可以周期性的执行应用程序或用于监听端口处理网络请求。守护进程还会在系统重启或意外关闭服务后自动开启应用服务,并且不会因为远程连接的终端工具断开而中断,除非系统关闭它才会退出。
本文将介绍两种实现ASP.NET Core应用守护进程的方式,一种是创建Linux系统中的服务(service)实现,另一种是由Python开发的一套通用的进程管理工具Supervisor来实现。你可以根据实际情况选择其中一项作为创建守护进程的方式。
7.1.创建Linux服务实现守护进程
类似于Windows一样,Linux系统中也有“服务”这一说法,服务相当于一个后台进程,在进程中自动运行处理某个应用程序,基于它可以带给其中应用程序一定的维稳性,因此我们又将它称为守护进程。所以我们经常将一些需要长时间运行的程序以服务的方式运行。Linux中的服务是以service的形式来体现,服务的创建方式主要是通过配置service文件来实现,下面主要介绍下创建服务文件(service)的步骤。
1.切换账户
由于配置服务的一些列行为需要管理员的权限,所以我们先将当前的账号切换为root用户。
sudo su root
2.进入Linux的Daemon管理路径
cd /etc/systemd/system
3.创建service配置文件
vi myProject.service
4.service配置文件内容
主要分为三个部分,控制单元 [Unit] 的定义、服务 [Service] 的定义、以及 [Install] 安装部分。下面提供了一个使用模板进行参照,使用的时候最好将其中带“#”的注释去除掉。
[Unit]
Description=Daemon for my first ASP.NET Core application #当前服务配置文件的描述[Service]
WorkingDirectory=/home/jcx/LinuxPublish
ExecStart=/usr/bin/dotnet /home/jcx/LinuxPublish/MockSchoolManagement.Mvc.dll --urls "http://0.0.0.0:5000"Restart=always #服务推出后,不管是什么退出原因,总是重启
RestartSec=10 #重启服务之前,需要等待的秒数
SyslogIdentifier=MockSchoolManagement
User=root #使用该服务的用户
Environment=ASPNETCORE_ENVIRONMENT=Production #环境变量[Install]
WantedBy=multi-user.target
对于ASP.NET Core的应用部署可以参考上面模板的注释进行套用,大部分的值都是固定的,其中对几个比较重要进行强调:
WorkingDirectory:设置为ASP.NET Core应用发布文件的所在目录;
ExecStart:启动服务的执行命令,该命令需要设置为可以启动我们的ASP.NET Core应用程序的命令,命令中主要分为3部分,每部分又空格隔开:
- 第一部分为常量值:/usr/bin/dotnet(相当用于启动.Net程序的工具);
- 第二部分是我们ASP.NET Core应用程序中启动项目的DLL所在目录;
- 第三部分是设置ASP.NET Core中Web主机服务监听的端口;
注意:为确保该服务配置文件能够正常启动我们的ASP.NET Core应用程序,我们可以事先在命令行中测试运行下ExecStart中的命令,看是否能够正常执行。
5.加载服务配置文件
systemctl daemon-reload
6.将服务设置为开机启动
systemctl enable 服务文件名
7.启动服务
systemctl start 服务文件名
8.查看服务状态
systemctl status 服务文件名
在输入一系列的配置命令后,在输入查看服务状态的命令,如果出现如上图一样的绿色字体“running”,则表示我们的ASP.NET Core应用以守护进程的形式正常启动。
7.2.使用Supervisor工具创建守护进程
Supervisor是一个可以管理和监控Linux/Unix操作系统的进程管理工具,类似于Linux中的service服务一样可以为我们的ASP.NET Core应用实现守护进程。该工具不仅可以很方便的对服务进程进行启动、重启、关闭等基础功能,它还提供可视化进程状态管理的Web界面。有关更多Supervisor的介绍详见官方文档:http://supervisord.org/,下面主要介绍Supervisor创建守护进程的步骤。
1.切换管理员账户
sudo su root
2.安装Supervisor
apt-get install supervisor
3.进入配置目录
cd /ect/supervisor/conf.d/
4.创建配置文件
vi 文件名.conf
5.配置文件内容
[program:HelloWebApp]
command=dotnet MockSchoolManagement.Mvc.dll --urls "http://0.0.0.0:5000"
directory=/home/jcx/LinuxPublish
environment=ASPNETCORE__ENVIRONMENT=Production #环境变量
user=root #进程执行的用户身份
stopsignal=INT
autostart=true #是否自动启动
autorestart=true #是否自动重启
startsecs=1 #自动重启间隔
stderr_logfile=/var/log/HelloWebApp.err.log #标准错误日志
stdout_logfile=/var/log/HelloWebApp.out.log #标准输出日志
可以参考上面的模板进行配置,使用的时候最好将其中的注释去除掉,其中重点参数说明如下:
command:运行ASP.NET Core应用的执行命令
directory:ASP.NET Core应用发布文件所在的目录
6.重启Supervisor
sudoservice supervisor stop
sudoservice supervisor start
如果启动的时候报错,可以打开位于/etc/log/supervisor/supervisord.log文件来查看具体的日志。其中dotnet 命令输出的日志文件分别为位于:
- /var/log/HelloWebApp.err.log
- /var/log/HelloWebApp.out.log
在成功重启后就可以输入网站的地址进行访问了。
7.常用命令
supervisorctl shutdown#关闭所有任务
supervisorctl stop|start program_name
supervisorctl status #查看所有任务状态
8.开启Supervisor管理界面
输入命令打开文件:“cd /etc/supervisor/supervisord.conf”,在supervisord.conf文件中添加如下信息:
[inet_http_server]
port=服务器IP:7002
Supervisor的进程状态管理界面如下如:
8.使用Nginx作为代理服务器
8.1.安装Nginx
sudo apt-get install nginx
安装完成之后,我们直接可以使用服务器的IP在浏览器进行访问,如果能够返回Nginx的默认欢迎页面则表示Nginx安装成功。
8.2.配置Nginx
将Nginx作为反向代理服务器,需要配置Nginx目录中“default”文件,配置了该文件Nginx就可以实现HTTP请求转发到Kestrel Web 服务器。输入命令“vi /etc/nginx/sites-available/default”进入在文本编辑器界面,并将“default”文件内容替换为以下代码片段:
server {
listen 80 default_server;
server_name _;
location / {
proxy_pass http://127.0.0.1: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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
模板中listen代表Nginx会监听处理来自80端口的请求,并将请求转发给http://127.0.0.1:5000(ASP.NET Core中Kestrel服务器监听的端口),配置好之后,输入命令:“nginx -t”可以检测配置文件是否正常,如果配置会返回下图的信息:
配置文件确认无误后,输入命令:“nginx -s reload”加载最新的配置文件。至此使用Nginx进行ASP.NET Core应用的反向代理已经完成。由于Nginx监听的80端口,我们可以直接使用服务器IP对站点进行访问,实际上Nginx会将我们的请求转发给Kestrel服务器。