适用于: .NET Core 2.1、.NET Core 3.1、.NET 5
本文讨论如何使两个 ASP.NET 核心应用程序并行运行、侦听不同端口和处理传入请求。
先决条件
若要完成本教程的此部分,应设置以下各项:
- 同时安装了 .NET Core 3.1 和 .NET 5.0 SDK。
- Nginx 自动运行并侦听端口 80 上发送的请求。
- Nginx 配置为反向代理,并将所有请求路由到 ASP.NET Core 应用程序(侦听端口 5000)。
- 一个 ASP.NET 核心应用程序,该应用程序运行并配置为在服务器重启或进程停止后自动启动。
- 已启用并配置为允许 SSH 和 HTTP 流量的 Linux 本地防火墙。
- 下载并提取到 /var/buggyamb_v1.1 目录的核心应用程序的示例 buggy ASP.NET。
本系列中使用的第一个 ASP.NET Core 演示应用程序是 ASP.NET Core 5.0 应用程序。 第二个应用程序是 ASP.NET Core 3.1 应用程序。 如果没有同时安装 .NET Core 3.1 和 .NET 5.0 SDK,请在继续之前安装缺少的 SDK。
注意
可以通过运行 dotnet --info 命令来检查已安装的运行时和 SDK 版本。 本系列的上一部分讨论了 .NET Core 安装。
本部分的目标
在本部分结束时,你将有两个 ASP.NET 核心应用程序并行运行,侦听不同的端口,以及处理传入的请求。
你将在此部分中执行的大多数操作将类似:为第二个 ASP.NET Core 应用程序创建服务文件,以便在服务器重启或进程停止时启动它。
运行第二个应用程序
将第二个应用程序作为类似于正在运行的第一个应用程序的服务运行。 在创建服务文件之前,请确保它正常运行。
回想一下,在前面的章节中,系统会指示将测试调试应用程序 复制到 /var/buggyamb_v1.1/ 目录,然后使用命令运行该应用程序 dotnet /var/buggyamb_v1.1/BuggyAmb.dll 。 可能会收到以下错误消息:
System.IO.IOException:无法绑定到已使用的地址
http://127.0.0.1:5000:地址。
根据此消息,另一个进程已在使用端口 5000。 这是显而易见的。 但是,如何了解哪个进程正在使用端口? 通过运行 sudo netstat -tulpn | grep 5000 命令。 在以下屏幕截图中,PID 是12536进程名称。dotnet 你很可能看到你的进程 ID 会有所不同:
下一步是了解侦听端口 5000 的 dotnet 进程托管哪些 ASP.NET Core 应用程序。 可以运行以下命令 cat /proc/12536/cmdline 以获取类似于以下屏幕截图的结果。
这是本系列中配置的第一个 ASP.NET Core 应用程序。 它正在侦听端口 5000。 因此,我们的新 ASP.NET 核心 buggy 应用程序无法侦听同一端口。
注意
你在这里学到了一些新的东西。 有一个名为 /proc 的目录。 如果列出此目录的内容,你将看到针对当前运行的每个 PID 命名的目录。 每个子文件夹将有多个文件,可用于获取每个进程的属性,例如命令行和内存或 CPU 信息。 目前,不要专注于这一点,因为我们将在介绍工具和流程时对其进行讨论。
端口冲突问题的解决方案不是停止运行第一个应用程序。 由于目标是让两个应用程序同时运行,因此解决方案实际上是在不同的端口上运行第二个 ASP.NET Core 应用程序。
配置第二个 ASP.NET Core 应用程序以侦听其他端口
可通过不同的方法来实现此目标:
- 用于
UseUrls()在Program.cs中设置端口:这意味着端口在应用程序中硬编码。 虽然我们可以从配置文件中读取端口,但你不想更改应用程序并再次编译。 因此,此培训不会专注于此解决方案。 - 命令行参数:运行应用程序时使用
--urls参数。 - 环境变量:设置用于侦听以使用环境变量的 URL。 使用
DOTNET_URLS或ASPNETCORE_URLS环境变量名称来实现此目的。
环境变量和命令行参数方法都是需要考虑的选项。 尝试测试该 --urls 选项,如以下屏幕截图所示。
请记住,目标是将应用程序作为服务运行。 这要求你有一个服务文件,你可以在其中设置环境变量。 可以按前面所示设置可执行文件命令,也可以设置环境变量。 以下示例使用环境变量将应用程序配置为侦听备用端口。
为第二个应用程序创建服务单元文件
你将在服务单元文件中使用以下服务定义。 请记住,第二个应用程序将在 /var/buggyamb_v1.1 目录中运行。
注意
该 Environment=ASPNETCORE_URLS=http://localhost:5001 行将声明一个环境变量 ASPNETCORE_URLS ,该变量命名并告知应用程序侦听端口 5001:
[Unit]
Description=BuggyAmb is a really buggy application
[Service]
WorkingDirectory=/var/buggyamb_v1.1/
ExecStart=/usr/bin/dotnet /var/buggyamb_v1.1/BuggyAmb.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=buggyamb-identifier
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=ASPNETCORE_URLS=http://localhost:5001
[Install]
WantedBy=multi-user.target
服务文件名将为 buggyamb.service,将在 /etc/systemd/system/ 目录中创建。 就像之前一样,使用 vi 编辑器并运行 sudo vi /etc/systemd/system/buggyamb.service 命令来创建服务定义文件。 复制并粘贴此配置,并将其保存。 同样,请注意如何设置 ASPNETCORE_URLS 环境变量:
现在,你已将 buggy ASP.NET Core Web 应用程序配置为作为守护程序运行。 这足以满足我们在训练开始时指出的目标吗? 通过运行 sudo systemctl enable buggyamb.service 和 sudo systemctl start buggyamb.service 命令启用和启动服务。 然后,通过运行 systemctl status buggyamb.service检查服务状态,如以下屏幕截图所示。
现在,你可以检查 BuggyAmb 应用程序是否按预期工作。 curl localhost:5001运行命令,让 BuggyAmb HTML 的欢迎页显示在控制台中,如以下屏幕截图所示。
应用程序尚无法从客户端进行测试,因为它正在侦听端口 5001。 防火墙设置中不允许使用此端口。 由于 Nginx 不会向 Internet 公开端口,因此可以将 Nginx 配置为侦听端口 80,并在使用特定主机名发出传入 HTTP 请求时将流量路由到 BuggyAmb。 例如,可以使用主机名: http://buggyamb 或 http://buggyweb。 还可以使用所需的任何其他主机名。
目前,目标是让第二个 ASP.NET 核心应用程序与第一个演示应用程序并行运行。 在下一章中,我们将继续配置 Nginx,如本部分所述。