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

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

本文介绍如何在 Linux 中将 ASP.NET Core 应用程序配置为在不同用户下自动启动。

先决条件

若要遵循本部分中的练习,必须首先遵循本系列上一部分所述的设置。 此外,必须具备以下各项:

  • Linux 虚拟机,最好运行 Linux 的 Ubuntu 18.04 LTS 分发版。
  • Nginx 在端口 80 上自动运行并侦听请求。
  • Nginx 配置为反向代理,并将传入请求路由到侦听端口 5000 的 ASP.NET Core 应用程序。
  • ASP.NET Core 应用程序配置为在服务器重启或进程停止或崩溃后自动启动。

本部分的目标

在上一部分中,你为 ASP.NET Core 应用程序创建了一个服务文件,并将该服务配置为在内置的 www-user 上下文中运行。

但是,在某些环境中,你可能希望在不同的用户上下文下运行应用程序。 这样就可以完全控制可能在同一服务器上运行的其他应用程序的隔离。 例如,如果托管多个 Web 应用程序,可能需要将每个应用程序配置为在其自己的用户帐户下运行,以便灵活地为每个应用程序单独配置权限(而不是在同一 www-data 用户上下文下运行所有应用程序)。

目标是将 ASP.NET Core 应用程序配置为在特定用户帐户下运行。

你将练习如何创建用户,并了解如何列出计算机上可用的其他用户帐户。

注意

此部分是可选的。 对于本教程系列其余部分,运行 ASP.NET Core 应用程序的用户上下文也无关紧要。

创建新用户以运行应用程序

首先创建一个新用户并编辑服务文件,以在该新用户上下文中运行服务。 若要创建用户帐户,请运行 sudo adduser <username> 命令。 对于此演示,所选用户名为 firstappuser。 但是,可以随意使用所需的任何名称。

sudo adduser 命令的屏幕截图。

此屏幕截图显示了创建 firstappuser 帐户的结果。

回想一下,ASP.NET Core 服务在 www-data 用户上下文中运行。 这是一个内置帐户,用于服务应用程序,包括 Apache 和 Nginx。 建议将此帐户用于此类工作负荷。 如果我们通过运行 groups www-data 命令 groups firstappuser 来检查用户的组成员身份,则不会注意到任何差异。

Linux 中的本地用户帐户存储在 /etc/passwd 文件中。 如果运行 sudo cat /etc/passwd,你将看到所有用户,包括根用户。 以下屏幕截图描述了每个列。

sudo cat 命令的屏幕截图。

若要查看用户之间的差异www-datafirstappuser,请sudo cat /etc/passwd | grep 'www-data\|firstappuser'运行该命令。 输出将如下所示。

sudo cat grep 命令的屏幕截图。

注意

用户 www-data/usr/sbin/nologin 为 shell 配置。 这意味着 www-data 用户无法使用 SSH 以交互方式登录到此计算机。 但是, firstappuser 能够执行此操作。 由于新帐户将是一个服务帐户,因此,这是一种安全措施,以防止用户帐户登录。

若要禁用 shell 访问,请运行 sudo usermod -s /usr/sbin/nologin firstappuser 命令。

sudo usermod 命令的屏幕截图。

到目前为止,你已经创建了一个帐户(firstappuser),该帐户可用作我们的服务帐户。 下一步是将 ASP.NET Core 服务配置为在该用户帐户中运行。 使用 vi 命令打开服务文件。 将“www-data”替换为“firstappuser”(或任何所选用户名),然后保存该文件。

命令中 firstappuser 的屏幕截图。

这使 ASP.NET Core 应用程序能够使用与默认 www-data 帐户不同的用户帐户启动。

更改服务文件后,通过运行 sudo systemctl daemon-reload重新加载配置。 然后,通过运行 sudo systemctl restart myfirstwebapp.service重启服务。

验证应用程序是否在新用户帐户下运行

有多种方法可用于标识运行特定进程的用户。 例如,可以运行 ps -aux | grep <username>。 尽管这种方法可能很有用,但仍缺少一些信息,例如实际的命令行内容。 但是,有一种简单的方法可以通过使用 htop来收集更完整的信息。

注意: Htop 是任务管理器。 本系列稍后将对此进行说明。 Htop 预安装在多个 Linux 发行版中,包括你可能使用的 Ubuntu 服务器的版本。 如果未 htop 在 Linux 发行版中安装,可以使用包管理器安装它。

检查以下屏幕截图。 可以通过运行systemctl status来获取 。PID 然后,使用-p开关将命令传递给PIDhtop该命令,以获取该过程PID的详细信息。

htop 命令的屏幕截图。

下面是命令的 htop -p <PID> 输出。

htop -p 命令的屏幕截图。

如屏幕截图所示,示例 ASP.NET Core 应用程序现在在使用此部分中讨论的命令创建的新用户下运行。

若要退出 htop,请按 F10Q

后续步骤

第 2.4 部分 - 使用本地防火墙保护 Linux,并允许从远程计算机进行远程 HTTP 访问