Linux 上的 Azure 应用服务常见问题解答

注意

本文有帮助吗? 你的输入对我们很重要。 请使用此页上的 “反馈 ”按钮告诉我们本文为你工作得有多好,或者我们如何改进它。

随着 Linux 应用服务的发布,我们正在努力添加功能和改进我们的平台。 本文提供客户最近提出的问题的解答。

如果你有问题,请对本文发表评论。

内置映像

配置运行时堆栈时,“启动文件”部分的所需值是什么?

堆栈 预期值
Java SE 用于启动 JAR 应用的命令(例如 java -jar /home/site/wwwroot/app.jar --server.port=80
Tomcat 用于执行任何所需配置的脚本的位置(例如 /home/site/deployments/tools/startup_script.sh
Node.js PM2 配置文件或脚本文件
.NET Core 编译后的 DLL 名称为 dotnet <myapp>.dll
PHP 可选 自定义启动
Python语言 可选 启动脚本
红宝石 要用于初始化你的应用的 Ruby 脚本

这些命令或脚本会在内置 Docker 容器启动之后但在应用程序代码启动之前执行。

管理

在 Azure 门户中按下“重启”按钮时,会发生什么情况?

此操作等同于 Docker 重启。

可以使用安全外壳 (SSH) 连接到应用容器虚拟机 (VM) 吗?

是的,可以通过源代码管理 (SCM) 站点实现此操作。

注意

还可以使用 SSH、SFTP 或 Visual Studio Code(用于实时调试 Node.js 应用)直接从本地开发计算机连接到应用容器。 有关详细信息,请参阅 Linux 上的应用服务中的远程调试和 SSH

如何通过 SDK 或 Azure 资源管理器模板创建 Linux 应用服务计划?

将该应用服务的“保留”字段设置为“true”。

持续集成和持续部署

更新 Docker Hub 上的映像后,我的 Web 应用仍使用旧的 Docker 容器映像。 是否支持自定义容器的持续集成和部署?

是的,若要为 Azure 容器注册表或 DockerHub 设置持续集成/部署,请遵循 适用于容器的 Web 应用的持续部署。 对于专用注册表,可以通过先停止然后启动 Web 应用来刷新容器。 或者,可以更改或添加虚拟应用程序设置,从而强制刷新容器。

是否支持过渡环境?

是的。

是否可以使用“WebDeploy/MSDeploy”来部署 Web 应用?

可以,需要将名为 WEBSITE_WEBDEPLOY_USE_SCM 的应用设置设置为 WEBSITE_WEBDEPLOY_USE_SCM

使用 Linux Web 应用时,应用程序的 Git 部署失败。 如何解决此问题?

如果 Linux Web 应用的 Git 部署失败,可选择以下选项之一部署应用程序代码:

  • 使用持续交付(预览版)功能:可将应用的源代码存储在 Azure DevOps Git 存储库或 GitHub 存储库中,以使用 Azure 持续交付。 有关详细信息,请参阅 如何为 Linux Web 应用配置持续交付

  • 使用 ZIP 部署 API:若要使用此 API, 请通过 SSH 连接到 Web 应用 ,并转到要在其中部署代码的文件夹。 运行以下代码:

    curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy
    

    如果收到找不到curl命令的错误,请确保在运行curl之前使用 apt-get install curl 安装 curl。

语言支持

我想要在 Node.js 应用程序中使用 Web 套接字,要设置什么特殊设置或配置吗?

是的,请在服务器端的 Node.js 代码中禁用 perMessageDeflate。 例如,如果使用 socket.io,请使用以下代码:

const io = require('socket.io')(server,{
  perMessageDeflate :false
});

是否支持未编译的 .NET Core 应用?

是的。

是否支持将 Composer 用作 PHP 应用的依赖关系管理器?

是的,在 Git 部署过程中,Kudu 应该检测到您正在部署 PHP 应用程序(这得益于 composer.lock 文件的存在),然后触发 composer install。

自定义容器

我可以在从 ACR 拉取映像时将托管身份与应用服务一起使用吗?

可以,可在 Azure CLI 中找到此功能。 可以使用 系统分配 的身份或 用户分配 的身份。 Azure 门户中目前不支持此功能。

我使用的是我自己的自定义容器。 我希望平台将 SMB 共享装载到 `/home/` 目录。

如果未WEBSITES_ENABLE_APP_SERVICE_STORAGE指定或设置为 false,那么/home/目录就不会在缩放实例之间共享。同时,写入的文件在重启后不会持久化。 显式地将 WEBSITES_ENABLE_APP_SERVICE_STORAGE 设置为 true 可以启用挂载。 将此值设置为 true 后,如果想要禁用装载,则需要将 WEBSITES_ENABLE_APP_SERVICE_STORAGE 显式设置为 false。

我的容器无法启动,显示“设备上没有剩余空间”的错误。 此错误的含义是什么?

Linux 上的App 服务使用两种不同类型的存储:

  • 文件系统存储:文件系统存储包含在App 服务计划配额中。 当文件保存到以 /home 为根目录的永久性存储时,会使用它。
  • 主机磁盘空间:主机磁盘空间用于存储容器映像。 它由平台通过 docker 存储驱动程序进行管理。

主机磁盘空间与文件系统存储配额分开。 它不可扩展,每个实例有 15 GB 的限制。 它用于将任何自定义镜像存储在工作节点上。 根据主机磁盘空间的确切可用性,你可能能够使用大于 15 GB,但不能保证这一点。

如果容器的可写层将数据保存在目录或/home之外,则也会占用主机磁盘空间。

平台会定期清理主机磁盘空间,以删除未使用的容器。 如果容器在/home 目录外写入大量数据或使用自带存储(BYOS),当超过主机磁盘空间限制时,这会导致启动失败或运行时异常。

我们建议您在 Linux App 服务上运行时,将容器映像保持得尽可能小,并将数据写入持久性存储或 BYOS。 如果不可能,则必须拆分App 服务计划,因为主机磁盘空间是固定的,并在App 服务计划中的所有容器之间共享。

自定义容器需要很长时间才能启动,并且平台在它完成启动之前便重启了容器。

可以配置平台在重启容器之前等待的时间量。 为此,可将 WEBSITES_CONTAINER_START_TIME_LIMIT 应用设置设为所需的值。 默认值为 230 秒,最大值为 1800 秒。

专用注册表服务器 URL 的格式是什么?

提供完整的注册表 URL,包括 https://

专用注册表选项中的映像名称的格式是什么?

添加完整映像名称,包括专用注册表 URL(例如,myacr.azurecr.io/dotnet:latest)。 使用自定义端口的映像名称不能通过门户输入。 若要设置 docker-custom-image-name,请使用 az 命令行工具

是否可以在自定义容器映像上公开多个端口?

不支持公开多个端口。

可以自带存储吗?

是的,自带存储功能目前处于预览阶段。

为何无法从 SCM 站点浏览自定义容器的文件系统或正在运行的进程?

SCM 站点在单独的容器中运行。 用户无法查看应用容器的文件系统或正在运行的进程。

是否需要在自定义容器中实现 HTTPS?

不需要,平台会处理共享前端上的 HTTPS 终止。

是否需要将 WEBSITES_PORT 用于自定义容器?

是的,这是自定义容器所必需的。 若要手动配置自定义端口,请使用 Dockerfile 中的 EXPOSE 说明和应用设置 WEBSITES_PORT,其中包含要在容器上绑定的端口值。

我可以在 Docker 映像中使用 ASPNETCORE_URLS 吗?

是的,可以在 .NET 核心应用启动之前覆盖环境变量。 例如,在 init.sh 脚本中:导出 ASPNETCORE_URLS={Your value}

使用 Docker Compose 管理多容器环境

如何将 Azure 容器注册表 (ACR) 配置为用于多容器?

若要将 ACR 与多容器配合使用, 所有容器映像 都需要托管在同一 ACR 注册表服务器上。 一旦他们处于同一注册服务器上,您需要创建应用程序设置,然后更新 Docker Compose 配置文件以包含 ACR 镜像名称。

创建以下应用程序设置:

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL(完整 URL,例如: https://<server-name>.azurecr.io
  • DOCKER_REGISTRY_SERVER_PASSWORD(在 ACR 设置中启用管理员访问权限)

在配置文件内引用 ACR 映像,如下例所示:

image: <server-name>.azurecr.io/<image-name>:<tag>

怎么知道哪个容器可以访问 Internet?

  • 只能打开一个容器进行访问
  • 只能访问端口 80 和 8080(公开的端口)

以下规则用于确定哪个容器可供访问 — 按优先顺序排列:

  • 应用程序设置WEBSITES_WEB_CONTAINER_NAME已设置为容器名称
  • 第一个定义端口 80 或 8080 的容器
  • 如果以上规则均不适用,则文件中定义的第一个容器将可供访问(公开)

如何使用 depends_on?

depends_on 选项在应用服务上 不受支持 ,将被忽略。 与 Docker 中的控制启动和关闭建议一样,应用服务多容器应用应通过应用程序代码(在启动时和断开连接时)检查依赖项。 下面的示例代码演示了一个 Python 应用,用于检查 Redis 容器是否正在运行。

import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello from Azure App Service team! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

WebSocket

Linux 应用支持 WebSocket。 webSocketsEnabled ARM 设置不适用于 Linux 应用,因为 Linux 中 WebSockets 始终是启用的。

重要

现在,免费App 服务计划上的 Linux 应用支持 Web 套接字。 我们在免费应用服务计划中最多支持五个网络套接字连接。 超过此限制会导致 HTTP 429(请求过多)响应。

定价和 SLA

现在服务正式推出后,定价是多少?

定价因 SKU 和区域而异,但可以在我们的定价页面查看更多详细信息: 应用服务定价

其他问题

容器预热请求是如何工作的?

当 Azure 应用服务启动容器时,预热请求会将 HTTP 请求发送到应用程序的 /robots933456.txt 终结点。 这只是虚拟终结点,但应用程序必须通过返回任何状态代码(包括 5xx)进行回复。 如果应用程序逻辑未通过向不存在的终结点发送 HTTP 状态代码来答复,则预热请求无法接收响应。 因此,它会持续性重启容器。

若要从默认行为更改,可以自定义预热终结点路径和状态代码,这些代码将网站视为预热。 为此,请设置 WEBSITE_WARMUP_PATHWEBSITE_WARMUP_STATUSES 应用程序设置。

由于端口配置错误,预热请求也可能失败。

若要确保在 Azure 应用服务上正确配置端口,请参阅以下问题: 如何在 Linux 容器中指定端口?

是否可以增加容器预热请求超时时间?

默认情况下,预热请求在等待容器回复 240 秒后失败。 可以通过添加值介于 240 到 1800 秒之间的应用程序设置 WEBSITES_CONTAINER_START_TIME_LIMIT 来增加容器预热请求超时。

如何在 Linux 容器中指定端口?

容器类型 说明 如何设置/使用端口
内置容器 如果你为 Linux 应用选择语言/框架版本,则系统会为你选择预定义的容器。 若要将应用代码指向正确的端口,请使用 PORT 环境变量。
自定义容器 可以完全控制容器。 应用服务无法控制容器侦听的端口。 应用服务需要知道将请求转发到哪个端口。 如果您的容器侦听端口 80 或 8080,应用服务将能够自动检测它。 如果容器侦听任何其他端口,则需要将应用设置 WEBSITES_PORT 设置为端口号,应用服务将请求转发到容器中的该端口。 WEBSITES_PORT应用设置在容器中没有任何影响,不能将其作为容器中的环境变量进行访问。

是否可以将基于文件的数据库(如 SQLite)与 Linux Web 应用一起使用?

应用程序的文件系统是已装载的网络共享。 这支持横向扩展方案,即代码需要在多个主机上执行。 遗憾的是,这会阻止使用基于文件的数据库提供程序(如 SQLite),因为无法获取数据库文件上的排他锁。 建议使用托管数据库服务: Azure SQLAzure Database for MySQLAzure Database for PostgreSQL

应用程序设置名称中支持的字符有哪些?

应用程序设置只能使用字母(A-Z、a-z)、数字 (0-9) 和下划线字符 (_)。

可在何处请求新功能?

可以在 Web 应用反馈论坛上提交想法。 请将“[Linux]”添加到建议的标题中。