你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:在 Azure 应用服务中生成 PHP 和 MySQL 应用

Azure 应用服务使用 Linux 操作系统,提供高度可缩放的自修补 Web 托管服务。 本教程演示如何(使用 Azure Database for MySQL 灵活服务器)在连接到 MySQL 数据库的Azure 应用服务中创建安全 PHP 应用。 完成本教程后,Linux 上的 Azure 应用服务中将会运行一个 Laravel 应用。

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

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

  • 在 Azure 中创建一个默认为安全的 PHP 和 MySQL 应用程序
  • 使用应用设置将连接机密配置到 MySQL
  • 使用 GitHub Actions 部署应用程序代码
  • 更新并重新部署应用
  • 安全运行数据库迁移
  • 从 Azure 流式传输诊断日志
  • 在 Azure 门户中管理应用

如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户

示例应用程序

要继续学习本教程,请从资源库中克隆或下载示例应用程序:

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

若要在本地运行应用程序,请执行以下操作:

  • 在 .env 中,使用本地 MySQL 数据库中的设置来配置数据库设置(如 DB_DATABASEDB_USERNAMEDB_PASSWORD)。 需要本地 MySQL 服务器才能运行此示例。

  • 在存储库的根目录中,使用以下命令启动 Laravel:

    composer install
    php artisan migrate
    php artisan key:generate
    php artisan serve
    

1 - 创建应用服务和 MySQL 资源

此步骤创建 Azure 资源。 本教程中使用的步骤可创建默认为安全的应用服务和 Azure Database for MySQL 配置。 此创建过程中,你将指定:

  • Web 应用的名称。 此名称用作 Web 应用的 DNS 名称的一部分,其格式为 https://<app-name>.azurewebsites.net
  • 应用的运行时。 在此处选择要用于应用的 PHP 版本。
  • 应用的资源组。 使用资源组可将应用程序所需的所有 Azure 资源分组到一个逻辑容器中。

登录到 Azure 门户并按照以下步骤创建 Azure 应用服务资源。

说明 屏幕快照
在 Azure 门户中:
  1. 在 Azure 门户顶部的搜索栏中,输入“Web 应用数据库”。
  2. 选择“市场”标题下标记为“Web 应用 + 数据库”的项目。
还可以直接导航到创建向导
显示如何使用顶部工具栏中的搜索框查找“Web 应用 + 数据库”创建向导的屏幕截图。
在“创建 Web 应用 + 数据库”页上,按如下所述填写表单。
  1. 资源组 → 选择“新建”,并使用名称 msdocs-laravel-mysql-tutorial。

  2. 区域 → 与你靠近的任何 Azure 区域。

  3. 名称 → msdocs-laravel-mysql-XYZ,其中 XYZ 是任意三个随机字符。 该名称在 Azure 中必须唯一。

  4. 运行时堆栈 → PHP 8.0。

    默认情况下,选择 MySQL - 灵活服务器作为数据库引擎。 Azure Database for MySQL 是 Azure 上完全托管的 MySQL 数据库即服务,与最新的社区版本兼容。

  5. 请注意为你生成的数据库名称 (<app-name>-database)。 稍后需要用到此信息。

  6. 单击“查看 + 创建”。

验证完成后,单击“创建”
显示如何在“Web 应用 + 数据库”向导中配置新应用程序和数据库的屏幕截图。
需要几分钟才能完成部署并创建以下资源:
  • 资源组 → 所有已创建资源的容器。
  • 应用服务计划 → 定义应用服务的计算资源。 将创建 P1v2 层中的 Linux 计划。
  • 应用服务 → 表示应用,且在应用服务计划中运行。
  • 虚拟网络 → 与应用服务应用集成,并隔离后端网络流量。
  • Azure Database for MySQL 灵活服务器 → 只能通过虚拟网络访问。 你的数据库和用户创建于此服务器上。
  • 专用 DNS 区域 → 启用虚拟网络中 MySQL 数据库服务器的 DNS 解析。
