教程:将 PHP、MySQL 和 Redis 应用部署到 Azure 应用服务

本教程演示如何(使用 Azure Database for MySQL 灵活服务器)在连接到 MySQL 数据库的Azure 应用服务中创建安全 PHP 应用。 你还将部署 Azure Cache for Redis 以在应用程序中启用缓存代码。 Azure 应用服务是一种可缩放程度高、支持自修补的 Web 托管服务,可轻松地在 Windows 或 Linux 上部署应用。 完成本教程后,Linux 上的 Azure 应用服务中将会运行一个 Laravel 应用。

Screenshot of the Azure app example titled Task List showing new tasks added.

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

示例应用程序

要继续学习本教程,请从存储库克隆或下载示例 Laravel 应用程序:

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>.chinacloudsites.cn
  • 应用的运行时。 在此处选择要用于应用的 PHP 版本。
  • 应用的资源组。 使用资源组可将应用程序所需的所有 Azure 资源分组到一个逻辑容器中。

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

步骤 1:在 Azure 门户中:

  1. 在 Azure 门户顶部的搜索栏中,输入“Web 应用数据库”。
  2. 选择“市场”标题下标记为“Web 应用 + 数据库”的项目。 还可以直接导航到创建向导

A screenshot showing how to use the search box in the top tool bar to find the Web App + Database creation wizard.

步骤 2:在“创建 Web 应用 + 数据库”页上,按下面所述填写表单。

  1. 资源组 → 选择“新建”,并使用名称 msdocs-laravel-mysql-tutorial。
  2. 区域 → 与你靠近的任何 Azure 区域。
  3. 名称 → msdocs-laravel-mysql-XYZ,其中 XYZ 是任意三个随机字符。 该名称在 Azure 中必须唯一。
  4. 运行时堆栈 → PHP 8.2。
  5. 添加 Azure Cache for Redis? → 是。
  6. 托管计划 → 基本。 准备就绪后,可以稍后纵向扩展到生产定价层。
  7. 默认情况下,选择 MySQL - 灵活服务器作为数据库引擎。 Azure Database for MySQL 是 Azure 上完全托管的 MySQL 数据库即服务,与最新的社区版本兼容。
  8. 选择“查看 + 创建”。
  9. 验证完成后,选择“创建”。

A screenshot showing how to configure a new app and database in the Web App + Database wizard.

步骤 3:该部署需要数分钟才能完成。 部署完成后,选择“转到资源”按钮。 这将直接转到应用服务应用,但会创建以下资源:

  • 资源组 → 所有已创建资源的容器。
  • 应用服务计划 → 定义应用服务的计算资源。 将创建基本层中的 Linux 计划。
  • 应用服务 → 表示应用,且在应用服务计划中运行。
  • 虚拟网络 → 与应用服务应用集成,并隔离后端网络流量。
  • 专用终结点 → 虚拟网络中数据库服务器和 Redis 缓存的访问终结点。
  • 网络接口 → 表示专用 IP 地址,每个专用终结点各一个。
  • Azure Database for MySQL 灵活服务器 → 只能从专用终结点后面访问。 你的数据库和用户创建于此服务器上。
  • Azure Cache for Redis → 只能从专用终结点后面访问。
  • 专用 DNS 区域 → 在虚拟网络中启用数据库服务器和 Redis 缓存的 DNS 解析。

A screenshot showing the deployment process completed.

2 - 设置数据库连接

步骤 1:在左侧菜单的“应用服务”页面中,选择“配置”。

A screenshot showing how to open the configuration page in App Service.

步骤 2

  1. 查找以 AZURE_MYSQL_ 开头的应用设置。 它们是由创建向导根据新的 MySQL 数据库生成的。
  2. 此外,查找以 AZURE_REDIS_ 开头的应用设置。 它们是由创建向导根据新的 Redis 缓存生成的。 若要设置应用程序,有这个名称就够了。
  3. 如果需要,可选择每个设置右侧的“编辑”按钮,然后查看或复制其值。 稍后,你将更改应用程序代码以使用这些设置。

A screenshot showing how to create an app setting.

步骤 3:在“配置”页的“应用程序设置”选项卡中,创建 CACHE_DRIVER 设置:

  1. 选择“新应用程序设置”。
  2. 在“名称”字段中,输入“CACHE_DRIVER”。
  3. 在“值”字段中,输入 redis。
  4. 选择“确定”。 CACHE_DRIVER 已在 Laravel 应用程序代码中使用。 此设置告知 Laravel 使用 Redis 作为其缓存。

A screenshot showing how to see the autogenerated connection string.

步骤 4:使用步骤 3 中的相同步骤,创建以下应用设置:

  • MYSQL_ATTR_SSL_CA:使用 /home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem 作为值。 此应用设置指向访问 MySQL 服务器所需的 TLS/SSL 证书的路径。 为了方便起见,它包含在示例存储库中。
  • LOG_CHANNEL:使用 stderr 作为值。 此设置告知 Laravel 通过管道将日志传递给 stderr,这使它可用于应用服务日志。
  • APP_DEBUG:使用 true 作为值。 它是一个 Laravel 调试变量,用于启用调试模式页面。
  • APP_KEY:使用 base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= 作为值。 它是一个 Laravel 加密变量
  1. 在顶部的菜单栏中,选择“保存”。
  2. 出现提示时,选择“继续”

A screenshot showing how to save settings in the configuration page.

重要

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

3 - 部署示例代码

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

步骤 1:在新浏览器窗口中:

  1. 登录到 GitHub 帐户。
  2. 导航到 https://github.com/Azure-Samples/laravel-tasks
  3. 选择“Fork”。
  4. 选择“创建分支”。

A screenshot showing how to create a fork of the sample GitHub repository.

步骤 2:在 GitHub 页中,按 . 键在浏览器中打开 Visual Studio Code。

A screenshot showing how to open the Visual Studio Code browser experience in GitHub.

步骤 3:在浏览器中的 Visual Studio Code 中,在资源管理器中打开 config/database.php。 找到 mysql 部分并进行如下更改:

  1. DB_HOST 替换为 AZURE_MYSQL_HOST
  2. DB_DATABASE 替换为 AZURE_MYSQL_DBNAME
  3. DB_USERNAME 替换为 AZURE_MYSQL_USERNAME
  4. DB_PASSWORD 替换为 AZURE_MYSQL_PASSWORD
  5. DB_PORT 替换为 AZURE_MYSQL_PORT。 请记住,这些 AZURE_MYSQL_ 设置是由创建向导为你创建的。

A screenshot showing Visual Studio Code in the browser and an opened file with modified MySQL variables.

步骤 4:在 config/database.php 中,滚动到 Redis cache 部分并进行以下更改:

  1. REDIS_HOST 替换为 AZURE_REDIS_HOST
  2. REDIS_PASSWORD 替换为 AZURE_REDIS_PASSWORD
  3. REDIS_PORT 替换为 AZURE_REDIS_PORT
  4. REDIS_CACHE_DB 替换为 AZURE_REDIS_DATABASE
  5. 在同一部分中,使用 'scheme' => 'tls', 添加一行。 此配置告知 Laravel 使用加密连接到 Redis。 请记住,这些 AZURE_REDIS_ 设置是由创建向导为你创建的。

A screenshot showing Visual Studio Code in the browser and an opened file with modified Redis variables.

步骤 5

  1. 选择“源代码管理”扩展。
  2. 在文本框中,键入类似 Configure DB & Redis variables 的提交消息。
  3. 选择“提交和推送”。

A screenshot showing the changes being committed and pushed to GitHub.

步骤 6:返回“应用服务”页,在左侧菜单中,选择“部署中心”。

A screenshot showing how to open the deployment center in App Service.

步骤 7:在“部署中心”页中:

  1. 在“源”中,选择“GitHub”。 默认情况下,选择 GitHub Actions 作为生成提供程序。
  2. 登录到 GitHub 帐户,并按照提示授权 Azure。
  3. 在“组织”中,选择你的帐户。
  4. 在“存储库”中,选择“laravel-task”。
  5. 在“分支”中,选择“主”。
  6. 在顶部菜单中,选择“保存”。 应用服务会将工作流文件提交到所选 GitHub 存储库中(在 .github/workflows 目录中)。

A screenshot showing how to configure CI/CD using GitHub Actions.

步骤 8:在“部署中心”页中:

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

A screenshot showing how to open deployment logs in the deployment center.

步骤 9:你已转到 GitHub 存储库,并看到 GitHub Action 正在运行。 工作流文件定义两个单独的阶段,即生成和部署阶段。 等待 GitHub 运行以显示“完成”状态。 大约需要 15 分钟。

A screenshot showing a GitHub run in progress.

4 - 生成数据库架构

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

步骤 1:返回“应用服务”页,在左侧菜单中,选择“SSH”。

A screenshot showing how to open the SSH shell for your app from the Azure portal.

步骤 2:在 SSH 终端中:

  1. 运行 cd /home/site/wwwroot。 下面是所有已部署的文件。
  2. 运行 php artisan migrate --force。 如果该命令成功,则应用服务会成功连接到 MySQL 数据库。 只有对 /home 中文件的更改才能在应用重启之后持久保存。 不会保留 /home 外部的更改。

A screenshot showing the commands to run in the SSH shell and their output.

5 - 更改站点根路径

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

步骤 1

  1. 在左侧菜单中选择“配置”。
  2. 选择“常规设置”选项卡。

A screenshot showing how to open the general settings tab in the configuration page of App Service.

步骤 2:在“常规设置”选项卡中:

  1. 在“启动命令”框中,输入以下命令:cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload。
  2. 选择“保存”。 该命令会替换 PHP 容器中的 Nginx 配置文件并重启 Nginx。 此配置可确保每次启动容器时都会对容器进行相同的更改。

A screenshot showing how to configure a startup command in App Service.

6 - 浏览到应用

步骤 1:在“应用服务”页中:

  1. 从左侧菜单中选择“概述”。
  2. 选择应用的 URL。 你也可以直接导航到 https://<app-name>.chinacloudsites.cn

A screenshot showing how to launch an App Service from the Azure portal.

步骤 2:将一些任务添加到列表。 恭喜,你的数据驱动的安全 PHP 应用正在 Azure 应用服务中运行。

A screenshot of the Laravel app running in App Service.

提示

示例应用程序实现缓存端模式。 当你在进行数据更改后重新加载页面时,网页中显示的“响应时间”会快得多,因为它是从缓存而不是从数据库加载数据。

7 - 流式传输诊断日志

Azure 应用服务捕获已记录到控制台的所有消息,以帮助你诊断应用程序的问题。 示例应用在其每个终结点中输出控制台日志消息,以演示此功能。 默认情况下,Laravel 的日志记录功能(例如 Log::info())会输出到本地文件。 之前的 LOG_CHANNEL 应用设置使日志条目可从应用服务日志流访问。

步骤 1:在“应用服务”页中:

  1. 从左菜单中选择“应用服务日志”。
  2. 在“应用程序日志记录”下,选择“文件系统”。

A screenshot showing how to enable native logs in App Service in the Azure portal.

步骤 2:在左侧菜单中,选择“日志流”。 将显示应用的日志,包括平台日志和容器内部的日志。

A screenshot showing how to view the log stream in the Azure portal.

清理资源

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

步骤 1:在 Azure 门户顶部的搜索栏中:

  1. 输入资源组名称。
  2. 选择前面创建的资源组。

A screenshot showing how to search for and navigate to a resource group in the Azure portal.

步骤 2:在资源组页上,选择“删除资源组”。

A screenshot showing the location of the Delete Resource Group button in the Azure portal.

步骤 3

  1. 输入资源组名称以确认删除。
  2. 选择“删除”。

A screenshot of the confirmation dialog for deleting a resource group in the Azure portal.

常见问题

此设置花费有多大?

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

  • 应用服务计划在基本层中创建,可以进行纵向扩展或缩减。 请参阅应用服务定价
  • MySQL 灵活服务器是在 B1ms 层中创建的,可以纵向扩展或缩减。 使用 Azure 试用版时,B1ms 层免费 12 个月,最高可达每月限额。 参阅 Azure Database for MySQL 定价
  • Azure Cache for Redis 是在缓存大小最小的基本层中创建的。 此层的相关成本很低。 你可将其纵向扩展到更高的性能层,以实现更高的可用性、聚类分析和其他功能。 请查阅 Azure Cache for Redis 定价
  • 除非配置额外的功能(例如对等互连),否则虚拟网络不会产生费用。 请参阅 Azure 虚拟网络定价
  • 专用 DNS 区域会产生少量费用。 请参阅 Azure DNS 定价

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

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

本地应用开发如何处理 GitHub Actions?

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

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

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

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

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

后续步骤

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

或者,查看其他资源: