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

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

Screenshot of a Ruby on Rails app example titled Tasks.

本教程介绍如何执行下列操作:

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

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

先决条件

为完成此教程:

可以使用本地 Azure CLI。

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

  • 本地 Azure CLI,请了解如何安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

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

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

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

准备本地 Postgres

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

连接到本地 Postgres 服务器

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

    sudo -u postgres psql
    

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

  2. 键入 \q 退出 Postgres 客户端。

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

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

在本地创建 Ruby on Rails 应用

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

克隆示例

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

  2. 克隆示例存储库并更改为存储库根路径。

    git clone https://github.com/Azure-Samples/rubyrails-tasks.git
    cd rubyrails-tasks
    
  3. 确保默认分支为 main

    git branch -m main
    

    提示

    应用服务不需要更改分支名称。 但是,由于许多存储库将其默认分支更改为 main,因此本教程还介绍如何从 main 部署存储库。 有关详细信息,请参阅更改部署分支

  4. 安装所需程序包。

    bundle install --path vendor/bundle
    

在本地运行示例

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

    rake db:create
    rake db:migrate
    
  2. 运行应用程序。

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

    Ruby on Rails connects successfully to Postgres

  4. 若要停止 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 数据库

  1. 使用以下命令安装 db-up 扩展:

    az extension add --name db-up
    
  2. 如以下示例所示,使用 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'] %>

保存更改。

在本地测试应用程序

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

    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
    
  2. 使用刚刚配置的生产值运行 Rails 数据库迁移,在 Azure Database for PostgreSQL 中的 Postgres 数据库内创建表。

    rake db:migrate RAILS_ENV=production
    
  3. 在生产环境中运行时,Rails 应用程序需要预编译的资产。 使用以下命令生成所需的资产:

    rake assets:precompile
    
  4. Rails 生产环境还使用机密来管理安全性。 生成机密密钥

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

    export RAILS_MASTER_KEY=<output-of-rails-secret>
    export SECRET_KEY_BASE=<output-of-rails-secret>
    
  6. 启用 Rails 生产环境,以提供 JavaScript 和 CSS 文件。

    export RAILS_SERVE_STATIC_FILES=true
    
  7. 在生产环境中运行示例应用程序。

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

  9. 在页面中添加一些任务。

    Ruby on Rails connects successfully to Azure Database for PostgreSQL

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

提交更改

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

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

应用已可用于部署。

“部署到 Azure”

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

配置部署用户

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

若要配置部署用户,请在 Azure CLI 中运行 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

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime 'RUBY:2.6' --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 环境变量

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

    rails secret
    
  2. 在以下 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

  1. 由于要部署 main 分支,因此需要将应用服务应用的默认部署分支设置为 main(请参阅main)。 在本地 Shell 中,使用 az webapp config appsettings set 命令设置 DEPLOYMENT_BRANCH 应用设置。

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
    
  2. 在本地终端中,将 Azure 远程功能添加到本地 Git 存储库。

    git remote add azure <paste-copied-url-here>
    
  3. 推送到 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 并在列表中添加一些任务。

Screenshot of the Azure app example titled Tasks showing tasks added to the list.

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

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

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

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

添加列

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

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

    rails generate migration AddDoneToTasks Done:boolean
    

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

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

    rake db:migrate
    

更新应用程序逻辑

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

    params.require(:task).permit(:Description)
    
  2. 修改此行,以包含新的 Done 参数。

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

更新视图

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

  2. 找到 <%=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>
    
  3. 打开 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>
    
  4. 在同一文件中找到 <td><%= task.Description %></td> 行,并紧接在其下方插入以下代码:

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

在本地测试更改

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

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

    Added check box to task

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

发布对 Azure 所做的更改

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

    rake db:migrate RAILS_ENV=production
    
  2. 提交在 Git 中进行的所有更改,然后将代码更改推送到 Azure。

    git add .
    git commit -m "added complete checkbox"
    git push azure main
    
  3. git push 完成后,请导航至 Azure 应用,测试新功能。

    Model and database changes published to Azure

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

流式传输诊断日志

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

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --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 应用

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

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

    Portal navigation to Azure app

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

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

    App Service page in Azure portal

清理资源

在前面的步骤中,你在资源组中创建了 Azure 资源。 如果认为将来不需要这些资源,请在本地 Azure CLI 中运行以下命令删除资源组:

az group delete --name myResourceGroup

此命令可能需要花费一点时间运行。

后续步骤

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

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

请继续学习下一教程,了解如何使用自定义域和证书保护应用。

或者,查看其他资源: