运行多个应用程序和ASP. NET带有部署清单的核心应用程序 - AWS Elastic Beanstalk

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

运行多个应用程序和ASP. NET带有部署清单的核心应用程序

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

部署清单增加了对的支持。 NETElastic Beanstalk 的核心应用程序。您可以部署。 NET没有部署清单的框架应用程序。但是,。 NET核心应用程序需要部署清单才能在 Elastic Beanstalk 上运行。使用部署清单时,您可以为每个应用程序创建一个站点档案,然后将这些站点存档捆绑到包含部署清单的第二个ZIP存档中。

部署清单还增加了在不同路径上运行多个应用程序的能力。部署清单定义了一系列部署目标,每个目标IIS都有一个站点存档和运行它的路径。例如,你可以在/api路径API上运行一个 Web 来处理异步请求,在根路径上运行一个 Web 应用程序来使用。API

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

要进行完全自定义,您可以在 Windows 中编写自己的部署脚本, PowerShell 然后告诉 Elastic Beanstalk 要运行哪些脚本来安装、卸载和重启应用程序。

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

。 NET核心应用程序

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

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

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

例 aws-windows-deployment-manifest.json-。 NET核心
{ "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核心应用程序。该WebApiSampleApp应用程序实现了一个简单的 WebAPI,并在/api路径上提供异步请求。DotNetSampleApp 应用程序是在根路径上服务请求的 Web 应用程序。

例 aws-windows-deployment-manifest.json-多个应用程序
{ "manifestVersion": 1, "deployments": { "aspNetCoreWeb": [ { "name": "WebAPISample", "parameters": { "appBundle": "WebApiSampleApp.zip", "iisPath": "/api" } }, { "name": "DotNetSample", "parameters": { "appBundle": "DotNetSampleApp.zip", "iisPath": "/" } } ] } }

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

配置应用程序池

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

  • 您可以将 out-of-process 托管模式与 Kestrel 网络服务器一起使用。使用此模型,您可以配置多个应用程序以在一个应用程序池中运行。

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

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

例 web.config-适用于 Ke out-of-process strel 托管模型
<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在指定路径上运行的框架 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 运行一个名为 installsiteInstall.ps1 脚本。此脚本在实例启动和部署期间安装网站。除此之外,部署清单还告诉 Elastic Beanstalk 在部署期间安装新版本之前uninstall运行脚本,restart并在管理控制台中选择 “重启应用服务器” 时重新启动应用程序的脚本。 AWS

例 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" } } } ] } }

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

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