Руководство по развертыванию приложения PHP, MySQL и Redis в службе приложение Azure

В этом руководстве показано, как создать безопасное приложение PHP в Службе приложений Azure, подключенное к базе данных MySQL (с помощью гибкого сервера Базы данных Azure для MySQL). Вы также развернете Кэш Azure для Redis, чтобы включить код кэширования в приложении. Служба приложений Azure — это высокомасштабируемая веб-служба с поддержкой самостоятельного исправления, которая позволяет легко развертывать приложения в Windows или Linux. По завершении вы получите приложение Laravel, работающее в Службе приложений Azure в Linux.

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

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

Пример приложения

Чтобы следовать этому руководству, клонируйте или скачайте пример приложения Laravel из репозитория:

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

Если вы хотите запустить приложение локально, сделайте следующее:

  • В файле ENV настройте параметры базы данных (например, DB_DATABASE, DB_USERNAME и DB_PASSWORD) с помощью параметров в локальной базе данных MySQL. Для запуска этого примера потребуется локальный сервер MySQL.

  • В корне репозитория запустите Laravel с помощью следующих команд:

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

1. Создание ресурсов Службы приложений и MySQL

В этом шаге вы создадите ресурсы Azure. Действия, описанные в этом руководстве, позволяют создать изначально безопасную конфигурацию Службы приложений и Базы данных Azure для MySQL. В процессе создания вы укажете следующее:

  • Имя веб-приложения. Это имя используется в составе DNS-имени вашего веб-приложения в виде https://<app-name>.azurewebsites.net.
  • Среда выполнения для приложения. Здесь следует выбрать версию PHP, которая будет использоваться для приложения.
  • Группа ресурсов для приложения. Группа ресурсов позволяет группировать (в логическом контейнере) все ресурсы Azure, необходимые для приложения.

Войдите на портал Azure и выполните следующие действия, чтобы создать ресурсы Службы приложений Azure.

Шаг 1. В портал Azure:

  1. Введите "веб-приложение база данных" в строке поиска в верхней части портала Azure.
  2. Выберите элемент с меткой Веб-приложение и база данных под заголовком Marketplace. Вы также можете перейти напрямую к мастеру создания.

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

Шаг 2. На странице "Создание веб-приложения + база данных " заполните форму следующим образом.

  1. Группа ресурсов — выберите Создать и используйте имя msdocs-laravel-mysql-tutorial.
  2. Регион → любой ближайший к вам регион Azure.
  3. Имя — используйте имя msdocs-laravel-mysql-XYZ, где XYZ представляет три произвольных символа. Это имя должно быть уникальным в Azure.
  4. Стек среды выполнения → PHP 8.2.
  5. Добавьте Кэш Azure для Redis? → Да.
  6. План размещения — Базовый. Позже, когда все будет готово, вы сможете вертикально увеличить масштаб до рабочей ценовой категории.
  7. MySQL — гибкий сервер выбран по умолчанию в качестве ядра СУБД. База данных Azure для MySQL — это полностью управляемая система "база данных как услуга" MySQL в Azure, совместимая с последними выпусками сообщества.
  8. Выберите Review + create (Просмотреть и создать).
  9. После завершения проверки щелкните Создать.

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

Шаг 3. Развертывание занимает несколько минут. После завершения развертывания нажмите кнопку Перейти к ресурсу. Вы перейдете непосредственно в приложение Службы приложений, но будут созданы следующие ресурсы:

  • Группа ресурсов — Контейнер для всех созданных ресурсов.
  • План службы приложений — определяет вычислительные ресурсы для Службы приложений. Создается план Linux на уровне Базовый.
  • Служба приложений — представляет приложение и выполняется в плане службы приложений.
  • Виртуальная сеть — интегрирована с приложением Службы приложений и изолирует внутренний сетевой трафик.
  • Частные конечные точки → конечные точки Access для сервера базы данных и кэша Redis в виртуальной сети.
  • Сетевые интерфейсы → Представляют частные IP-адреса, по одному для каждой из частных конечных точек.
  • База данных Azure для MySQL гибкий сервер → доступен только за частной конечной точкой. База данных и пользователь создаются на этом сервере.
  • Кэш Azure для Redis → доступно только за частной конечной точкой.
  • Частная зона DNS зонах → включить разрешение DNS сервера базы данных и кэш Redis в виртуальной сети.

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 в качестве значения. Этот параметр приложения указывает на путь к TLS/SSL-сертификату, необходимому для доступа к серверу MySQL. Для удобства он включен в пример репозитория.
  • 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 с помощью GitHub Actions. Это всего лишь один из множества способов развертывания в Службе приложений, но это также отличный способ обеспечения непрерывной интеграции в процессе развертывания. По умолчанию каждый git push из репозитория GitHub запускает действие сборки и развертывания. Вы внесете некоторые изменения в базу кода с помощью Visual Studio Code непосредственно в браузере, а затем позволите GitHub Actions выполнить развертывание автоматически.

Шаг 1. В новом окне браузера:

  1. Войдите в свою учетную запись GitHub.
  2. Перейдите к https://github.com/Azure-Samples/laravel-tasks.
  3. Выберите Создать вилку.
  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. В поле Ветвь выберите main.
  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 выполняется. Файл рабочего процесса определяет два отдельных этапа: сборку и развертывание. Дождитесь, пока в выполнении действия 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, который начинается в корневом каталоге приложения. Чтобы изменить корневой каталог сайта, необходимо изменить файл конфигурации Nginx в контейнере PHP (/etc/nginx/sites-available/default). Для удобства пример репозитория содержит пользовательский файл конфигурации, который называется default. Как отмечалось ранее, вы не хотите заменить этот файл с помощью оболочки SSH, так как изменение выходит за /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 &> nginx reload.
  2. Выберите Сохранить. Команда заменяет файл конфигурации Nginx в контейнере PHP и перезапускает Nginx. Эта конфигурация гарантирует, что одно и то же изменение выполняется в контейнер при каждом запуске.

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

6. Переход в приложение

Шаг 1. На странице Служба приложений:

  1. В меню слева выберите Обзор.
  2. Выберите URL-адрес своего приложения. Также можно перейти непосредственно по адресу https://<app-name>.azurewebsites.net.

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 для MySQL.
  • Кэш Azure для Redis создается на уровне "Базовый" с минимальным размером кэша. Существует небольшая стоимость, связанная с этим уровнем. Его можно масштабировать до более высоких уровней производительности для повышения доступности, кластеризация и других функций. См. Кэш Azure для Redis цены.
  • Плата за виртуальную сеть не взимается, если только вы не настроите дополнительные функциональные возможности, такие как пиринг. См. цены на виртуальные сети Azure.
  • За частную зону DNS взимается небольшая плата. См. цены на Azure DNS.

Как подключиться к базе данных MySQL, защищенной виртуальной сетью, с помощью других средств?

  • Для базового доступа из программы командной строки можно запустить mysql из терминала SSH приложения.
  • Чтобы подключиться из средства для настольных систем, например MySQL Workbench, компьютер должен находиться в соответствующей виртуальной сети. Например, это может быть виртуальная машина Azure, подключенная к одной из подсетей, или компьютер в локальной сети с VPN-подключением типа "сеть — сеть" к виртуальной сети Azure.
  • Вы также можете интегрировать Azure Cloud Shell с виртуальной сетью.

Как осуществляется разработка локальных приложений с использованием GitHub Actions?

Возьмем автоматически созданный файл рабочего процесса из Службы приложений в качестве примера, где каждый git push запускает новый прогон сборки и развертывания. Из локального клона репозитория GitHub вы вносите необходимые обновления в GitHub. Например:

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

Почему развертывание GitHub Actions идет так медленно?

Автоматически созданный файл рабочего процесса из Службы приложений определяет прогон из двух заданий — сначала сборка, потом развертывание. Так как каждое задание выполняется в собственной чистой среде, файл рабочего процесса гарантирует, что задание deploy имеет доступ к файлам из задания build:

Большая часть времени, затрачиваемого процессом из двух заданий, уходит на отправку и скачивание артефактов. При желании файл рабочего процесса можно упростить, объединив два задания в одно, что устраняет необходимость в шагах отправки и скачивания.

Следующие шаги

Перейдите к следующему руководству, чтобы узнать, как защитить приложение с помощью личного домена и сертификата.

Также ознакомьтесь с другими ресурсами: