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 要用于初始化你的应用的 Ruby 脚本

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

管理

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

此操作等同于 Docker 重启。

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

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

注意

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

如何通过 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 安装。

自定义容器

从 ACR 拉取映像时,能否将托管标识与应用服务一起使用?

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

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

如果 WEBSITES_ENABLE_APP_SERVICE_STORAGE 设置未指定,或者设为 false,则 目录不会在缩放实例之间共享,且写入的文件在重启后不会保留。 将 WEBSITES_ENABLE_APP_SERVICE_STORAGE 显式设置为 true 会启用装载。 将此值设置为 true 后,如果想要禁用装载,则需要将 WEBSITES_ENABLE_APP_SERVICE_STORAGE 显式设置为 false。

我的容器无法以“设备上剩余的空间”开头。 此错误的含义是什么?

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

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

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

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

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

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

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

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

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

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

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

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

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

不支持公开多个端口。

可以自带存储吗?

可以,自带存储以预览版形式提供。

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

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

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

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

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

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

在 Docker 映像中使用 ASPNETCORE_URLS?

是,可以在 .NET core 应用启动之前覆盖环境变量。 例如,在 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)

Web 套接字

Linux 应用支持 Web 套接字。 webSocketsEnabled ARM 设置不适用于 Linux 应用,因为始终为 Linux 启用 Web 套接字。

重要

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

定价和 SLA

服务正式版的定价是多少?

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

其他问题

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

当 Azure 应用服务启动容器时,预热请求会向应用程序的 /robots933456.txt 终结点发送 HTTP 请求。 这只是一个虚拟终结点,但你的应用程序需要使用任何非 5XX 状态代码进行回复。 如果你的应用程序逻辑没有向不存在的终结点回复任何 HTTP 状态代码,则预热请求将无法接收响应,并且它会永久重新启动你的容器。 预热请求还可能会由于端口配置错误而失败。

若要确保在 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]”添加到建议的标题中。