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

注意

本文是否有帮助? 你的输入对我们很重要。 请使用此页面上的 “反馈 ”按钮,让我们了解本文对你的影响,或者我们如何改进它。

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

如果有任何疑问,请对本文发表评论。

内置映像

我想创建平台提供的内置 Docker 容器的分支。 在哪里可以找到这些文件?

可以在 GitHub 上找到所有 Docker 文件。

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

堆栈 预期值
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 应用) 进行实时调试。 有关详细信息,请参阅 Linux 上的应用服务 中的远程调试和 SSH

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

将应用服务的 保留 字段设置为 true

持续集成和部署

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

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

是否支持过渡环境?

是。

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

是的,需要将名为 WEBSITE_WEBDEPLOY_USE_SCM 的应用设置设置为 false

使用 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 文件) ,Kudu 随后会触发 composer 安装。

自定义容器

从 ACR 拉取映像时,是否可以将托管标识与 App 服务一起使用?

是的,此功能可从 Azure CLI 使用。 可以使用 系统分配 的标识或 用户分配的 标识。 Azure 门户目前不支持此功能。

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

如果未WEBSITES_ENABLE_APP_SERVICE_STORAGE指定设置或设置为 false,则/home/目录不会在规模实例之间共享,并且写入的文件在重启后不会保留。 显式设置为 WEBSITES_ENABLE_APP_SERVICE_STORAGEtrue 将启用装载。 一旦设置为 true,如果要禁用装载,则需要显式设置为 WEBSITES_ENABLE_APP_SERVICE_STORAGEfalse

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

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

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

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

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

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

建议在 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,请使用 az 命令行工具

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

我们不支持公开多个端口。

我可以自带存储吗?

是的, 自带存储 处于预览状态。

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

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

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

否,平台在共享前端处理 HTTPS 终止。

是否需要对自定义容器使用 WEBSITES_PORT?

是的,这是自定义容器所必需的。 若要手动配置自定义端口,请使用 Dockerfile 和应用设置(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 的第一个容器
  • 如果上述两个都不是 true,则可访问文件中定义的第一个容器, (公开)

如何实现使用depends_on?

选项depends_on在 App 服务不受支持,将忽略它。 正如 Docker 提供的控制启动和关闭建议一样,App 服务多容器应用应在启动时和断开连接时通过应用程序代码检查依赖项。 下面的示例代码显示了一个 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 套接字。 ARM webSocketsEnabled 设置不适用于 Linux 应用,因为始终为 Linux 启用 Web 套接字。

重要

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

定价和 SLA

服务正式发布后,定价是什么?

定价因 SKU 和区域而异,但可以在定价页中查看更多详细信息:App 服务定价

其他问题

容器预热请求的工作原理是什么?

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

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

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

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

如何实现 Linux 容器中指定端口?

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

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

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

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

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

在哪里可以请求新功能?

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