适用于: .NET Core 2.1、.NET Core 3.1、.NET 5
本文介绍如何配置 ASP.NET Core 应用程序,以确保应用程序在服务器重启后自动启动。
先决条件
若要遵循本部分中的练习,必须在 Linux 中安装和部署 ASP.NET 核心 Web 应用程序。
还必须将 Nginx Web 服务器配置为反向代理,以便从端口 80 将请求路由到后端 ASP.NET 核心应用程序。
本部分的目标
本系列前面的部分演示了如何将 Nginx 配置为反向代理以及如何排查 HTTP 502 代理错误。 HTTP 502 响应代码的原因是,Nginx 尝试将流量转发到其中时,后端 ASP.NET Core 应用程序未运行。
此问题是通过手动运行 ASP.NET Core 应用程序暂时解决的。 但是,如果应用程序崩溃,该怎么办? 还是必须重启服务器? 每次手动重启 ASP.NET Core 应用程序并不是一个可行的解决方案。 因此,在本部分中,你将将 Linux 配置为在应用程序崩溃后启动应用程序。
到目前为止,你已将 Nginx 和 ASP.NET Core 配置为协同工作。 Nginx 侦听端口 80 并将请求路由到侦听端口 5000 的 ASP.NET Core 应用程序。 尽管 Nginx 自动启动,但每次重新启动服务器时,都必须手动启动 ASP.NET Core 应用程序。 否则,ASP.NET Core 应用程序会正常退出或崩溃。
如果将 IIS 作为代理运行 ASP.NET Core,IIS ASP.NET 核心模块(ANCM)将处理进程管理,ASP.NET 核心进程会自动启动。 另一个选项是在 Windows 中以服务的形式运行 ASP.NET Core,以便在计算机启动时立即配置自动启动功能。
为 ASP.NET Core 应用程序创建服务文件
回想一下,该 systemctl
命令用于管理“服务”或“守护程序”。 守护程序与 Windows 服务的概念类似。 此类服务可以在系统启动时自动重启。
什么是服务文件?
在 Linux 中,还有一个具有“.service”扩展名的单元配置文件,用于控制进程退出时守护程序的行为。 这些文件也称为服务文件、单元文件和服务单元文件。
这些服务文件位于以下目录中之一:
- /usr/lib/systemd/:存储已下载应用程序的服务文件
- /etc/systemd/system/:存储由系统管理员创建的服务文件
检查 Nginx 服务文件。 它通过包管理器进行安装。 其配置文件应位于 /usr/lib/systemd/system/system/ 文件夹中。 systemctl status nginx
运行该命令还会显示服务文件的位置。
这就是 Nginx 服务文件的外观。
ASP.NET Core 应用程序的示例服务文件
以下示例单元文件内容取自 Linux 上的主机 ASP.NET Core 和 Nginx:
[Unit]
Description=Example .NET Web API App running on Ubuntu
[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/bin/dotnet /var/www/helloapp/helloapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
以下是此内容的一些关键方面:
WorkingDirectory
是发布应用程序的目录。ExecStart
是启动应用程序的实际命令。Restart=always
是自我解释的。 如果由于某种原因(无论是手动还是由于崩溃)而停止,则始终会启动此过程。RestartSec=10
也是自我解释的。 进程停止后,将在 10 秒后启动。SyslogIdentifier
很重要。 这意味着“系统日志标识符”。 有关守护程序的信息在系统日志中记录在此名称下。 还可以使用此标识符查找进程的 PID。User
是管理服务的用户。 它应存在于系统中,并具有应用程序文件的相应所有权。- 可以在服务文件中设置任意数量的环境变量。
注意
用户 www-data
是系统中的特殊用户。 可以使用此帐户。 你将创建一个新用户,用于在 Linux 中练习用户权限。 但是,如果不想创建另一个 Linux 用户,则可以使用 www-data
。
为 ASP.NET Core 应用程序创建服务文件
你将用于 vi
创建和编辑服务文件。 服务文件将进入 /etc/systemd/system/ 文件夹。 请记住,在此系列中,你已将第一个应用程序 发布到 /var/firstwebapp/ 文件夹。 因此, WorkingDirectory 应指向此文件夹。
下面是最终配置文件:
[Unit]
Description=My very first ASP.NET Core applications running on Ubuntu
[Service]
WorkingDirectory=/var/firstwebapp/
ExecStart=/usr/bin/dotnet /var/firstwebapp/AspNetCoreDemo.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=myfirstapp-identifier
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
运行 sudo vi /etc/systemd/system/myfirstwebapp.service
,粘贴最终配置,并保存文件。
这将完成 ASP.NET 核心 Web 应用程序作为守护程序运行所需的配置。
由于 Web 应用程序现已配置为服务,因此可以通过运行 systemctl status myfirstwebapp.service
来检查其状态。 如以下屏幕截图所示,应用程序处于禁用状态(系统重启后不会自动启动),并且它当前未运行。
若要启动服务,请运行 sudo systemctl start myfirstwebapp.service
该命令,然后再次检查状态。 这一次,应会看到服务正在运行,进程 ID 应列在它旁边。 该命令输出还显示新创建的服务的系统日志中的最后几行,并显示服务正在侦听 http://localhost:5000
。
如果 Web 应用程序意外停止,它将在 10 秒后自动启动。
最后一步是:服务正在运行,但未启用。 “Enabled”表示在服务器启动后自动启动。 这是所需的最终配置。 运行以下命令,确保已启用该服务:
sudo systemctl enable myfirstwebapp.service
这是 ASP.NET Core 应用程序的里程碑,因为你已将其配置为在服务器重启或进程终止后自动启动。
测试 ASP.NET Core 应用程序是否自动重启
在转到下一部分之前,请确保一切按预期工作。 当前配置如下所示
- Nginx 自动运行,并侦听端口 80 上发送的请求。
- Nginx 配置为反向代理,并将请求路由到 ASP.NET Core 应用程序。 应用程序正在侦听端口 5000。
- ASP.NET Core 应用程序配置为在服务器重启或进程停止或崩溃后自动启动。
因此,每当 ASP.NET 核心服务停止时,它都应在 10 秒内重启。 若要测试此行为,需要强制停止进程。 你预计它会在 10 秒内再次开始。
注意
ASP.NET Core 应用程序的当前进程 ID。 在进程终止之前,此处显示的尝试的进程 ID 为 5084 。 若要查找 ASP.net Core 应用程序的进程 ID,请运行以下命令 systemctl status myfirstwebapp.service
。
若要强制停止进程,请运行以下命令:
sudo kill -9 <PID>
注意
9
下面是信号类型。 根据 man
信号命令, 9
是 SIGKILL (终止信号)。 可以使用命令“终止和信号”打开帮助页 man
,了解有关本主题的详细信息。
systemctl status myfirstwebapp.service
在命令后kill
立即运行该命令,等待大约 10 秒,然后再次运行相同的命令。
在此屏幕截图中,可以看到以下信息:
- 在终止之前,ASP.NET 核心进程的进程 ID 为 5084。
- 服务状态指示已终止使用 PID 5084 的进程,并且它再次激活,因为已配置自动重启。
- 几秒钟后,将启动一个新进程(PID 5181)。
如果尝试使用 curl localhost
访问站点,应会看到 ASP.NET Core 应用程序仍在响应。
后续步骤
第 2.3.1 部分 - [可选] 在 Linux 中将 ASP.NET Core 应用程序配置为在其他用户下自动启动。