部署完成后,单击“转到资源”按钮。 你将直接转到应用服务应用。
显示在 Azure 中创建 Web 应用要填写的表单的屏幕截图。

2 - 设置数据库连接

创建向导为你的数据库生成了一个连接字符串,但不是代码可以使用的格式。 在此步骤中,你将使用应用所需的格式创建应用设置

说明 屏幕快照
在左侧菜单的“应用服务”页面中,选择“配置”。 显示如何在“应用服务”中打开配置页面的屏幕截图。
在“配置”页的“应用程序设置”选项卡中,创建 DB_DATABASE 设置:
  1. 单击“新建应用程序设置”。

  2. 在“名称”字段中,输入 DB_DATABASE。

  3. 在“值”字段中,输入创建向导中自动生成的数据库名称,类似于 msdocs-docs-laravel-mysql-XYZ-database。

  4. 单击“确定”。

显示如何查看自动生成的连接字符串的屏幕截图。
返回“应用程序设置”选项卡:
  1. 滚动到底部并选择连接字符串 defaultConnection。 此字符串由创建向导生成,其中包含所需的用户名和密码。

  2. 在“值”字段中,选择“复制”按钮,然后将该值粘贴到文本文件中供以后使用。 其格式如下(使用换行符让其更清晰):

    Database=mysql;
    Server=<database-server-domain-name>;
    User Id=<username>;
    Password=<password>
    
  3. 选择“取消” 。

显示如何创建应用设置的屏幕截图。
按照创建应用设置的相同步骤创建以下其他应用设置。
  • DB_HOST:使用所复制连接字符串中的 database-server-domain-name<> 作为值。

  • DB_USERNAME:使用所复制连接字符串中的 username<> 作为值。

  • DB_PASSWORD:使用复制的连接字符串中的 <password> 作为值。

  • MYSQL_ATTR_SSL_CA:使用 /home/site/wwwroot/ssl/BaltimoreCyberTrustRoot.crt.pem 作为值。

    此应用设置指向访问 MySQL 服务器所需的 TLS/SSL 证书的路径。 为了方便起见,它包含在示例存储库中。

  • APP_DEBUG:使用 true 作为值。 这是 Laravel 调试变量

  • APP_KEY:使用 base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= 作为值。 这是 Laravel 加密变量

    重要

    为了方便起见,此处使用 APP_KEY 值。 对于生产方案,应在命令行中使用 php artisan key:generate --show 专门为你的部署进行生成。

显示配置页面中所有必需应用设置的屏幕截图。

3 - 部署示例代码

在此步骤中,你将使用 GitHub Actions 配置 GitHub 部署。 这只是部署到应用服务的许多方法之一,也是一种在部署过程中持续集成的好方法。 默认情况下,GitHub 存储库的每个 git push 都会启动生成和部署操作。 你将在浏览器中直接使用 Visual Studio Code 对代码库进行更改,然后让 GitHub Actions 自动部署。

说明 屏幕快照
在新浏览器中:
  1. 登录到 GitHub 帐户。

  2. 导航到 https://github.com/Azure-Samples/laravel-tasks

  3. 单击“分支”。

  4. 单击“创建分支”。

显示如何创建示例 GitHub 存储库分支的屏幕截图。
在 GitHub 页中,按 . 键在浏览器中打开 Visual Studio Code。 显示如何在 GitHub 中打开 Visual Studio Code 浏览器体验的屏幕截图。
在浏览器的 Visual Studio Code中,在资源管理器中打开 config/database.php。在 mysql 连接中,会看到已使用之前为 MySQL 连接创建的应用设置(DB_HOSTDB_DATABASEDB_USERNAMEDB_PASSWORDMYSQL_ATTR_SSL_CA)。 显示浏览器中 Visual Studio Code 和已打开文件的屏幕截图。
返回“应用服务”页,在左侧菜单中,选择“部署中心”。 显示如何在“应用服务”中打开部署中心的屏幕截图。
在“部署中心”页中:
  1. 在“源”中,选择“GitHub”。 默认情况下,选择 GitHub Actions 作为生成提供程序。

  2. 登录到 GitHub 帐户,并按照提示授权 Azure。

  3. 在“组织”中,选择你的帐户。

  4. 在“存储库”中,选择 laravel-tasks。

  5. 在“分支”中,选择“主”。

  6. 在顶部菜单中,单击“保存”。

