在基于 Linux 上的 Azure 应用服务中生成 Ruby 和 Postgres 应用

Azure 应用服务提供高度可缩放、自修复的 Web 托管服务。 本教程介绍如何创建 Ruby 应用,并将其连接到 PostgreSQL 数据库。 完成本教程后,Linux 上的应用服务将会运行一个 Ruby on Rails 应用。

标题为“任务”的 Ruby on Rails 应用示例的屏幕截图。

在本教程中,你将了解如何执行以下操作:

  • 在 Azure 中创建 PostgreSQL 数据库
  • 将 Ruby on Rails 应用连接到 PostgreSQL
  • 将应用部署到 Azure
  • 更新数据模型并重新部署应用
  • 从 Azure 流式传输诊断日志
  • 在 Azure 门户中管理应用

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

完成本教程:

  • 如果需要,请安装 Azure CLI 来运行 CLI 参考命令。

    • 如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅登录 Azure CLI

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

准备本地 Postgres

此步骤在本地 Postgres 服务器中创建一个数据库,以便在本教程中使用。

连接到本地 Postgres 服务器

打开终端窗口,并运行 psql 以连接到本地 Postgres 服务器。

sudo -u postgres psql

如果连接成功,则表示 Postgres 数据库已在运行。 否则,应确保按照下载 - PostgreSQL Core 发行版中的步骤启用本地 Postgres 数据库。

键入 \q 退出 Postgres 客户端。

使用登录的 Linux 用户名,创建一个可以通过运行以下命令来创建数据库的 Postgres 用户。

sudo -u postgres createuser -d <signed-in-user>

在本地创建 Ruby on Rails 应用

此步骤创建一个 Ruby on Rails 示例应用程序、配置其数据库连接,并在本地运行该应用程序。

克隆示例

在终端窗口中,通过 cd 转到工作目录。

运行下列命令,克隆示例存储库。

git clone https://github.com/Azure-Samples/rubyrails-tasks.git

通过 cd 转到克隆目录。 安装所需程序包。

cd rubyrails-tasks
bundle install --path vendor/bundle

在本地运行示例

运行 Rails 迁移以创建应用程序所需的表。 若要查看迁移中创建了哪些表,请查看 Git 存储库中的 db/migrate 目录。

rake db:create
rake db:migrate

运行应用程序。

rails server

在浏览器中导航至 http://localhost:3000 。 在页面中添加一些任务。

Ruby on Rails 已成功连接到 Postgres

若要停止 Rails 服务器,请在终端中键入 Ctrl + C

在 Azure 中创建 Postgres

此步骤在 Azure Database for PostgreSQL 中创建一个 Postgres 数据库。 稍后需要将 Ruby on Rails 应用程序配置为连接到此数据库。

创建资源组

资源组是在其中部署和管理 Azure 资源(如 Web 应用、数据库和存储帐户)的逻辑容器。 例如,可以选择在使用完之后通过一个简单的步骤删除整个资源组。

在 Azure CLI 中,使用 az group create 命令创建资源组。 以下示例在“中国东部 2”位置创建名为 myResourceGroup 的资源组。 若要查看 基本 层中 Linux 上的应用服务支持的所有位置,请运行 az appservice list-locations --sku B1 --linux-workers-enabled 命令。

az group create --name myResourceGroup --location "China North"

通常在附近的区域中创建资源组和资源。

此命令完成后,JSON 输出会显示资源组属性。

在 Azure 中创建 Postgres 数据库

在本部分,你将创建 Azure Database for PostgreSQL 服务器和数据库。 若要开始,请使用以下命令安装 db-up 扩展:

az extension add --name db-up

如以下示例所示,使用 az postgres up 命令在 Azure 中创建 Postgres 数据库。 将 <postgresql-name> 替换为唯一名称(服务器终结点为“https://<postgresql-name>.postgres.database.azure.cn”) 。 对于 <admin-username> 和 <admin-password>,请指定用来为此 Postgres 服务器创建管理员用户的凭据 。

az postgres up --resource-group myResourceGroup --location chinanorth --server-name <postgresql-name> --database-name sampledb --admin-user <admin-username> --admin-password <admin-password> --ssl-enforcement Enabled

此命令可能会运行较长时间,因为它要执行以下操作:

  • 创建名为 myResourceGroup资源组(如果不存在)。 每个 Azure 资源都需要位于某个资源组中。 --resource-group 是可选项。
  • 创建带有管理用户的 Postgres 服务器。
  • 创建 sampledb 数据库。
  • 允许从本地 IP 地址进行访问。
  • 允许从 Azure 服务进行访问。
  • 创建有权访问 sampledb 数据库的数据库用户。

可以使用其他 az postgres 命令和 psql 单独执行每个步骤,但 az postgres up 可以通过一个步骤完成所有这些操作。

命令完成后,找到以 Ran Database Query: 开头的输出行。 这些行显示了系统为你创建的数据库用户(用户名为 root,密码为 Sampledb1)。 稍后你要使用这些凭据将应用连接到数据库。

提示

--location <location-name> 可以设置为任一个 Azure 区域。 可以使用 az account list-locations 命令获取可供你的订阅使用的区域。 对于生产应用,请将数据库和应用放置在同一位置。

将应用连接到 Azure Postgres

此步骤将 Ruby on Rails 应用程序连接到在 Azure Database for PostgreSQL 中创建的 Postgres 数据库。

配置数据库连接

在存储库中,打开 config/database.yml。 在该文件的底部,将生产变量替换为以下代码。

production:
  <<: *default
  host: <%= ENV['DB_HOST'] %>
  database: <%= ENV['DB_DATABASE'] %>
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>

保存更改。

在本地测试应用程序

回到本地终端,设置以下环境变量:

export DB_HOST=<postgres-server-name>.postgres.database.azure.cn
export DB_DATABASE=sampledb 
export DB_USERNAME=root@<postgres-server-name>
export DB_PASSWORD=Sampledb1

使用刚刚配置的生产值运行 Rails 数据库迁移,在 Azure Database for PostgreSQL 中的 Postgres 数据库内创建表。

rake db:migrate RAILS_ENV=production

在生产环境中运行时,Rails 应用程序需要预编译的资产。 使用以下命令生成所需的资产:

rake assets:precompile

Rails 生产环境还使用机密来管理安全性。 生成机密密钥

rails secret

将机密密钥保存到 Rails 生产环境使用的相应变量。 为方便起见,可对两个变量使用相同的密钥。

export RAILS_MASTER_KEY=<output-of-rails-secret>
export SECRET_KEY_BASE=<output-of-rails-secret>

启用 Rails 生产环境,以提供 JavaScript 和 CSS 文件。

export RAILS_SERVE_STATIC_FILES=true

在生产环境中运行示例应用程序。

rails server -e production

导航到 http://localhost:3000。 如果页面可加载且未出错,则表示 Ruby on Rails 应用程序正在连接到 Azure 中的 Postgres 数据库。

在页面中添加一些任务。

Ruby on Rails 已成功连接到 Azure Database for PostgreSQL

若要停止 Rails 服务器,请在终端中键入 Ctrl + C

提交更改

运行以下的 Git 命令,提交更改:

git add .
git commit -m "database.yml updates"

应用已可用于部署。

“部署到 Azure”

此步骤将已连接 Postgres 的 Rails 应用程序部署到 Azure 应用服务。

配置部署用户

可以使用“部署用户” 将 FTP 和本地 Git 部署到 Azure Web 应用。 配置部署用户之后,可对所有 Azure 部署使用此用户。 帐户级部署用户名和密码不同于 Azure 订阅凭据。

若要配置部署用户,请在 Azure Cloud Shell 中运行 az webapp deployment user set 命令。 将 <username> 和 <password> 替换为部署用户名和密码。

  • 用户名必须在 Azure 中唯一,并且对于本地 Git 推送,不能包含“@”符号。
  • 密码必须至少为 8 个字符,且具有字母、数字和符号这三种元素中的两种。
az webapp deployment user set --user-name <username> --password <password>

JSON 输出会将该密码显示为 null。 如果收到 'Conflict'. Details: 409 错误,请更改用户名。 如果收到 'Bad Request'. Details: 400 错误,请使用更强的密码。

请记录你要用于部署 Web 应用的用户名和密码。

创建应用服务计划

在 Azure CLI 中,使用 az appservice plan create 命令创建一个应用服务计划。

以下示例在免费定价层中创建名为 myAppServicePlan 的应用服务计划:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

创建应用服务计划后,Azure CLI 会显示类似于以下示例的信息:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "China North",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "China North",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

创建 Web 应用

myAppServicePlan 应用服务计划中创建一个 Web 应用

在 Azure CLI 中,可以使用 az webapp create 命令。 在以下示例中,将 <app-name> 替换为全局唯一的应用名称(有效字符是 a-z0-9-)。 运行时设置为 RUBY|2.6.2。 若要查看所有受支持的运行时,请运行 az webapp list-runtimes --linux

# Bash
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "RUBY|2.6.2" --deployment-local-git
# PowerShell
az --% webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "RUBY|2.6.2" --deployment-local-git

创建 Web 应用后,Azure CLI 会显示类似于以下示例的输出:

Local git is configured with url of 'https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.chinacloudsites.cn",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

现在你已经创建了一个新的空 Web 应用并启用了 Git 部署。

备注

Git 远程的 URL 将显示在 deploymentLocalGitUrl 属性中,其格式为 https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git。 保存此 URL,后续将会用到。

配置数据库设置

在应用服务中,使用 Azure CLI 中的 az webapp config appsettings set 命令将环境变量设置为应用设置。

以下 Azure CLI 命令用于配置应用设置 DB_HOSTDB_DATABASEDB_USERNAMEDB_PASSWORD。 替换占位符 <appname><postgres-server-name>

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DB_HOST="<postgres-server-name>.postgres.database.azure.cn" DB_DATABASE="sampledb" DB_USERNAME="root@<postgres-server-name>" DB_PASSWORD="Sampledb1"

配置 Rails 环境变量

在本地终端中,为 Azure 中的 Rails 生产环境生成新的机密

rails secret

配置 Rails 生产环境所需的变量。

在以下 Azure CLI 命令中,将两个 <output-of-rails-secret> 占位符替换在本地终端中生成的新机密密钥。

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings RAILS_MASTER_KEY="<output-of-rails-secret>" SECRET_KEY_BASE="<output-of-rails-secret>" RAILS_SERVE_STATIC_FILES="true" ASSETS_PRECOMPILE="true"

ASSETS_PRECOMPILE="true" 告知默认 Ruby 容器要在每次进行 Git 部署时预编译资产。 有关详细信息,请参阅预编译资产提供静态资产

从 Git 推送到 Azure

在本地终端中,将 Azure 远程功能添加到本地 Git 存储库。

git remote add azure <paste-copied-url-here>

推送到 Azure 远程功能以部署 Ruby on Rails 应用程序。 系统会提示输入前面在创建部署用户期间提供的密码。

git push azure main

在部署期间,Azure 应用服务会向 Git 告知其进度。

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'a5e076db9c'.
remote: Running custom deployment command...
remote: Running deployment command...
...
< Output has been truncated for readability >

转到 Azure 应用

浏览到 http://<app-name>.chinacloudsites.cn 并在列表中添加一些任务。

标题为“任务”的 Azure 应用示例的屏幕截图,显示了添加到列表的任务。

恭喜,你已在 Azure 应用服务中运行了一个数据驱动的 Ruby 应用。

在本地更新模型和重新部署

在此步骤中,对 task 数据模型和 webapp 进行简单更改,然后将更新发布到 Azure。

对于任务方案,需要修改应用程序,以便能够将任务标记为已完成。

添加列

在终端中,导航到 Git 存储库中的根路径。

生成新的迁移,用于将名为 Done 的布尔列添加到 Tasks 表:

rails generate migration AddDoneToTasks Done:boolean

此命令在 db/migrate 目录中生成新的迁移文件。

在终端中运行 Rails 数据库迁移,以便在本地数据库中进行更改。

rake db:migrate

更新应用程序逻辑

打开 app/controllers/tasks_controller.rb 文件。 在该文件的末尾找到以下行:

params.require(:task).permit(:Description)

修改此行,以包含新的 Done 参数。

params.require(:task).permit(:Description, :Done)

更新视图

打开 app/views/tasks/_form.html.erb 文件,即“编辑”窗体。

找到 <%=f.error_span(:Description) %> 行,并紧接在其下方插入以下代码:

<%= f.label :Done, :class => 'control-label col-lg-2' %>
<div class="col-lg-10">
  <%= f.check_box :Done, :class => 'form-control' %>
</div>

打开 app/views/tasks/show.html.erb 文件,即单记录“视图”页。

找到 <dd><%= @task.Description %></dd> 行,并紧接在其下方插入以下代码:

  <dt><strong><%= model_class.human_attribute_name(:Done) %>:</strong></dt>
  <dd><%= check_box "task", "Done", {:checked => @task.Done, :disabled => true}%></dd>

打开 app/views/tasks/index.html.erb 文件,即所有记录的“索引”页。

找到 <th><%= model_class.human_attribute_name(:Description) %></th> 行,并紧接在其下方插入以下代码:

<th><%= model_class.human_attribute_name(:Done) %></th>

在同一文件中找到 <td><%= task.Description %></td> 行,并紧接在其下方插入以下代码:

<td><%= check_box "task", "Done", {:checked => task.Done, :disabled => true} %></td>

在本地测试更改

在本地终端中运行 Rails 服务器。

rails server

若要查看任务状态的变化,请导航到 http://localhost:3000 并添加或编辑项。

将复选框添加到任务

若要停止 Rails 服务器,请在终端中键入 Ctrl + C

发布对 Azure 所做的更改

在终端中,针对生产环境运行 Rails 数据库迁移,在 Azure 数据库中进行更改。

rake db:migrate RAILS_ENV=production

提交在 Git 中进行的所有更改,然后将代码更改推送到 Azure。

git add .
git commit -m "added complete checkbox"
git push azure main

git push 完成后,请导航至 Azure 应用,测试新功能。

发布到 Azure 的模型和数据库更改

如果添加任何任务,则它们保留在数据库中。 更新数据架构不会改变现有数据。

流式传输诊断日志

若要访问应用服务中的应用程序代码内生成的控制台日志,请在 Azure CLI 中运行以下命令以打开诊断日志记录:

az webapp log config --resource-group <resource-group-name> --name <app-name> --application-logging true --level Verbose

--level 的可能值为:ErrorWarningInfoVerbose。 每个后续级别包括上一个级别。 例如:Error 仅包含错误消息,Verbose 则包含所有消息。

启用诊断日志记录功能以后,请运行以下命令来查看日志流:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

如果没有立即看到控制台日志,请在 30 秒后重新查看。

备注

也可通过浏览器在 https://<app-name>.scm.chinacloudsites.cn/api/logs/docker 中检查日志文件。

若要随时停止日志流式处理,请键入 Ctrl+C

管理 Azure 应用

转到 Azure 门户管理已创建的应用。

在左侧菜单中单击 应用程序服务,然后单击 Azure 应用的名称。

在门户中导航到 Azure 应用

这里我们可以看到应用的“概述”页。 在此处可以执行基本的管理任务,例如停止、启动、重启、浏览和删除。

左侧菜单提供用于配置应用的页面。

Azure 门户中的“应用服务”页

清理资源

若要删除通过此快速入门创建的所有资源,请运行以下命令:

az group delete --name myResourceGroup

后续步骤

在本教程中,你了解了如何执行以下操作:

  • 在 Azure 中创建一个 Postgres 数据库
  • 将 Ruby on Rails 应用连接到 Postgres
  • 将应用部署到 Azure
  • 更新数据模型并重新部署应用
  • 从 Azure 流式传输诊断日志
  • 在 Azure 门户中管理应用

继续学习下一篇教程,了解如何将自定义 DNS 名称映射到应用。

或者,查看其他资源: