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

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

Снимок экрана: пример приложения Azure с названием Task List, в котором показаны добавленные новые задачи.

Если у вас еще нет подписки 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. Вы также можете перейти напрямую к мастеру создания.

Снимок экрана, на котором показано, как использовать поле поиска на верхней панели инструментов для поиска мастера создания

Шаг 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. После завершения проверки щелкните Создать.

Снимок экрана: настройка нового приложения и базы данных в мастере

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

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

Снимок экрана: процесс развертывания завершен.

2. Настройка подключения к базе данных

Шаг 1. На странице Служба приложений в меню слева выберите "Конфигурация".

Снимок экрана: открытие страницы конфигурации в Службе приложений.

Шаг 2.

  1. Найдите параметры приложения, начинающиеся с AZURE_MYSQL_. Они были созданы из новой базы данных MySQL мастером создания.
  2. Кроме того, найдите параметры приложения, начинающиеся с AZURE_REDIS_. Они были созданы из нового кэша Redis мастером создания. Чтобы настроить приложение, это имя все, что вам нужно.
  3. Если вы хотите, нажмите кнопку "Изменить " справа от каждого параметра и просмотреть или скопировать его значение. Позже вы измените код приложения на использование этих параметров.

Снимок экрана: создание параметра приложения.

Шаг 3. На вкладке "Параметры приложения" на странице "Конфигурация" создайте CACHE_DRIVER параметр:

  1. Выберите Новый параметр приложения.
  2. В поле "Имя" введите CACHE_DRIVER.
  3. В поле "Значение" введите redis.
  4. Нажмите ОК. CACHE_DRIVER уже используется в коде приложения Laravel. Этот параметр указывает Laravel использовать Redis в качестве кэша.

Снимок экрана: просмотр автоматически созданной строки подключения.

Шаг 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. При появлении запроса выберите Далее.

Снимок экрана: сохранение параметров на странице конфигурации.

Внимание

Это 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. Щелкните Создать вилку.

Снимок экрана: создание вилка примера репозитория GitHub.

Шаг 2. На странице GitHub откройте Visual Studio Code в браузере, нажав клавишу . .

Снимок экрана: открытие окна браузера с Visual Studio Code в GitHub.

Шаг 3. В Visual Studio Code в браузере откройте конфигурацию или 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_ параметры были созданы мастером создания.

Снимок экрана: Visual Studio Code в браузере и открытый файл с измененными переменными MySQL.

Шаг 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_ параметры были созданы мастером создания.

Снимок экрана: Visual Studio Code в браузере и открытый файл с измененными переменными Redis.

Шаг 5.

  1. Выберите расширение Система управления версиями.
  2. В текстовом поле введите сообщение фиксации, например Configure DB & Redis variables.
  3. Выберите "Фиксация" и "Отправить".

Снимок экрана: фиксация изменений и отправка на GitHub.

Шаг 6. Вернитесь на страницу Служба приложений в меню слева выберите Центр развертывания.

Снимок экрана: открытие центра развертывания в Службе приложений.

Шаг 7. На странице Центра развертывания:

  1. В поле Источник выберите GitHub. По умолчанию в качестве поставщика сборки выбрано GitHub Actions.
  2. Войдите в свою учетную запись GitHub и следуйте инструкциям по авторизации Azure.
  3. В поле Организация выберите свою учетную запись.
  4. В репозитории выберите laravel-task.
  5. В поле Ветвь выберите main.
  6. В меню сверху выберите Сохранить. Служба приложений фиксирует файл рабочего процесса в выбранном репозитории GitHub в каталоге .github/workflows.

Снимок экрана: настройка CI/CD с помощью GitHub Actions.

Шаг 8. На странице Центра развертывания:

  1. Выберите Журналы. Прогон развертывания уже запущен.
  2. В элементе журнала для прогона развертывания выберите Журналы сборки и развертывания.

Снимок экрана: открытие журналов развертывания в центре развертывания.

Шаг 9. Вы перейдете в репозиторий GitHub и увидите, что действие GitHub выполняется. Файл рабочего процесса определяет два отдельных этапа: сборку и развертывание. Дождитесь, пока в выполнении действия GitHub не будет показано состояние Завершено. Это занимает около 15 минут.

Снимок экрана: выполнение действия GitHub.