应用服务将工作流文件提交到 .github/workflows 目录中的所选 GitHub 存储库中。
显示如何使用 GitHub Actions 配置 CI/CD 的屏幕截图。
在“部署中心”页中:
  1. 选择“日志”。 部署运行已启动。

  2. 在部署运行的日志项中,选择“生成/部署日志”。

    你已转到 GitHub 存储库,并看到 GitHub Action 正在运行。 工作流文件定义两个单独的阶段,即生成和部署阶段。

显示如何在部署中心打开部署日志的屏幕截图。
在浏览器中的 Visual Studio Code:
  1. 选择“源代码管理”扩展。

  2. 在已更改的数据库.database.php 旁边,选择 + 暂存更改。

  3. 在文本框中,键入 add certificate

  4. 选择要提交并推送到 GitHub 的复选标记。

如果返回到“部署中心”页,将看到新的日志条目,因为已启动其他运行。 等待运行任务完成。 大约需要 15 分钟。

提示

GitHub Action 由 GitHub 存储库中的文件在 .github/workflow 中定义。 可以通过自定义文件来加快速度。

显示如何在 Visual Studio Code 浏览器体验中提交更改的屏幕截图。

4 - 生成数据库架构

创建向导将 MySQL 数据库服务器置于专用终结点后面,因此只能从虚拟网络中进行访问。 由于应用服务应用已与虚拟网络集成,因此使用数据库运行数据库迁移的最简单方法是直接从应用服务容器中运行。

说明 屏幕快照
在“应用服务”页中:
  1. 从左侧菜单中选择“SSH”。

  2. 选择“转到”。

浏览器中打开与应用服务容器的 SSH 会话。 如果需要,可以直接导航到 https://<app-name>.scm.azurewebsites.net/webssh/host
显示如何从 Azure 门户打开应用的 SSH shell 的屏幕截图。
在 SSH 终端中:
  1. 持续部署到应用程序代码的根目录:

    cd /home/site/wwwroot
    
  2. 从应用程序根目录运行数据库迁移

    php artisan migrate --force
    

    注意

    只有对 /home 中文件的更改才能在应用重启之后持久保存。 不会保留 /home 外部的更改。

显示在 SSH shell 中运行的命令及其输出的屏幕截图。

5 - 更改站点根路径

Laravel 应用程序生命周期在 /public 目录中开始。 应用服务的默认 PHP 8.0 容器使用 Nginx,该服务器从应用程序的根目录中开始。 若要更改站点根路径,需要在 PHP 8.0 容器 (/etc/nginx/sites-available/default) 中更改 Nginx 配置文件。 为方便起见,示例存储库包含一个名为 default 的自定义配置文件。 如前所述,你不想使用 SSH shell 替换此文件,因为在应用重启后,更改将丢失。

说明 屏幕快照
在“应用服务”页中:
  1. 在左侧菜单中选择“配置”。

  2. 选择“常规设置”选项卡。

显示如何在“应用服务”的配置页中打开常规设置选项卡的屏幕截图。
在“常规设置”选项卡中:
  1. 在“启动命令”框中,输入以下命令:cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload。

    它将替换 PHP 8.0 容器中的 Nginx 配置文件并重启 Nginx。 此配置可确保每次启动容器时对容器进行此更改。

  2. 选择“保存”。

显示如何在“应用服务”中配置启动命令的屏幕截图。

6 - 浏览到应用

说明 屏幕快照
在“应用服务”页中:
  1. 从左侧菜单中选择“概述”。

  2. 选择应用的 URL。

    你也可以直接导航到 https://<app-name>.azurewebsites.net

显示如何从 Azure 门户中启动应用服务的屏幕截图。
向列表中添加一些任务。恭喜,你的数据驱动的 PHP 应用正在 Azure 应用服务中运行。 在应用服务中运行的 Laravel 应用的屏幕截图。

7 - 流式传输诊断日志

说明 屏幕快照
在“应用服务”页中:
  1. 从左菜单中选择“应用服务日志”。

  2. 在“应用程序日志记录”下,选择“文件系统”。

显示如何在 Azure 门户的应用服务中启用本机日志的屏幕截图。
在左侧菜单中,单击“日志流”。会看到应用的日志,包括平台日志和容器内部的日志。 显示如何在 Azure 门户中查看日志流的屏幕截图。

清理资源

完成后,可以通过删除资源组从 Azure 订阅中删除所有资源。

说明 屏幕快照
在 Azure 门户顶部的搜索栏中:
  1. 输入资源组名称。

  2. 选择前面创建的资源组。

显示如何在 Azure 门户中搜索和导航到资源组的屏幕截图。
在资源组页面上,单击“删除资源组”。 显示 Azure 门户中“删除资源组”按钮位置的屏幕截图。
  1. 输入资源组名称以确认删除。

  2. 单击 “删除”

Azure 门户中删除资源组确认对话框的屏幕截图。

常见问题

此设置花费有多大?

创建资源的定价如下所示:

  • 应用服务计划是在高级 V2 层中创建的,可以纵向扩展或缩减。 请参阅应用服务定价
  • MySQL 灵活服务器在 B1ms 层中创建,可以纵向扩展或缩减。 使用 Azure 免费帐户时,B1ms 层在 12 个月内免费,不能超过每月限制。 参阅 Azure Database for MySQL 定价
  • 除非配置额外的功能(例如对等互连),否则虚拟网络不会产生费用。 请参阅 Azure 虚拟网络定价
  • 专用 DNS 区域会产生少量费用。 请参阅 Azure DNS 定价

如何实现连接到使用其他工具在虚拟网络后面保护的 MySQL 数据库?

  • 若要从 commmand-line 工具进行基本访问,可以从应用的 SSH 终端运行 mysql
  • 若要从 MySQL Workbench 等桌面工具进行连接,计算机必须位于虚拟网络中。 例如,它可以是连接到其中一个子网的 Azure VM,也可以是与 Azure 虚拟网络建立了站点到站点 VPN 连接的本地网络中的计算机。
  • 还可以将 Azure Cloud Shell 与虚拟网络集成。

本地应用开发如何与 GitHub Actions 配合使用?

以应用服务自动生成的工作流文件为例,每个 git push 文件都会启动新的生成和部署运行。 从 GitHub 存储库的本地克隆中,将所需的更新推送到 GitHub。 例如:

git add .
git commit -m "<some-message>"
git push origin main

为什么 GitHub Actions 部署速度这么慢?

应用服务自动生成的工作流文件定义生成后部署的双作业运行。 由于每个作业都在自己的干净环境中运行,因此工作流文件可确保 deploy 作业有权从 build 作业访问文件:

两个作业过程的大部分时间都是花费在上传和下载项目上。 如果需要,可以通过将这两个作业合并为一个作业来简化工作流文件,省去了上传和下载步骤。

后续步骤

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

  • 在 Azure 中创建一个默认为安全的 PHP 和 MySQL 应用程序
  • 使用应用设置将连接机密配置到 MySQL
  • 使用 GitHub Actions 部署应用程序代码
  • 更新并重新部署应用
  • 安全运行数据库迁移
  • 从 Azure 流式传输诊断日志
  • 在 Azure 门户中管理应用

转到下一教程,了解如何向应用映射自定义 DNS 名称。

或者,查看其他资源: