使用部署清单运行多个应用程序和 ASP.NET 内核应用程序。 - AWS Elastic Beanstalk
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用部署清单运行多个应用程序和 ASP.NET 内核应用程序。

您可以使用部署清单告知 Elastic Beanstalk 如何部署您的应用程序。通过使用此方法,您无需使用 MSDeploy 为在网站根路径上运行的单个 ASP.NET 应用程序生成源包。相反,您可以使用清单文件在不同路径上运行多个应用程序。或者,您也可以告诉 Elastic Beanstalk 使用 ASP.NET Core 部署和运行应用程序。您也可以使用部署清单配置一个应用程序池,在其中运行您的应用程序。

部署清单向 Elastic Beanstalk 添加了对 .NET Core 应用程序的支持。您可以在不使用部署清单的情况下部署 .NET Framework 应用程序。但是,.NET Core 应用程序需要在 Elastic Beanstalk 上运行部署清单。使用部署清单时,请为每个应用程序创建一个站点存档,然后将该站点存档捆绑在包含部署清单的另一个 ZIP 存档中。

部署清单还增加了在不同路径上运行多个应用程序的能力。一个部署清单定义了一组部署目标,每个部署目标有一个站点存档和一个 IIS 应在其上运行部署清单的路径。例如,您可以在 /api 路径上运行 Web API,以服务异步请求,以及使用 API 的根路径上的 Web 应用程序。

您也可以使用部署清单通过在 IIS 或 Kestrel 中的应用程序池运行多个应用程序。您可以将应用程序池配置为定期重启应用程序、运行 32 位应用程序或使用特定版本的 .NET 框架运行时。

有关完整定制,您可以在 Windows PowerShell 中编写您自己的部署脚本并告知 Elastic Beanstalk 要运行哪些脚本来安装、卸载和重启应用程序。

部署清单和相关功能需要 Windows Server 平台版本 1.2.0 或更新版本

.NET Core 应用程序

您可以使用部署清单在 Elastic Beanstalk 上运行 .NET Core 应用程序。.NET Core 是 .NET 的跨平台版本,它附带一个命令行工具 (dotnet)。您可以使用它生成一个应用程序、在本地运行该应用程序并做好发布该应用程序的准备。

注意

请参阅教程:使用 Elastic Beanstalk 部署 ASP.NET Core 应用程序以获取在 Elastic Beanstalk 上使用部署清单运行 .NET Core 应用程序的教程和示例应用程序。

要在 Elastic Beanstalk 上运行 .NET Core 应用程序,您可以运行 dotnet publish 并将 ZIP 存档中的输出打包,而不包括任何包含的目录。将具有部署清单的源包中的站点存档与类型为 aspNetCoreWeb 的部署目标放在一起。

以下部署清单将在根路径上运行一个来自名为 dotnet-core-app.zip 的站点存档的 .NET 内核应用程序。

例 aws-windows-deployment-manifest.json - .NET Core

{ "manifestVersion": 1, "deployments": { "aspNetCoreWeb": [ { "name": "my-dotnet-core-app", "parameters": { "archive": "dotnet-core-app.zip", "iisPath": "/" } } ] } }

将清单和站点存档捆绑在一个 ZIP 文档中,以创建源包。

例 dotnet-core-bundle.zip

. |-- aws-windows-deployment-manifest.json `-- dotnet-core-app.zip

该站点存档包含已编译的应用程序代码、依赖项和 web.config 文件。

例 dotnet-core-app.zip

. |-- Microsoft.AspNetCore.Hosting.Abstractions.dll |-- Microsoft.AspNetCore.Hosting.Server.Abstractions.dll |-- Microsoft.AspNetCore.Hosting.dll |-- Microsoft.AspNetCore.Http.Abstractions.dll |-- Microsoft.AspNetCore.Http.Extensions.dll |-- Microsoft.AspNetCore.Http.Features.dll |-- Microsoft.AspNetCore.Http.dll |-- Microsoft.AspNetCore.HttpOverrides.dll |-- Microsoft.AspNetCore.Server.IISIntegration.dll |-- Microsoft.AspNetCore.Server.Kestrel.dll |-- Microsoft.AspNetCore.WebUtilities.dll |-- Microsoft.Extensions.Configuration.Abstractions.dll |-- Microsoft.Extensions.Configuration.EnvironmentVariables.dll |-- Microsoft.Extensions.Configuration.dll |-- Microsoft.Extensions.DependencyInjection.Abstractions.dll |-- Microsoft.Extensions.DependencyInjection.dll |-- Microsoft.Extensions.FileProviders.Abstractions.dll |-- Microsoft.Extensions.FileProviders.Physical.dll |-- Microsoft.Extensions.FileSystemGlobbing.dll |-- Microsoft.Extensions.Logging.Abstractions.dll |-- Microsoft.Extensions.Logging.dll |-- Microsoft.Extensions.ObjectPool.dll |-- Microsoft.Extensions.Options.dll |-- Microsoft.Extensions.PlatformAbstractions.dll |-- Microsoft.Extensions.Primitives.dll |-- Microsoft.Net.Http.Headers.dll |-- System.Diagnostics.Contracts.dll |-- System.Net.WebSockets.dll |-- System.Text.Encodings.Web.dll |-- dotnet-core-app.deps.json |-- dotnet-core-app.dll |-- dotnet-core-app.pdb |-- dotnet-core-app.runtimeconfig.json `-- web.config

