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 应用)直接从本地开发计算机连接到应用容器。 有关详细信息,请参阅远程调试和通过 SSH 登录到 Linux 上的应用服务

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

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

持续集成和持续部署

是否支持过渡环境?

是的。

是否可以使用“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.chinacloudsites.cn/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。

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

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

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

提供完整注册表 URL,包括 http://https://。 对于具有专用终结点并通过虚拟网络拉取映像的 Azure 容器注册表,请在使用管理员凭据(例如 myacr.azurecr.cn)时显式删除 http://https://

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

添加完整映像名称,包括专用注册表 URL(例如,myacr.azurecr.cn/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.cn)。 对于专用终结点和虚拟网络,在使用管理员凭据时删除 http://https://
  • DOCKER_REGISTRY_SERVER_PASSWORD(在 ACR 设置中启用管理员访问权限)

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

image: <server-name>.azurecr.cn/<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 套接字。

重要

免费应用服务计划中的 Linux 应用目前不支持 Web 套接字。 我们正在努力消除此限制,并计划在免费应用计划中最多支持 5 个 Web 套接字连接。

定价和 SLA

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

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

其他问题

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

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

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

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

可在何处请求新功能?

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