注意
本文有帮助吗? 你的输入对我们很重要。 请使用此页上的 “反馈 ”按钮告诉我们本文为你工作得有多好,或者我们如何改进它。
随着 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 拉取映像时将托管身份与应用服务一起使用吗?
我使用的是我自己的自定义容器。 我希望平台将 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_PATH 和 WEBSITE_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 SQL、 Azure Database for MySQL 或 Azure Database for PostgreSQL
应用程序设置名称中支持的字符有哪些?
应用程序设置只能使用字母(A-Z、a-z)、数字 (0-9) 和下划线字符 (_)。
可在何处请求新功能?
可以在 Web 应用反馈论坛上提交想法。 请将“[Linux]”添加到建议的标题中。
后续步骤
- 什么是 Linux 上的 Azure 应用服务?
- 在 Azure 应用服务中设置过渡环境
- 使用用于容器的 Web 应用进行持续部署
- 你应该知道的事项:Web 应用和 Linux
- 环境变量和应用设置参考
联系我们寻求帮助
如果有疑问或需要帮助, 请创建支持请求,或询问 Azure 社区支持。 还可以将产品反馈提交到 Azure 反馈社区。