Azure App Service #

什么是 App Service? #

Azure App Service 是一个完全托管的平台即服务(PaaS),用于构建、部署和扩展 Web 应用、API 应用和移动后端。

text
┌─────────────────────────────────────────────────────────────┐
│                    App Service 概览                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  支持的应用类型                                              │
│  ├── Web 应用                                               │
│  ├── API 应用                                               │
│  ├── 移动后端                                               │
│  └── 容器应用                                               │
│                                                             │
│  支持的语言/框架                                             │
│  ├── .NET / .NET Core                                       │
│  ├── Java                                                   │
│  ├── Node.js                                                │
│  ├── Python                                                 │
│  ├── PHP                                                    │
│  └── Ruby                                                   │
│                                                             │
│  核心优势                                                    │
│  ├── 完全托管平台                                           │
│  ├── 内置 CI/CD                                             │
│  ├── 自动扩展                                               │
│  ├── 高可用性                                               │
│  └── 安全合规                                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

App Service 计划 #

定价层 #

text
┌─────────────────────────────────────────────────────────────┐
│                    App Service 计划                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  免费层 (F1)                                                 │
│  ├── 60 分钟/天                                             │
│  ├── 1 GB 存储                                              │
│  ├── 共享资源                                               │
│  └── 适合开发测试                                           │
│                                                             │
│  共享层 (D1)                                                 │
│  ├── 共享资源                                               │
│  ├── 自定义域名                                             │
│  └── 适合小型应用                                           │
│                                                             │
│  基本层 (B1/B2/B3)                                           │
│  ├── 专用资源                                               │
│  ├── 自定义域名 + SSL                                       │
│  ├── 手动扩展                                               │
│  └── 适合生产环境                                           │
│                                                             │
│  标准层 (S1/S2/S3)                                           │
│  ├── 自动扩展                                               │
│  ├── 部署槽                                                 │
│  ├── 流量管理器集成                                         │
│  └── 适合企业应用                                           │
│                                                             │
│  高级层 (P1v2/P2v2/P3v2)                                     │
│  ├── 更高性能                                               │
│  ├── 更多部署槽                                             │
│  ├── 隔离环境选项                                           │
│  └── 适合高负载应用                                         │
│                                                             │
│  隔离层 (I1/I2/I3)                                           │
│  ├── 私有环境                                               │
│  ├── 最大隔离                                               │
│  └── 适合合规要求                                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

定价层对比 #

功能 免费 基本 标准 高级
存储 1 GB 10 GB 50 GB 250 GB
自定义域名
SSL 证书
自动扩展
部署槽 5 20
备份

创建 Web 应用 #

使用 Azure 门户 #

text
┌─────────────────────────────────────────────────────────────┐
│                    创建 Web 应用                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  步骤 1: 基本信息                                            │
│  ├── 订阅选择                                               │
│  ├── 资源组选择/创建                                        │
│  ├── Web 应用名称(全局唯一)                               │
│  ├── 发布方式:代码/容器                                    │
│  └── 运行时栈选择                                           │
│                                                             │
│  步骤 2: App Service 计划                                    │
│  ├── 选择现有计划                                           │
│  └── 或创建新计划                                           │
│                                                             │
│  步骤 3: 部署                                                │
│  ├── 启用 CI/CD                                             │
│  └── 或稍后部署                                             │
│                                                             │
│  步骤 4: 标签和审阅                                          │
│  ├── 添加标签                                               │
│  └── 验证并创建                                             │
│                                                             │
└─────────────────────────────────────────────────────────────┘

使用 Azure CLI #

bash
# 创建资源组
az group create --name myResourceGroup --location eastus

# 创建 App Service 计划
az appservice plan create \
  --name myAppServicePlan \
  --resource-group myResourceGroup \
  --sku B1 \
  --is-linux

# 创建 Web 应用
az webapp create \
  --name myWebApp \
  --resource-group myResourceGroup \
  --plan myAppServicePlan \
  --runtime "NODE|18-lts"

# 输出
{
  "availabilityState": "Normal",
  "defaultHostName": "myWebApp.azurewebsites.net",
  "name": "myWebApp",
  "resourceGroup": "myResourceGroup",
  "state": "Running"
}

创建不同运行时的应用 #

bash
# Python 应用
az webapp create \
  --name myPythonApp \
  --resource-group myResourceGroup \
  --plan myAppServicePlan \
  --runtime "PYTHON|3.11"

# .NET 应用
az webapp create \
  --name myDotNetApp \
  --resource-group myResourceGroup \
  --plan myAppServicePlan \
  --runtime "DOTNETCORE|8.0"

# Java 应用
az webapp create \
  --name myJavaApp \
  --resource-group myResourceGroup \
  --plan myAppServicePlan \
  --runtime "JAVA|17-java17"

部署应用 #

部署方式 #

text
┌─────────────────────────────────────────────────────────────┐
│                    部署方式                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  本地 Git                                                    │
│  ├── 简单直接                                               │
│  ├── 适合个人开发                                           │
│  └── git push azure main                                    │
│                                                             │
│  GitHub Actions                                              │
│  ├── 自动化 CI/CD                                           │
│  ├── 工作流集成                                             │
│  └── 推荐                                                    │
│                                                             │
│  Azure DevOps                                                │
│  ├── 企业级 CI/CD                                           │
│  ├── 完整 DevOps 流程                                       │
│  └── 适合团队                                               │
│                                                             │
│  FTP/S                                                       │
│  ├── 手动上传                                               │
│  ├── 适合简单部署                                           │
│  └── 不推荐生产                                             │
│                                                             │
│  容器部署                                                    │
│  ├── Docker 镜像                                            │
│  ├── ACR 集成                                               │
│  └── 适合容器化应用                                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘

本地 Git 部署 #

bash
# 配置部署用户
az webapp deployment user set --user-name <username> --password <password>

# 获取 Git 部署 URL
az webapp deployment source config-local-git \
  --name myWebApp \
  --resource-group myResourceGroup \
  --output tsv

# 添加远程仓库
git remote add azure https://<username>@myWebApp.scm.azurewebsites.net/myWebApp.git

# 推送部署
git push azure main

GitHub Actions 部署 #

yaml
# .github/workflows/azure-webapp.yml
name: Build and deploy to Azure Web App

on:
  push:
    branches: [ "main" ]
  workflow_dispatch:

env:
  AZURE_WEBAPP_NAME: myWebApp
  AZURE_WEBAPP_PACKAGE_PATH: '.'
  NODE_VERSION: '18.x'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    
    - name: Set up Node.js
      uses: actions/setup-node@v4
      with:
        node-version: ${{ env.NODE_VERSION }}
        cache: 'npm'
    
    - name: npm install and build
      run: |
        npm install
        npm run build --if-present
    
    - name: Upload artifact
      uses: actions/upload-artifact@v4
      with:
        name: node-app
        path: .

  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
    - name: Download artifact
      uses: actions/download-artifact@v4
      with:
        name: node-app
    
    - name: Deploy to Azure Web App
      uses: azure/webapps-deploy@v2
      with:
        app-name: ${{ env.AZURE_WEBAPP_NAME }}
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}

容器部署 #

bash
# 创建容器 Web 应用
az webapp create \
  --name myContainerApp \
  --resource-group myResourceGroup \
  --plan myAppServicePlan \
  --deployment-container-image-name nginx:latest

# 更新容器镜像
az webapp config container set \
  --name myContainerApp \
  --resource-group myResourceGroup \
  --docker-custom-image-name myregistry.azurecr.io/myapp:v1

# 使用 ACR
az webapp config container set \
  --name myContainerApp \
  --resource-group myResourceGroup \
  --docker-custom-image-name myregistry.azurecr.io/myapp:v1 \
  --docker-registry-server-url https://myregistry.azurecr.io \
  --docker-registry-server-user <username> \
  --docker-registry-server-password <password>

配置管理 #

应用设置 #

bash
# 设置应用设置
az webapp config appsettings set \
  --name myWebApp \
  --resource-group myResourceGroup \
  --settings KEY1=VALUE1 KEY2=VALUE2

# 查看应用设置
az webapp config appsettings list \
  --name myWebApp \
  --resource-group myResourceGroup

# 删除应用设置
az webapp config appsettings delete \
  --name myWebApp \
  --resource-group myResourceGroup \
  --setting-names KEY1

连接字符串 #

bash
# 设置连接字符串
az webapp config connection-string set \
  --name myWebApp \
  --resource-group myResourceGroup \
  --connection-string-type SQLAzure \
  --settings MyDbConn="Server=tcp:myserver.database.windows.net,1433;Database=mydb;User ID=user;Password=pass;"

环境变量访问 #

javascript
// Node.js
const dbHost = process.env.DB_HOST;
const apiKey = process.env.API_KEY;

// Python
import os
db_host = os.environ.get('DB_HOST')
api_key = os.environ.get('API_KEY')

自定义域名 #

绑定自定义域名 #

bash
# 添加自定义域名
az webapp config hostname add \
  --webapp-name myWebApp \
  --resource-group myResourceGroup \
  --hostname www.example.com

# 绑定 SSL 证书
az webapp config ssl bind \
  --name myWebApp \
  --resource-group myResourceGroup \
  --certificate-thumbprint <thumbprint> \
  --ssl-type SNI

DNS 配置 #

text
┌─────────────────────────────────────────────────────────────┐
│                    DNS 配置                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  CNAME 记录(推荐)                                          │
│  www.example.com -> myWebApp.azurewebsites.net              │
│                                                             │
│  A 记录                                                      │
│  example.com -> <App Service IP>                            │
│                                                             │
│  验证记录                                                    │
│  asuid.example.com -> <验证码>                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

部署槽 #

部署槽概念 #

text
┌─────────────────────────────────────────────────────────────┐
│                    部署槽                                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────┐     交换     ┌─────────────┐              │
│  │   生产槽     │ ←──────────→ │   预览槽     │              │
│  │ Production  │              │   Staging   │              │
│  └─────────────┘              └─────────────┘              │
│                                                             │
│  优势:                                                      │
│  ├── 零停机部署                                             │
│  ├── 预生产测试                                             │
│  ├── 快速回滚                                               │
│  └── 流量预热                                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

管理部署槽 #

bash
# 创建部署槽
az webapp deployment slot create \
  --name myWebApp \
  --resource-group myResourceGroup \
  --slot staging

# 部署到槽
az webapp deployment source config \
  --name myWebApp \
  --resource-group myResourceGroup \
  --slot staging \
  --repo-url https://github.com/user/repo \
  --branch main \
  --manual-integration

# 交换槽
az webapp deployment slot swap \
  --name myWebApp \
  --resource-group myResourceGroup \
  --slot staging \
  --target-slot production

# 交换并预览
az webapp deployment slot swap \
  --name myWebApp \
  --resource-group myResourceGroup \
  --slot staging \
  --target-slot production \
  --action preview

自动扩展 #

扩展规则 #

text
┌─────────────────────────────────────────────────────────────┐
│                    自动扩展规则                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  扩展条件                                                    │
│  ├── CPU 使用率 > 70%                                       │
│  ├── 内存使用率 > 80%                                       │
│  ├── 请求队列长度 > 100                                     │
│  └── HTTP 响应时间 > 2 秒                                   │
│                                                             │
│  扩展操作                                                    │
│  ├── 增加实例数                                             │
│  ├── 减少实例数                                             │
│  └── 保持当前实例                                           │
│                                                             │
│  实例范围                                                    │
│  ├── 最小实例数: 1                                          │
│  ├── 最大实例数: 10                                         │
│  └── 默认实例数: 2                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

配置自动扩展 #

bash
# 启用自动扩展
az monitor autoscale create \
  --resource myResourceGroup \
  --resource-type Microsoft.Web/serverFarms \
  --resource-name myAppServicePlan \
  --name myScaleSettings \
  --min-count 1 \
  --max-count 10 \
  --count 2

# 添加扩展规则
az monitor autoscale rule create \
  --resource-group myResourceGroup \
  --autoscale-name myScaleSettings \
  --scale out 1 \
  --condition "Percentage CPU > 70 avg 5m"

# 添加缩减规则
az monitor autoscale rule create \
  --resource-group myResourceGroup \
  --autoscale-name myScaleSettings \
  --scale in 1 \
  --condition "Percentage CPU < 30 avg 5m"

监控和日志 #

启用日志 #

bash
# 启用应用日志
az webapp log config \
  --name myWebApp \
  --resource-group myResourceGroup \
  --application-logging filesystem \
  --detailed-error-messages true \
  --failed-request-tracing true

# 查看日志
az webapp log tail \
  --name myWebApp \
  --resource-group myResourceGroup

# 下载日志
az webapp log download \
  --name myWebApp \
  --resource-group myResourceGroup

Application Insights #

bash
# 启用 Application Insights
az monitor app-insights component create \
  --app myAppInsights \
  --location eastus \
  --resource-group myResourceGroup

# 关联 Web 应用
az webapp config appsettings set \
  --name myWebApp \
  --resource-group myResourceGroup \
  --settings APPINSIGHTS_INSTRUMENTATIONKEY=<instrumentation-key>

最佳实践 #

性能优化 #

text
┌─────────────────────────────────────────────────────────────┐
│                    性能优化建议                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 启用本地缓存                                             │
│     └── 减少存储访问延迟                                    │
│                                                             │
│  2. 使用 CDN                                                 │
│     └── 静态内容加速                                        │
│                                                             │
│  3. 启用压缩                                                 │
│     └── 减少传输数据量                                      │
│                                                             │
│  4. 优化数据库连接                                           │
│     └── 使用连接池                                          │
│                                                             │
│  5. 异步处理                                                 │
│     └── 使用队列处理长任务                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

下一步 #

现在你已经掌握了 App Service 的使用,接下来学习 Azure Functions 了解无服务器计算!

最后更新:2026-03-29