请参阅教程以获取完成示例。

运行多个应用程序

您可以定义多个部署目标,从而使用一个部署清单运行多个应用程序。

以下部署清单配置两个 .NET Core 应用程序。WebAPITest 应用程序实施几个 Web API 并在 /api 路径服务异步请求。ASPNetTest 应用程序是在根路径上服务请求的 Web 应用程序。

例 aws-windows-deployment-manifest.json - 多个应用程序

{ "manifestVersion": 1, "deployments": { "aspNetCoreWeb": [ { "name": "WebAPITest", "parameters": { "appBundle": "webapi.zip", "iisPath": "/api" } }, { "name": "ASPNetTest", "parameters": { "appBundle": "aspnet.zip", "iisPath": "/" } } ] } }

此处提供了一个具有多个应用场合的示例应用程序:

配置应用程序池

您可以在 Windows 环境中支持多个应用程序。有两种方法可供选择:

  • 您可以将进程外托管模型与 Kesttrel Web 服务器结合使用。使用此模型,您可以配置多个应用程序以在一个应用程序池中运行。

  • 您可以使用进程内托管模式。使用此模型,您可以使用多个应用程序池运行多个应用程序,每个池中只有一个应用程序。如果您使用的是 IIS 服务器并且需要运行多个应用程序,则必须使用此方法。

要将 Kesttrel 配置为在一个应用程序池中运行多个应用程序,请在 web.config 文件中添加 hostingModel="OutofProcess"。考虑以下示例。

例 web.config - 用于 Kestrel 进程外托管模型

<configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\CoreWebApp-5-0.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="OutofProcess" /> </system.webServer> </location> </configuration>

例 aws-windows-deployment-manifest.json - 多个应用程序

{ "manifestVersion": 1, "deployments": {"msDeploy": [ {"name": "Web-app1", "parameters": {"archive": "site1.zip", "iisPath": "/" } }, {"name": "Web-app2", "parameters": {"archive": "site2.zip", "iisPath": "/app2" } } ] } }

IIS 不支持一个应用程序池中的多个应用程序,因为它使用进程内托管模型。因此,您需要通过将每个应用程序分配到一个应用程序池来配置多个应用程序。换句话说,只将一个应用程序分配到一个应用程序池。

您可以将 IIS 配置为在 aws-windows-deployment-manifest.json 文件中使用不同的应用程序池。在参考下一个示例文件时进行以下更新:

  • 添加 iisConfig 部分,该部分包含称为 appPools 的子部分。

  • appPools 数据块中,列出应用程序池。

  • deployments 部分中,为每个应用程序定义 parameters 部分。

  • 对于每个应用程序,parameters 部分都将指定一个存档、一个运行该存档的路径以及要在其中运行的 appPool

以下部署清单配置了两个应用程序池,它们每 10 分钟重新启动一次应用程序。他们还将应用程序附加到以指定路径运行的 .NET Framework Web 应用程序。

例 aws-windows-deployment-manifest.json - 每个应用程序池一个应用程序

{ "manifestVersion": 1, "iisConfig": {"appPools": [ {"name": "MyFirstPool", "recycling": {"regularTimeInterval": 10} }, {"name": "MySecondPool", "recycling": {"regularTimeInterval": 10} } ] }, "deployments": {"msDeploy": [ {"name": "Web-app1", "parameters": { "archive": "site1.zip", "iisPath": "/", "appPool": "MyFirstPool" } }, {"name": "Web-app2", "parameters": { "archive": "site2.zip", "iisPath": "/app2", "appPool": "MySecondPool" } } ] } }

定义自定义部署

为了实现更多控制,您可以通过定义自定义部署 来完全自定义应用程序部署。

以下部署清单告知 Elastic Beanstalk 运行一个名为 siteInstall.ps1install 脚本。此脚本在实例启动和部署期间安装网站。除此之外,该部署清单还告知 Elastic Beanstalk 在部署期间安装新版本之前运行一个 uninstall 脚本,并运行一个 restart 脚本,以在您在 AWS 管理控制台中选择 Restart App Server(重启应用程序服务器)时重启应用程序。

例 aws-windows-deployment-manifest.json - 自定义部署

{ "manifestVersion": 1, "deployments": { "custom": [ { "name": "Custom site", "scripts": { "install": { "file": "siteInstall.ps1" }, "restart": { "file": "siteRestart.ps1" }, "uninstall": { "file": "siteUninstall.ps1" } } } ] } }

包括使用清单和脚本运行源包中的应用程序所需的任何项目。

例 Custom-site-bundle.zip

. |-- aws-windows-deployment-manifest.json |-- siteInstall.ps1 |-- siteRestart.ps1 |-- siteUninstall.ps1 `-- site-contents.zip