如何在单台Linux版Azure App Service部署多个.NET Core API应用
在单台Linux版Azure App Service部署多个.NET Core API的方案
一、Blob存储挂载运行应用的可行性
不可行。Azure App Service的路径映射挂载Blob存储仅支持静态内容读取(如静态文件、配置文件),无法直接从Blob存储运行.NET Core应用:Blob存储是对象存储,不支持文件系统的执行权限、随机写入等特性,无法满足.NET Core应用运行的底层依赖要求。
二、规范实现方案
方案1:虚拟应用(限内置.NET运行时场景)
Linux版App Service的虚拟应用支持仅针对内置.NET运行时的场景,操作步骤如下:
- 将每个.NET Core API独立发布为部署包,分别放置到
/home/site/wwwroot下的子目录(如api1、api2)。 - 在Azure门户进入App Service的「配置」→「路径映射」,添加虚拟应用规则:
- 虚拟路径:
/api1(对应API的访问路径前缀) - 物理路径:
/home/site/wwwroot/api1
- 虚拟路径:
- 确保每个API的
appsettings.json中配置ASPNETCORE_URLS为http://0.0.0.0:端口(App Service会自动处理端口映射)。 - 部署时将各API文件上传到对应子目录即可。
方案2:反向代理路由(推荐)
通过部署一个反向代理主应用,将不同路径的请求路由到对应的.NET Core API,实现步骤:
- 创建.NET Core空项目,集成YARP作为反向代理,配置路由规则:
对应的var builder = WebApplication.CreateBuilder(args); builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); var app = builder.Build(); app.MapReverseProxy(); app.Run();appsettings.json配置示例:{ "ReverseProxy": { "Routes": { "api1": { "ClusterId": "api1", "Match": { "Path": "/api1/{**catch-all}" } }, "api2": { "ClusterId": "api2", "Match": { "Path": "/api2/{**catch-all}" } } }, "Clusters": { "api1": { "Destinations": { "api1": { "Address": "http://localhost:5001/" } } }, "api2": { "Destinations": { "api2": { "Address": "http://localhost:5002/" } } } } } } - 编写启动脚本
startup.sh,启动所有API和代理服务:#!/bin/bash dotnet /home/site/wwwroot/Api1.dll --urls=http://0.0.0.0:5001 & dotnet /home/site/wwwroot/Api2.dll --urls=http://0.0.0.0:5002 & dotnet /home/site/wwwroot/Proxy.dll --urls=http://0.0.0.0:8080 - 在App Service配置中设置启动命令为
./startup.sh,将所有应用文件部署到/home/site/wwwroot目录。
方案3:容器化部署(灵活度最高)
将多个.NET Core API打包为容器镜像,部署到App Service的容器环境:
- 单镜像多服务:编写
Dockerfile将所有API发布文件复制到镜像,通过启动脚本启动多个进程:FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app COPY Api1/. ./Api1/ COPY Api2/. ./Api2/ COPY startup.sh . RUN chmod +x startup.sh EXPOSE 80 5001 5002 CMD ["./startup.sh"] - Docker Compose多服务:编写
docker-compose.yml定义多个API服务和代理服务,在App Service中选择Docker Compose部署方式,指向容器注册表或上传配置文件。
内容的提问来源于stack exchange,提问作者Vinit Patel
相关产品推荐
相关产品推荐

