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