4. Создание схемы базы данных

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

Шаг 1. Вернитесь на страницу Служба приложений в меню слева выберите SSH.

Снимок экрана: открытие оболочки SSH для  вашего приложения с портала Azure.

Шаг 2. В терминале SSH:

  1. Запустите cd /home/site/wwwroot. Вот все развернутые файлы.
  2. Запустите php artisan migrate --force. При успешном завершении Служба приложений успешно подключается к базе данных MySQL. После перезапуска приложения могут сохраняться только изменения в файлах в /home. Изменения за пределами /home не сохраняются.

Снимок экрана: команды для запуска в оболочке SSH и их выходные данные.

5. Изменение корня сайта

Жизненный цикл приложения Laravel начинается в каталоге /public. Контейнер PHP по умолчанию для Служба приложений использует Nginx, который начинается в корневом каталоге приложения. Чтобы изменить корневой каталог сайта, необходимо изменить файл конфигурации Nginx в контейнере PHP (/etc/nginx/sites-available/default). Для удобства пример репозитория содержит пользовательский файл конфигурации, который называется default. Как отмечалось ранее, вы не хотите заменить этот файл с помощью оболочки SSH, так как изменение выходит за /home пределы и будет потеряно после перезапуска приложения.

Шаг 1.

  1. В меню слева выберите Конфигурация.
  2. Выберите вкладку Общие параметры.

Снимок экрана: открытие  общих параметров на странице конфигурации в Службе приложений.

Шаг 2. На вкладке "Общие параметры"

  1. В поле "Команда запуска" введите следующую команду: cp /home/site/wwwroot/default /etc/nginx/sites-available/default &> nginx reload.
  2. Выберите Сохранить. Команда заменяет файл конфигурации Nginx в контейнере PHP и перезапускает Nginx. Эта конфигурация гарантирует, что одно и то же изменение выполняется в контейнер при каждом запуске.

Снимок экрана: настройка команды запуска в Службе приложений.

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

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

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

Снимок экрана: запуск Службы приложений с портала Azure.

Шаг 2. Добавление нескольких задач в список. Поздравляем, вы запускаете защищенное приложение PHP на основе данных в службе приложение Azure.

Снимок экрана: приложение Laravel, выполняющееся в Службе приложений.

Совет

Пример приложения реализует шаблон кэша в сторону . Когда вы перезагрузите страницу после внесения изменений данных, время отклика на веб-странице показывает гораздо быстрее, так как оно загружает данные из кэша вместо базы данных.

7. Потоковая передача журналов диагностики

Служба приложений Azure захватывает все сообщения, выводимые на консоль, чтобы помочь в диагностике проблем приложения. Пример приложения выводит сообщения журнала консоли в каждой из своих конечных точек для демонстрации этой возможности. По умолчанию функция ведения журнала Laravel (например, Log::info()) выводит в локальный файл. Параметр LOG_CHANNEL приложения из предыдущей версии делает записи журнала доступными из потока журналов Служба приложений.

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

  1. В меню слева выберите Журналы службы приложений.
  2. Под элементом Ведение журнала приложения выберите Файловая система.

Снимок экрана: включение собственных журналов в Службе приложений на портале Azure.

Шаг 2. В меню слева выберите поток журналов. Вы увидите журналы для своего приложения, включая журналы платформы и журналы из контейнера.

Снимок экрана: просмотр потока журналов на портале Azure.

Очистка ресурсов

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

Шаг 1. В строке поиска в верхней части портал Azure:

  1. Введите имя группы ресурсов.
  2. Выберите группу ресурсов.

Снимок экрана: поиск группы ресурсов на портале Azure и переход к ней.

Шаг 2. На странице группы ресурсов выберите "Удалить группу ресурсов".

Снимок экрана: расположение кнопки

Шаг 3.

  1. Введите имя группы ресурсов для подтверждения удаления.
  2. Выберите команду Удалить.

Снимок экрана: диалоговое окно подтверждения для удаления группы ресурсов на портале Azure. :

Часто задаваемые вопросы

Сколько стоит такая конфигурация?

Цены на создание ресурсов приведены ниже:

  • План службы приложений создается на уровне Базовый, и его можно масштабировать вверх или вниз. См. цены на Службу приложений.
  • Гибкий сервер 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:

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

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

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

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