Compartir a través de

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 核心 编译后的 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 应用服务计划?

将该应用服务的“保留”字段设置为“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,请确保在运行上一个命令apt-get install curl之前,使用 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,则该目录不会在不同缩放实例间共享,并且写入的文件在重启时不会持久保存。 显式地将 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 容器注册表,在使用管理员凭据时,请显式删除 http://https://(例如,myacr.azurecr.cn)。

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

添加完整的映像名称,包括专用注册表 URL(例如,myacr.azurecr.cn/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.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)

WebSocket

Linux 应用支持 WebSocket。

重要

免费应用服务计划上的 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]”添加到建议的标题中。