第 2.3 部分 - 将 ASP.NET Core应用程序配置为自动启动
适用于: .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进程会自动启动。 另一个选项是在 Windows 中将 ASP.NET Core作为服务运行,以便在计算机启动时立即配置自动启动功能。
为 ASP.NET Core应用程序创建服务文件
回想一下, systemctl
命令用于管理“服务”或“守护程序”。 守护程序的概念与 Windows 服务的概念类似。 此类服务可以在系统启动时自动重启。
什么是服务文件?
在 Linux 中,还有具有“.service”扩展名的单元配置文件,用于在进程退出时控制守护程序的行为。 这些也称为服务文件、单元文件和服务单元文件。
这些服务文件位于以下目录中之一:
- /usr/lib/systemd/:存储已下载应用程序的服务文件
- /etc/systemd/system/:存储由系统管理员创建的服务文件
检查 Nginx 服务文件。 它通过包管理器进行安装。 其配置文件应位于 /usr/lib/systemd/system/ 文件夹中。 运行命令 systemctl status nginx
还会显示服务文件的位置。
这就是 Nginx 服务文件的外观。
ASP.NET Core应用程序的示例服务文件
以下示例单元文件内容取自使用 Nginx 的 Linux 上的主机 ASP.NET Core:
[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 Core 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 Core服务停止时,它都应在 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 Core进程的进程 ID 为 5084。
- 服务状态指示使用 PID 5084 的进程已终止,并且它再次激活,因为配置了自动重启。
- 几秒钟后, (PID 5181) 的新进程启动。
如果尝试使用 curl localhost
访问站点,应会看到 ASP.NET Core应用程序仍在响应。
后续步骤
第 2.3.1 部分 - [可选] 将 Linux 中的 ASP.NET Core 应用程序配置为在其他用户下自动启动。