本文介绍 Azure 应用服务如何在 Linux 容器中运行 Ruby 应用,以及如何按需自定义应用服务的行为。 Ruby 应用必须与所有必需的 gem 一起部署。
对于在应用服务中使用内置 Linux 容器的 Ruby 开发人员,本指南为其提供了关键概念和说明。 若从未使用过 Azure 应用服务,则首先应按照 Ruby 快速入门以及将 Ruby 与 PostgreSQL 配合使用教程进行操作。
显示 Ruby 版本
若要显示当前的 Ruby 版本,请在 Azure CLI 中运行以下命令:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion
若要显示所有受支持的 Ruby 版本,请在 Azure CLI 中运行以下命令:
az webapp list-runtimes --os linux | grep RUBY
设置 Ruby 版本
在 Azure CLI 中运行以下命令,将 Ruby 版本设置为 2.7:
az webapp config set --resource-group <resource-group-name> --name <app-name> --linux-fx-version "RUBY:2.7"
注意
如果在部署期间看到与以下类似的错误:
Your Ruby version is 2.7.3, but your Gemfile specified 2.3.1
或
rbenv: version `2.3.1' is not installed
这意味着项目中配置的 Ruby 版本与正在运行的容器中安装的版本不同(在上面的示例中为 2.7.3)。 在上面的示例中,检查 Gemfile 和 .ruby-version 并验证是否未设置 Ruby 版本,或者是否设置为正在运行的容器中安装的版本(在上面的示例中为 ) 。
访问环境变量
在应用服务中,可以在应用代码外部设置应用设置。 然后,可以使用标准的 ENV['<path-name>'] 模式访问这些设置。 例如,若要访问名为 WEBSITE_SITE_NAME 的应用设置,请使用以下代码:
ENV['WEBSITE_SITE_NAME']
自定义部署
部署 Git 存储库或者部署启用了生成自动化的 Zip 包时,部署引擎 (Kudu) 会默认运行以下后期部署步骤:
- 检查 Gemfile 是否存在。
- 运行
bundle clean。 - 运行
bundle install --path "vendor/bundle"。 - 运行
bundle package,将 gems 打包到 vendor/cache 文件夹中。
使用 --without 标志
要使用 bundle install 标志运行 ,请将 BUNDLE_WITHOUT应用设置设置为以逗号分隔的组列表。 例如,使用以下命令将其设置为 development,test。
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings BUNDLE_WITHOUT="development,test"
如果定义了此设置,那么部署引擎将使用 bundle install 运行 --without $BUNDLE_WITHOUT。
预编译资产
默认情况下,后期部署步骤不会预编译资产。 要启用资产预编译,请将 ASSETS_PRECOMPILE应用设置设为 true。 然后在后期部署步骤结束时运行命令 bundle exec rake --trace assets:precompile。 例如:
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings ASSETS_PRECOMPILE=true
有关详细信息,请参阅提供静态资产。
自定义启动
默认情况下,Ruby 容器按以下顺序启动 Rails 服务器(有关详细信息,请参阅启动脚本):
- 生成 secret_key_base 值(如果尚不存在)。 应用在生产模式下运行时需要此值。
- 将
RAILS_ENV环境变量设置为production。 - 在 tmp / pids 目录中,删除先前运行 Rails 服务器留下的任何 .pid 文件 。
- 检查是否安装了所有依赖项。 如果没有,请尝试从本地 vendor/cache 目录安装 gems。
- 运行
rails server -e $RAILS_ENV。
可按以下方式自定义启动进程:
提供静态资产
默认情况下,Ruby 容器中的 Rails 服务器在生产模式下运行,假定资产已进行预编译并由 Web 服务器提供。 要从 Rails 服务器提供静态资产,需完成两个操作:
预编译资产 - 在本地预编译静态资产并手动部署它们。 或者,让部署引擎替你处理(请参阅预编译资产)。
启用提供静态文件 - 若要从 Ruby 容器提供静态资产,请将
RAILS_SERVE_STATIC_FILES应用设置设置为true。 例如:az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings RAILS_SERVE_STATIC_FILES=true
在非生产模式下运行
默认情况下,Rails 服务器在生产模式下运行。 例如,要在开发模式下运行,请将 RAILS_ENV应用设置设为 development。
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings RAILS_ENV="development"
但是,仅此设置会导致 Rails 服务器在开发模式下启动,该模式仅接受 localhost 请求,并且在容器外部无法访问。 要接受远程客户端请求,请将 APP_COMMAND_LINE应用设置设为 rails server -b 0.0.0.0。 此应用设置使你可在 Ruby 容器中运行自定义命令。 例如:
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings APP_COMMAND_LINE="rails server -b 0.0.0.0"
手动设置 secret_key_base
要使用自己的 secret_key_base 值而不是让应用服务生成一个值,请使用所需的值设置 SECRET_KEY_BASE应用设置。 例如:
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings SECRET_KEY_BASE="<key-base-value>"
访问诊断日志
若要访问应用服务中应用程序代码内部生成的控制台日志,请在 Cloud Shell 中运行以下命令来启用诊断日志记录:
az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose
可能的值为 --levelError、 Warning、 Info和 Verbose。 每个后续级别包括上一个级别。 例如, Error 仅包含错误消息。
Verbose 包括所有消息。
启用诊断日志记录后,运行以下命令以查看日志流:
az webapp log tail --resource-group <resource-group-name> --name <app-name>
如果未立即显示控制台日志,请在 30 秒内再次检查。
若要随时停止日志流式处理,请选择 Ctrl+C。
在浏览器中打开 SSH 会话
若要通过容器打开直接的 SSH 会话,应用应该处于正在运行状态。
使用 az webapp ssh 命令。
如果尚未进行身份验证,则需通过要连接的 Azure 订阅进行身份验证。 完成身份验证以后,可以看到一个浏览器内 shell,可以在其中的容器中运行命令。
注意
在目录外部 /home 所做的任何更改都存储在容器本身中,并且不会在应用重启之后保留。
若要从本地计算机打开远程 SSH 会话,请参阅从远程 shell 打开 SSH 会话。
忽略日志中的 robots933456 消息
容器日志中可能会显示以下消息:
2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"
可以放心忽略此消息。
/robots933456.txt 是虚拟 URL 路径。 应用服务使用它来检查容器是否能够处理请求。 “404”错误响应指示路径不存在,它向应用服务发出信号,指出容器正常且已准备好响应请求。