本文内容

适用于: .NET Core 2.1、.NET Core 3.1、.NET 5

本文介绍如何配置 ASP.NET Core应用程序,以确保应用程序在服务器重启后自动启动。

先决条件

若要按照本部分中的练习操作,必须在 Linux 中安装和部署 ASP.NET Core Web 应用程序

还必须将 Nginx Web 服务器配置为反向代理,以便将请求从端口 80 路由到后端 ASP.NET Core应用程序。

此部分的目标

本系列中的上一部分演示如何将 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 Core 模块 (ANCM) 处理进程管理,并且 ASP.NET Core进程会自动启动。 另一种选择是在 中将 ASP.NET Core作为服务运行,以便在计算机启动后立即配置自动启动功能。

为 ASP.NET Core应用程序创建服务文件

回想一下,该 命令用于管理“服务”或“守护程序”。 守护程序的概念与 服务的概念类似。 当系统启动时,可以自动重启此类服务。

什么是服务文件?

在 Linux 中,还有具有“.”扩展名的单元配置文件,用于在进程退出时控制守护程序的行为。 这些文件也称为 服务文件、 单元文件和 服务单元文件。

这些服务文件位于以下目录之一:

检查 Nginx 服务文件。 它通过包管理器安装。 其配置文件应位于 /usr/lib/// 文件夹中。 运行该 nginx 命令还会显示服务文件的位置。

Nginx 服务文件如下所示。

cat 命令的屏幕截图。

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

以下是此内容的一些关键方面:

注意

该 www-data 用户是系统中的特殊用户。 可以使用此帐户。 你将创建一个新用户,用于在 Linux 中练习用户权限。 但是,如果不想创建另一个 Linux 用户,则可以使用 www-data 它。

为 ASP.NET Core应用程序创建服务文件

你将用于 vi 创建和编辑服务文件。 服务文件将进入 /etc/// 文件夹。 请记住,在本系列中,你已将第一个应用程序发布到 /var// 文件夹。 因此, 应指向此文件夹。

下面是最终配置文件:

[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///. ,粘贴最终配置并保存文件。

sudo 命令的屏幕截图。

这会完成 ASP.NET Core Web 应用程序作为守护程序运行所需的配置。

由于 Web 应用程序现在配置为服务,因此可以通过运行 .来检查其状态。 如以下屏幕截图中所示,应用程序已禁用 (系统重启) 后不会自动启动,并且当前未运行。

systemctl 状态命令的屏幕截图。

若要启动服务,请运行该 sudo start . 命令,然后再次检查状态。 这一次,应会看到服务正在运行,并且应在它旁边列出进程 ID。 命令输出还显示新创建服务的系统日志中的最后几行,并显示服务正在侦 :5000听。

sudo systemctl start 命令的屏幕截图。

如果 Web 应用程序意外停止,它将在 10 秒后自动重新启动。

最后一步是:服务正在运行但未启用。 “已启用”表示它在服务器启动后自动启动。 这是所需的最终配置。 运行以下命令以确保已启用服务:

sudo systemctl enable myfirstwebapp.service

sudo systemctl enable 命令的屏幕截图。

这是 ASP.NET Core应用程序的一个里程碑,因为你已将其配置为在服务器重启或进程终止后自动启动。

测试 ASP.NET Core应用程序是否自动重启

在转到下一部分之前,请确保一切按预期工作。 当前配置如下所示

因此,每当 ASP.NET Core服务停止时,应在 10 秒内重启。 若要测试此行为,将强制进程停止。 可以预计它会在 10 秒内重新启动。

注意

ASP.NET Core应用程序的当前进程 ID。 此处显示的尝试的进程 ID 为 5084 ,在进程被终止之前。 若要查找 核心应用程序的进程 ID,请运行该 . 命令。

若要强制停止进程,请运行以下命令:

sudo kill -9 

注意

9 下面是信号类型。 根据 man 信号命令, 9 是 (终止信号) 。 可以使用 man “终止和信号”命令打开帮助页,以了解有关本主题的详细信息。

.在命令后kill立即运行该命令,等待大约 10 秒,然后再次运行同一命令。

kill 命令的屏幕截图。

在此屏幕截图中,可以看到以下信息:

如果尝试使用curl 访问站点,应会看到 ASP.NET Core应用程序仍在响应。

后续步骤

第 2.3.1 部分 - [可选] 在 Linux 中将 ASP.NET Core应用程序配置为在其他用户下自动启动。

参与评论