Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве показано, как создать безопасное приложение PHP в Службе приложений Azure, которое подключается к базе данных MySQL (с помощью гибкого сервера Базы данных Azure для MySQL). Вы также развернете Кэш Azure для Redis, чтобы включить код кэширования в приложении. Служба приложений Azure — это высоко масштабируемая веб-служба, которая автоматически обновляется и позволяет легко развертывать приложения как в Windows, так и в Linux. По завершении вы получите приложение Laravel, работающее в Службе приложений Azure в Linux.
Предпосылки
- Учетная запись Azure с активной подпиской. Если у вас нет учетной записи Azure, ее можно создать бесплатно.
- Учетная запись GitHub. Вы также можете получить его бесплатно.
- Знание PHP с разработкой Laravel.
- (Необязательно) Чтобы попробовать GitHub Copilot, вам понадобится учетная запись GitHub Copilot. Доступна 30-дневная бесплатная пробная версия.
1. Запустите пример
Сначала вы настраиваете пример приложения на основе данных в качестве отправной точки. Для вашего удобства в репозитории-примере включена конфигурация контейнера для разработки. Контейнер разработки имеет все необходимое для разработки приложения, включая базу данных, кэш и все переменные среды, необходимые образцу приложения. Контейнер разработки может выполняться в пространстве кода GitHub, что означает, что вы можете запустить пример на любом компьютере с веб-браузером.
Шаг 1. В новом окне браузера:
- Войдите в свою учетную запись GitHub.
- Перейдите по адресу https://github.com/Azure-Samples/laravel-tasks/fork.
- Выберите Создать форк.
Шаг 2. В форке GitHub:
- Выберите Код>Создать пространство кода на главной.
Кодовое пространство настраивается за несколько минут. Кроме того, предоставленный ENV-файл уже содержит фиктивную
APP_KEY
переменную, которую Laravel должен выполнять локально.
Step 3: В терминале codespace:
- Выполните
composer install
. - Выполните миграции базы данных с
php artisan migrate
. - Запустите приложение, выполнив команду
php artisan serve
. - Когда появится уведомление
Your application running on port 80 is available.
, нажмите кнопку "Открыть в браузере". Пример приложения должен отображаться на новой вкладке браузера. Чтобы остановить приложение, введитеCtrl
+C
.
Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".
2. Создание службы приложений, базы данных и кэша
В этом шаге вы создадите ресурсы Azure. Действия, используемые в этом руководстве, создают набор защищенных по умолчанию ресурсов, включающих службу приложений, базу данных Azure для MySQL и кэш Azure для Redis. Для процесса создания укажите:
- Название для веб-приложения. Он используется в качестве части DNS-имени приложения.
- Регион для физического запуска приложения в мире. Он также используется в качестве части DNS-имени приложения.
- Runtime stack для приложения. Здесь следует выбрать версию PHP, которая будет использоваться для приложения.
- План размещения для приложения. Это ценовая категория, которая включает набор функций и емкость масштабирования для вашего приложения.
- Группа ресурсов для приложения. Группа ресурсов позволяет группировать (в логическом контейнере) все ресурсы Azure, необходимые для приложения.
Войдите на портал Azure и выполните следующие действия, чтобы создать ресурсы Службы приложений Azure.
Шаг 1. В портал Azure:
- В верхней строке поиска введите службу приложений.
- Выберите элемент, помеченный службой приложений , под заголовком "Службы ".
- Выберите "Создать>веб-приложение". Вы также можете перейти напрямую к мастеру создания.
Шаг 2. На странице "Создание веб-приложения" заполните форму следующим образом.
- Имя: msdocs-laravel-mysql-XYZ. Для вас будет создана группа ресурсов с именем msdocs-laravel-mysql-XYZ_group .
- Стек среды выполнения: PHP 8.4.
- Операционная система: Linux.
- Регион: любой регион Azure рядом с вами.
- План Linux: Создайте новый и используйте имя msdocs-laravel-mysql-XYZ.
- Тарифный план: Базовый. Когда вы будете готовы, вы можете увеличить масштаб до другой ценовой категории.
Шаг 3.
- Перейдите на вкладку "База данных ".
- Выберите "Создать базу данных".
- В обработчике выберите MySQL — гибкий сервер.
- Выберите "Создать кэш Azure для Redis".
- В поле "Имя " (в разделе "Кэш") введите имя кэша.
- В номере SKU выберите "Базовый".
Шаг 4.
- Перейдите на вкладку "Развертывание ".
- Включите непрерывное развертывание.
- В организации выберите псевдоним GitHub.
- В поле Репозиторий выберите laravel-tasks.
- В поле Ветвь выберите основная.
- Убедитесь, что обычная проверка подлинности отключена.
- Выберите Review + create.
- После завершения проверки щелкните Создать.
Шаг 5. Развертывание занимает несколько минут. После завершения развертывания нажмите кнопку Перейти к ресурсу. Вы перейдете непосредственно в приложение Службы приложений, но будут созданы следующие ресурсы:
- Группа ресурсов: контейнер для всех созданных ресурсов.
- План службы приложений: Определяет вычислительные ресурсы для службы приложений. Создается план Linux на уровне Базовый.
- App Service: представляет ваше приложение и работает в плане App Service.
- Виртуальная сеть: интегрированная с приложением Служба приложений и изолирует внутренний сетевой трафик.
- Частные конечные точки: доступ к конечным точкам для сервера базы данных и кэша Redis в виртуальной сети.
- Сетевые интерфейсы: представляет частные IP-адреса, по одному для каждой из частных конечных точек.
- Azure Database for MySQL Flexible Server: доступен только через частную конечную точку. База данных и пользователь создаются на этом сервере.
- Кэш Azure для Redis: доступен только через приватную конечную точку.
- Частные зоны DNS: разрешают разрешение DNS для сервера базы данных и хранилища Redis внутри виртуальной сети.
3. Секреты безопасного подключения
Мастер создания создал переменные подключения для вас уже в качестве параметров приложения. Однако лучшая практика безопасности состоит в том, чтобы хранить секреты полностью вне Службы приложений. Вы переместите свои секреты в хранилище ключей и измените настройки своего приложения на ссылки на Key Vault с помощью Service Connectors.
Шаг 1. Получение существующей строки подключения
- В меню слева на странице "Служба приложений" выберите Параметры > Переменные среды>.
- Выберите пункт Строки подключения.
- Выберите AZURE_MYSQL_CONNECTIONSTRING.
- В разделе "Добавление и изменение параметра приложения" в поле "Значение " скопируйте имя пользователя и пароль для последующего использования. Строка подключения позволяет подключиться к базе данных MySQL, защищённой частными конечными точками. Однако секреты сохраняются непосредственно в приложении Служба приложений, что не является лучшим. Вы измените это.
Шаг 2. Создание хранилища ключей для безопасного управления секретами
- В верхней строке поиска введите "хранилище ключей", а затем выберите >.
- В группе ресурсов выберите msdocs-laravel-mysql-XYZ_group.
- В имени хранилища ключей введите имя, состоящее только из букв и чисел.
- В регионе задайте для него то же расположение, что и группа ресурсов.
Шаг 3. Защита хранилища ключей с помощью частной конечной точки
- Перейдите на вкладку Сеть.
- Отмена выбора включения общедоступного доступа.
- Выберите "Создать частную конечную точку".
- В группе ресурсов выберите msdocs-laravel-mysql-XYZ_group.
- В диалоговом окне в разделе Расположение выберите то же самое местоположение, что и для вашего приложения в службе App Service.
- В поле Name введите msdocs-laravel-mysql-XYZVaultEndpoint.
- В виртуальной сети выберите виртуальную сеть в группе msdocs-laravel-mysql-XYZ_group .
- В подсети выберите доступную совместимую подсеть. Мастер веб-приложений создал его для удобства.
- Нажмите ОК.
- Выберите Проверить и создать, а затем выберите Создать. Дождитесь завершения развертывания хранилища ключей. Должно появиться сообщение "Развертывание завершено".
Шаг 4. Создание соединителя MySQL
- В верхней строке поиска введите msdocs-laravel-mysql, а затем выберите ресурс службы приложений msdocs-laravel-mysql-XYZ.
- На странице App Service в левом меню выберите Настройки > Service Connector.
- Нажмите кнопку "Создать".
- Для типа службы выберите гибкий сервер базы данных для MySQL.
- Для гибкого сервера MySQL выберите свой сервер (например, msdocs-laravel-mysql-235-server).
- Для базы данных MySQL выберите базу данных (например, msdocs-laravel-mysql-235-database).
Шаг 5. Настройка проверки подлинности для соединителя MySQL
- Выберите вкладку Аутентификация.
- Выберите строку подключения.
- Вставьте пароль, скопированный ранее.
- Выберите "Сохранить секрет" в Key Vault.
- В разделе "Подключение к Key Vault" выберите "Создать". Диалоговое окно создания подключения открывается поверх диалогового окна редактирования.
Шаг 6. Установка подключения Key Vault
- В диалоговом окне "Создание подключения" для подключения Key Vault в Key Vault выберите созданное ранее хранилище ключей.
- Выберите Review + Create.
- После завершения проверки выберите Создать.
Шаг 6. Завершение параметров соединителя MySQL
- Вы снова вернулись в диалог соединителя MySQL. На вкладке «Аутентификация» дождитесь создания подключения к хранилищу ключей. Когда это будет завершено, выпадающий список Key Vault Connection автоматически выберет его.
- Выберите Review + Create.
- Нажмите кнопку "Создать". Подождите, пока появится уведомление об успешном обновлении.
Шаг 7. Настройка соединителя Redis для использования секретов Key Vault
- На странице соединителей служб установите флажок рядом с соединителем Cache for Redis, а затем нажмите кнопку "Изменить".
- Выберите вкладку Аутентификация.
- Выберите "Сохранить секрет" в Key Vault.
- В разделе "Подключение к Key Vault" выберите созданное хранилище ключей.
- Выберите Далее: сеть.
- Выберите " Настроить правила брандмауэра", чтобы включить доступ к целевой службе. Мастер создания приложения уже защитил базу данных SQL с помощью частной конечной точки.
- Выберите Сохранить. Подождите, пока появится уведомление об успешном обновлении.
Шаг 8. Проверка интеграции Key Vault
- В левом меню выберите пункт Настройки > Переменные окружения снова.
- Рядом с AZURE_MYSQL_PASSWORD выберите "Показать значение". Значение должно быть
@Microsoft.KeyVault(...)
, что означает, что это ссылка на хранилище ключей, потому что секрет теперь управляется в хранилище ключей. - Чтобы проверить строка подключения Redis, выберите "Показать значение рядом с AZURE_REDIS_CONNECTIONSTRING".
Вкратце, процесс защиты ваших секретов подключения включал:
- Извлечение секретов подключения из переменных окружения приложения App Service.
- Создание хранилища ключей.
- Создание подключения к хранилищу ключей с использованием управляемой идентичности, назначенной системой.
- Обновление служебных соединителей для хранения секретов в хранилище ключей.
Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".
4. Настройка переменных Laravel
Шаг 1. Создайте CACHE_DRIVER
в качестве параметра приложения.
- На вкладке "Параметры приложения" нажмите кнопку "Добавить".
- В поле "Имя" введите CACHE_DRIVER.
- В поле "Значение" введите redis.
- Нажмите кнопку "Применить", а затем еще раз применить , а затем подтвердите.
Шаг 2. Используя те же действия, описанные на шаге 1, создайте следующие параметры приложения:
- 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.
Внимание
Это APP_KEY
значение используется здесь для удобства. В рабочих сценариях его необходимо создать специально для конкретного развертывания с помощью командной строки php artisan key:generate --show
.
В идеале параметр приложения APP_KEY
должен быть настроен как ссылка на хранилище ключей, что является многоэтапным процессом. Дополнительные сведения см. в статье о том, как изменить параметр приложения APP_KEY на ссылку Key Vault?
5. Развертывание примера кода
На этом шаге вы настроите развертывание GitHub с помощью GitHub Actions. Это всего лишь один из множества способов развертывания в Службе приложений, но это также отличный способ обеспечения непрерывной интеграции в процессе развертывания. По умолчанию каждый git push
из репозитория GitHub запускает действие сборки и развертывания.
Шаг 1. Вернитесь в GitHub Codespace вашего форка образца, выполните git pull origin main
.
Это перемещает новый зафиксированный файл рабочего процесса в ваше пространство кода.
Шаг 2 (вариант 1: с GitHub Copilot):
- Запустите новый сеанс чата, выбрав представление чата, а затем выберите +.
- Спросите: "@workspace Как приложение подключается к базе данных и Redis?" Copilot может дать вам некоторое объяснение о том, как настроены параметры в конфигурации/database.php.
- Спросите: "@workspace В рабочем режиме мое приложение работает в веб-приложении службы приложений, которое использует соединитель службы Azure для подключения к гибкому серверу MySQL. Какие имена переменных среды я должен использовать? Copilot может предоставить вам предложение кода, аналогичное шагам в Варианте 2: без использования GitHub Copilot ниже и даже сообщить вам, что изменения нужно внести в файл config/database.php."
- Откройте config/database.php в обозревателе и добавьте предложенный код.
- Спросите: "@workspace мое приложение 'Моя служба приложений' также использует Azure Service Connector для подключения к Redis Cache через клиент Django. Какие имена переменных среды мне нужно использовать?*" Copilot может дать вам предложение кода, аналогичное варианту 2: без GitHub Copilot ниже и даже сообщить вам внести изменения в файл config/database.php. При появлении запроса войдите в GitHub Copilot для Azure, чтобы получить более точные ответы.
- Добавьте рекомендацию кода. GitHub Copilot не дает вам одинаковый ответ каждый раз, и это не всегда правильно. Вам может потребоваться задать дополнительные вопросы, чтобы точно настроить ответ. Советы см. в статье "Что можно сделать с помощью GitHub Copilot в моем пространстве кода?".
Шаг 2 (вариант 2: без GitHub Copilot):
- Откройте config/database.php в обозревателе.
mysql
Найдите раздел и внесите следующие изменения: - Замените
DB_HOST
(строку 49) наAZURE_MYSQL_HOST
. - Замените
DB_DATABASE
(строку 51) наAZURE_MYSQL_DBNAME
. - Замените
DB_USERNAME
(строку 52) наAZURE_MYSQL_USERNAME
. - Замените
DB_PASSWORD
(строку 53) наAZURE_MYSQL_PASSWORD
. - Замените
DB_PORT
(строка 50) наAZURE_MYSQL_PORT
. - Прокрутите страницу до раздела Redis
cache
и внесите следующие изменения: - Замените
REDIS_HOST
(строку 142) наAZURE_REDIS_HOST
. - Замените
REDIS_PASSWORD
(строку 144) наAZURE_REDIS_PASSWORD
. - Замените
REDIS_PORT
(строку 145) наAZURE_REDIS_PORT
. - Замените
REDIS_CACHE_DB
(строку 146) наAZURE_REDIS_DATABASE
. - В том же разделе добавьте строку с
'scheme' => 'tls',
. Эта конфигурация сообщает Laravel использовать шифрование для подключения к Redis.
Шаг 3.
- Выберите расширение Управление исходным кодом.
- В текстовом поле введите сообщение о коммите, например
Configure Azure database and cache connections
. Или выберитеи позвольте GitHub Copilot сгенерировать для вас сообщение коммита.
- Нажмите кнопку "Зафиксировать", а затем подтвердите значение "Да".
- Нажмите кнопку "Синхронизировать изменения 1", а затем нажмите кнопку "ОК".
Шаг 4. Вернитесь на страницу Центра развертывания на портале Azure:
- Перейдите на вкладку "Журналы", затем выберите "Обновить", чтобы увидеть новый запуск развертывания.
- В элементе журнала развертывания выберите запись "Журналы сборки/развертывания" с последней временной меткой.
Шаг 5. Вы перейдете в репозиторий GitHub и увидите, что действие GitHub выполняется. Файл рабочего процесса определяет два отдельных этапа: сборку и развертывание. Дождитесь запуска GitHub, чтобы отобразить состояние успешности. Это занимает около 10 минут.
Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".
6. Создание схемы базы данных
Мастер создания помещает сервер базы данных MySQL за частной конечной точкой, поэтому он доступен только из виртуальной сети. Так как приложение Службы приложений уже интегрировано с виртуальной сетью, выполнять миграции баз данных с вашей базой данных проще всего непосредственно из контейнера Службы приложений.
Шаг 1. Назад на странице Служба приложений в меню слева
- Выберите Средства разработки>SSH.
- Выберите Перейти.
Шаг 2. В терминале SSH:
- Выполните
cd /home/site/wwwroot
. Вот все развернутые файлы. - Выполните
php artisan migrate --force
. При успешном завершении Служба приложений успешно подключается к базе данных MySQL.
Подсказка
В сеансе SSH только изменения в файлах в /home
могут сохраняться после перезапуска приложения. Изменения за пределами /home
не сохраняются.
7. Изменение корневого каталога сайта
Жизненный цикл приложения Laravel начинается в каталоге /public. Контейнер PHP по умолчанию для App Service использует Nginx, который работает в корневом каталоге приложения. Чтобы изменить корневой каталог сайта, необходимо изменить файл конфигурации Nginx в контейнере PHP (/etc/nginx/sites-available/default). Для удобства пример репозитория содержит пользовательский файл конфигурации, который называется default. Как отмечалось ранее, вы не хотите заменить этот файл с помощью оболочки SSH, так как изменение выходит за /home
пределы и будет потеряно после перезапуска приложения.
Шаг 1.
- В меню слева выберите Конфигурация.
- Выберите вкладку Общие параметры.
Шаг 2. На вкладке "Общие параметры"
В поле "Команда запуска" введите следующую команду:cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload .- Нажмите кнопку "Сохранить", а затем нажмите кнопку "Продолжить". Команда заменяет файл конфигурации Nginx в контейнере PHP и перезапускает Nginx. Эта конфигурация гарантирует, что одно и то же изменение вносится в контейнере при каждом запуске.
8. Переход к приложению
Шаг 1. На странице Служба приложений:
- В меню слева выберите Обзор.
- Выберите домен по умолчанию приложения.
Шаг 2. Добавление нескольких задач в список. Поздравляем, вы запускаете защищенное приложение PHP на основе данных в службе приложение Azure.
Подсказка
Пример приложения реализует паттерн обхода кэша. Когда вы перезагрузите страницу после внесения изменений данных, время отклика на веб-странице показывает гораздо быстрее, так как оно загружает данные из кэша вместо базы данных.
9. Потоковая передача журналов диагностики
Служба приложений Azure захватывает все сообщения, выводимые на консоль, чтобы помочь вам в диагностике проблем с приложением. Пример приложения выводит сообщения журнала консоли в каждой из своих конечных точек для демонстрации этой возможности. По умолчанию функция ведения журнала Laravel (например, Log::info()
) выводит в локальный файл. Ваш предыдущий параметр LOG_CHANNEL
приложения делает записи журнала доступными из потока журналов службы приложений.
Шаг 1. На странице Служба приложений:
- В меню слева выберите Журналы службы приложений.
- Под элементом Ведение журнала приложения выберите Файловая система.
Шаг 2. В меню слева выберите поток журналов. Вы видите логи для своего приложения, включая логи платформы и логи внутри контейнера.
Очистка ресурсов
По завершении работы можно удалить все ресурсы из вашей подписки Azure, удалив соответствующую группу ресурсов.
Шаг 1: В строке поиска в верхней части портала Azure:
- Введите имя группы ресурсов.
- Выберите группу ресурсов.
Шаг 2. На странице группы ресурсов выберите "Удалить группу ресурсов".
Шаг 3.
- Введите имя группы ресурсов для подтверждения удаления.
- Выберите команду Удалить.
2. Создание ресурсов Azure и развертывание примера приложения
На этом шаге вы создадите ресурсы Azure и развернете образец приложения в Службе приложений на Linux. Действия, используемые в этом руководстве, создают набор безопасных ресурсов по умолчанию, включающих Служба приложений и База данных Azure для MySQL.
Пространство кода GitHub уже имеет интерфейс командной строки разработчика Azure (AZD).
Создайте ключ шифрования Laravel с помощью
php artisan key:generate --show
:php artisan key:generate --show
Войдите в Azure, выполнив команду
azd auth login
и следуя подсказкам.azd auth login
Создайте необходимые ресурсы Azure и разверните код приложения с помощью команды
azd up
. Следуйте запросу, чтобы выбрать нужную подписку и расположение для ресурсов Azure.azd up
При появлении запроса укажите следующие ответы:
Вопрос Ответ Введите новое имя среды Введите уникальное имя. Шаблон AZD использует это имя как часть DNS-имени веб-приложения в Azure ( <app-name>-<hash>.azurewebsites.net
). Разрешены буквенно-цифровые символы и дефисы.Выбор подписки Azure для использования Выберите подписку. Выбор расположения Azure для использования Выберите расположение. Введите значение для защищенного параметра инфраструктуры appKey Используйте выходные данные php artisan key:generate --show
здесь. Шаблон AZD создает секрет для Key Vault, который можно использовать в вашем приложении.Введите значение для защищенного параметра инфраструктуры databasePassword Пароль базы данных для MySQL. Оно должно содержать по крайней мере 8 символов и содержать прописные буквы, строчные буквы, цифры и специальные символы. Выполнение
azd up
команды занимает около 15 минут (кэш Redis занимает больше всего времени). Он также компилирует и развертывает код вашего приложения, но позже вы измените его, чтобы он работал с App Service. Во время выполнения команда предоставляет сообщения о процессе подготовки и развертывания, включая ссылку на развертывание в Azure. По завершении команда также отображает ссылку на приложение развертывания.Этот шаблон AZD содержит файлы (azure.yaml и каталог infra), создающие архитектуру безопасную по умолчанию со следующими ресурсами Azure:
- Группа ресурсов: контейнер для всех созданных ресурсов.
- План службы приложений: Определяет вычислительные ресурсы для службы приложений. Создается план Linux в уровне B1.
- App Service: представляет ваше приложение и работает в плане App Service.
- Виртуальная сеть: интегрированная с приложением Служба приложений и изолирует внутренний сетевой трафик.
- Azure Database for MySQL Flexible Server: доступен только из виртуальной сети через интеграцию зоны DNS. База данных создается для вас на сервере.
- Кэш Azure для Redis. Доступно только из виртуальной сети.
- Частные конечные точки: Точки доступа для хранилища ключей и кеша Redis в виртуальной сети.
- Частные зоны DNS: включите возможность разрешения DNS для хранилища ключей, сервера базы данных и кэша Redis в виртуальной сети.
- Рабочая область Log Analytics: служит целевым контейнером для вашего приложения для отправки журналов, в которой вы также можете запрашивать журналы.
- Хранилище ключей. Используется для сохранения пароля базы данных при повторном развертывании с помощью AZD.
Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".
3. Использование строк подключения Azure в коде приложения
Шаблон AZD, который вы используете, создал переменные подключения для вас уже в виде параметров приложения и выводит их в терминал для вашего удобства. Параметры приложения — это один из способов уберечь секреты подключения от попадания в репозиторий кода.
В выходных данных AZD найдите параметры приложения, начинающиеся с
AZURE_MYSQL_
иAZURE_REDIS_
. Отображаются только имена параметров. Они выглядят следующим образом в выходных данных AZD:App Service app has the following app settings: - AZURE_KEYVAULT_RESOURCEENDPOINT - AZURE_KEYVAULT_SCOPE - AZURE_MYSQL_DBNAME - AZURE_MYSQL_FLAG - AZURE_MYSQL_HOST - AZURE_MYSQL_PASSWORD - AZURE_MYSQL_PORT - AZURE_MYSQL_USERNAME - AZURE_REDIS_DATABASE - AZURE_REDIS_HOST - AZURE_REDIS_PASSWORD - AZURE_REDIS_PORT - AZURE_REDIS_SSL
Параметры, начинающиеся с
AZURE_MYSQL_
, являются переменными подключения для базы данных MySQL, а параметры, начинающиеся сAZURE_REDIS_
, предназначены для кэша Redis. Позже их необходимо использовать в коде. Для удобства шаблон AZD отображает прямую ссылку на страницу параметров приложения на портале Azure.В обозревателе откройте config/database.php. Это файл конфигурации для подключений к кэшу базы данных и Redis.
Найдите часть, которая определяет
mysql
соединение (строки 46-64) и заменитеDB_HOST
,DB_PORT
,DB_DATABASE
DB_USERNAME
иDB_PASSWORD
параметрамиAZURE_MYSQL_
приложения из выходных данных AZD. Подключениеmysql
должно выглядеть следующим образом.'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('AZURE_MYSQL_HOST', '127.0.0.1'), 'port' => env('AZURE_MYSQL_PORT', '3306'), 'database' => env('AZURE_MYSQL_DBNAME', 'forge'), 'username' => env('AZURE_MYSQL_USERNAME', 'forge'), 'password' => env('AZURE_MYSQL_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ],
Дополнительные сведения о конфигурации базы данных в Laravel см. в документации по Laravel.
Найдите часть, определяющую подключение кэша Redis (строки 140-147), и замените
REDIS_HOST
,REDIS_PASSWORD
,REDIS_PORT
иREDIS_CACHE_DB
на параметрыAzure_REDIS_
приложения из выходных данных AZD. Кроме того, добавьте'scheme' => 'tls',
в подключение. Подключение к кэшу должно выглядеть следующим образом:'cache' => [ 'scheme' => 'tls', 'url' => env('REDIS_URL'), 'host' => env('AZURE_REDIS_HOST', '127.0.0.1'), 'username' => env('REDIS_USERNAME'), 'password' => env('AZURE_REDIS_PASSWORD'), 'port' => env('AZURE_REDIS_PORT', '6379'), 'database' => env('AZURE_REDIS_DATABASE', '1'), ],
Дополнительные сведения о конфигурации кэша Redis в Laravel см. в документации по Laravel.
Примечание.
Помните, что изменения еще не развернуты. Вы развернете их в конце следующего шага.
4. Настройка параметров Laravel в веб-приложении
В обозревателе откройте infra/resources.bicep. Это файл Bicep, определяющий созданные ресурсы Azure.
Найдите часть, которая определяет параметры приложения (строки 510-514) и раскомментируйте их. Эти параметры приложения:
Настройки Описание CACHE_DRIVER
Инструктирует Laravel использовать Redis в качестве системы кэширования (см. документацию по Laravel). MYSQL_ATTR_SSL_CA
Необходимо открыть подключение TLS к MySQL в Azure. Файл сертификата включен в пример репозитория для удобства. Эта переменная используется подключением mysql в config/database.php LOG_CHANNEL
Указывает Laravel направлять журналы в stderr
, что делает их доступными для журналов службы приложений (см. документацию Laravel).APP_DEBUG
Включите страницы режима отладки в Laravel (см. документацию по Laravel). APP_KEY
Переменная шифрования Laravel. Шаблон AZD уже создал секрет Key Vault (строки 212-217), поэтому вы получаете к нему доступ с помощью ссылки на Key Vault. Найдите определение ресурса для приложения App Service в infra/resources.bicep и раскомментируйте строку 315.
appCommandLine: 'cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload'
Жизненный цикл приложения Laravel начинается в каталоге /public directory вместо корневого каталога приложения. Контейнер PHP по умолчанию для службы приложений использует Nginx, который начинается в корневом каталоге приложения. Чтобы изменить корневой каталог сайта, необходимо изменить файл конфигурации Nginx в контейнере PHP (/etc/nginx/sites-available/default). Для вашего удобства в репозитории примеров имеется файл замены конфигурации под названием default, который указывает Nginx искать в каталоге /public. Эта настраиваемая команда
appCommandLine
запускается каждый раз, когда приложение запускается, чтобы применять замену файлов при каждом перезапуске контейнера Linux из чистого состояния.Вернитесь в терминал Codespace и запустите
azd up
еще раз.azd up
Подсказка
azd up
запускает azd package
, azd provision
и azd deploy
вместе, и это имеет смысл, поскольку вы вносите изменения как в инфраструктуру, так и в приложения. Чтобы внести изменения только в инфраструктуру, выполните команду azd provision
. Чтобы просто развернуть изменения в коде приложения, выполните команду azd deploy
.
Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".
5. Создание схемы базы данных
С помощью базы данных MySQL, защищенной виртуальной сетью, проще всего запустить миграцию баз данных Laravel в сеансе SSH с контейнером Linux в службе приложений.
В выходных данных AZD найдите URL-адрес сеанса SSH и перейдите к нему в браузере. Это выглядит следующим образом в выходных данных:
Open SSH session to App Service container at: <URL>
В сеансе SSH выполните миграцию базы данных из каталога /home/site/wwwroot :
cd /home/site/wwwroot php artisan migrate --force
При успешном завершении Служба приложений успешно подключается к базе данных.
Примечание.
После перезапуска приложения могут сохраняться только изменения в файлах в /home
.
Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".
6. Перейдите к приложению
В выходных данных AZD найдите URL-адрес приложения и перейдите к нему в браузере. URL-адрес выглядит следующим образом в выходных данных AZD:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <URL>
Добавьте несколько задач в список.
Поздравляем, вы запускаете веб-приложение в службе приложение Azure с безопасным подключением к База данных Azure для MySQL.
Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".
7. Трансляция журналов диагностики
Служба приложений Azure захватывает все сообщения, выводимые на консоль, чтобы помочь вам в диагностике проблем с приложением. Для удобства шаблон AZD уже настроен для логирования в локальную файловую систему и отправки логов в рабочую область Log Analytics.
Пример приложения выводит сообщения журнала консоли в каждой из своих конечных точек для демонстрации этой возможности. По умолчанию функция ведения журнала Laravel (например, Log::info()
) выводит в локальный файл. Ваш предыдущий параметр LOG_CHANNEL
приложения делает записи журнала доступными из потока журналов службы приложений.
Route::get('/', function () {
Log::info("Get /");
$startTime = microtime(true);
// Simple cache-aside logic
if (Cache::has('tasks')) {
$data = Cache::get('tasks');
} else {
$data = Task::orderBy('created_at', 'asc')->get();
Cache::add('tasks', $data);
}
return view('tasks', ['tasks' => $data, 'elapsed' => microtime(true) - $startTime]);
});
В выводе AZD найдите ссылку для потоковой передачи журналов службы приложений и перейдите по ней в браузере. Ссылка выглядит следующим образом в выходных данных AZD:
Stream App Service logs at: <URL>
Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".
8. Очистка ресурсов
Чтобы удалить все ресурсы Azure в текущей среде развертывания, выполните azd down
и следуйте инструкциям.
azd down
Устранение неполадок
При миграции базы данных возникает ошибка php_network_getaddresses: getaddrinfo for mysqldb failed: No address associated with hostname...
Это означает, что переменные подключения MySQL не настроены должным образом. Убедитесь, что AZURE_MYSQL_
параметры приложения настроены правильно в 3. Используйте строки подключения Azure в коде приложения.
Я получаю пустую страницу в браузере.
Он указывает, что служба приложений не может найти файлы запуска PHP в /public. Выполните действия, описанные в 4. Настройте параметры Laravel в веб-приложении.
Я получаю страницу отладки в браузере, на которой написано Unsupported cipher or incorrect key length.
Он указывает, что APP_KEY
параметр имеет недопустимый ключ. При выполнении azd up
убедитесь, что для выходных appKey
данных задано php artisan key:generate --show
значение .
Я получаю страницу отладки в браузере, на которой написано Uncaught Error: Class "Illuminate\..." not found.
Эта ошибка и аналогичные ошибки указывают на то, что вы не выполняли composer install
раньше azd up
или что пакеты в каталоге /vendor устарели. Запустите composer install
и azd deploy
снова.
Я получаю страницу отладки в браузере, на которой написано php_network_getaddresses: getaddrinfo for redishost failed: Name or service not known.
Это означает, что переменные подключения Redis неправильно настроены. Убедитесь, что AZURE_REDIS_
параметры приложения настроены правильно в 3. Используйте строки подключения Azure в коде приложения.
Я получаю страницу отладки в браузере, на которой написано SQLSTATE[42S02]: Base table or view not found: 1146 Table 'XXXX-XXXXXXXXX-mysql-database.tasks' doesn't exist
Это означает, что вы не выполняли миграцию баз данных или миграции баз данных не были успешными. Выполните действия , описанные в 5. Создайте схему базы данных.
Часто задаваемые вопросы
- Сколько стоит такая конфигурация?
- Как подключиться к базе данных MySQL, защищенной виртуальной сетью, с помощью других средств?
- Как изменить параметр приложения APP_KEY на ссылку Key Vault?
- Как осуществляется разработка локальных приложений с использованием GitHub Actions?
- Почему развертывание GitHub Actions идет так медленно?
- У меня нет разрешений на создание идентификатора, назначенного пользователем
- Что можно сделать с помощью GitHub Copilot в моем пространстве кода?
- Сколько стоит такая конфигурация?
- Как подключиться к базе данных MySQL, защищенной виртуальной сетью, с помощью других средств?
- Как осуществляется разработка локальных приложений с использованием GitHub Actions?
- Почему развертывание GitHub Actions идет так медленно?
- У меня нет разрешений на создание идентификатора, назначенного пользователем
- Что можно сделать с помощью GitHub Copilot в моем пространстве кода?
Сколько стоит такая конфигурация?
Цены на созданные ресурсы приведены следующим образом:
- План службы приложений создается на уровне Базовый, и его можно масштабировать вверх или вниз. См. цены на Службу приложений.
- Гибкий сервер MySQL создается на уровне B1ms, и его можно масштабировать вверх или вниз. При использовании бесплатной учетной записи Azure уровень B1ms предоставляется бесплатно в течение 12 месяцев до достижения ежемесячных пределов. См. цены на Базу данных Azure для MySQL.
- Кэш Azure для Redis создается на уровне "Базовый" с минимальным размером кэша. Существует небольшая стоимость, связанная с этим уровнем. Его можно масштабировать до более высоких уровней производительности для повышения доступности, кластеризации и других функций. См. цены на Azure Cache для Redis.
- Плата за виртуальную сеть не взимается, если только вы не настроите дополнительные функциональные возможности, такие как пиринг. См. цены на виртуальные сети Azure.
- За частную зону DNS взимается небольшая плата. См. цены на Azure DNS.
Как подключиться к базе данных MySQL, защищенной виртуальной сетью, с помощью других средств?
- Для базового доступа из программы командной строки можно запустить
mysql
из терминала SSH приложения. - Чтобы подключиться из средства для настольных систем, например MySQL Workbench, компьютер должен находиться в соответствующей виртуальной сети. Например, это может быть виртуальная машина Azure, подключенная к одной из подсетей, или компьютер в локальной сети с VPN-подключением типа "сеть — сеть" к виртуальной сети Azure.
- Вы также можете интегрировать Azure Cloud Shell с виртуальной сетью.
Как изменить настройку приложения APP_KEY на ссылку на Key Vault?
На шаге 4 на портале Настройка переменных Laravel можно изменить APP_KEY
, чтобы он ссылался на Key Vault, выполнив следующие команды Azure CLI в Codespace GitHub:
# Change the following variables to match your environment
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
KEY_VAULT_NAME=<key-vault-name>
APP_SERVICE_NAME=<app-name>
SECRET_NAME=laravelAppKey
# Set the subscription ID
az account set --subscription $SUBSCRIPTION_ID
# Assign 'Key Vault Secrets Officer' role to your user at the scope of the key vault
az role assignment create \
--assignee $(az ad signed-in-user show --query id -o tsv) \
--role $(az role definition list --name "Key Vault Secrets Officer" --query "[].id" -o tsv) \
--scope $(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id --output tsv)
# Add the secret to the key vault
az keyvault secret set \
--vault-name $KEY_VAULT_NAME \
--name $SECRET_NAME \
--value $(php artisan key:generate --show)
# Add Key Vault reference to the App Service configuration
az webapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $APP_SERVICE_NAME \
--settings "APP_KEY=@Microsoft.KeyVault(SecretUri=https://$KEY_VAULT_NAME.vault.azure.net/secrets/$SECRET_NAME)"
Вы также можете сделать то же самое на портале. Дополнительные сведения можно найти здесь
Как осуществляется разработка локальных приложений с использованием GitHub Actions?
Возьмем автоматически созданный файл рабочего процесса из Службы приложений в качестве примера, где каждый git push
запускает новый прогон сборки и развертывания. Из локального клона репозитория GitHub вы вносите необходимые обновления и отправляете их в GitHub. Например:
git add .
git commit -m "<some-message>"
git push origin main
Почему развертывание GitHub Actions идет так медленно?
Автоматически созданный файл рабочего процесса из Службы приложений определяет прогон из двух заданий — сначала сборка, потом развертывание. Так как каждое задание выполняется в собственной чистой среде, файл рабочего процесса гарантирует, что задание deploy
имеет доступ к файлам из задания build
:
- В конце задания
build
отправьте файлы в виде артефактов. - В начале задания
deploy
скачайте эти артефакты.
Большая часть времени, затрачиваемого на процесс с двумя заданиями, уходит на отправку и скачивание артефактов. При желании файл рабочего процесса можно упростить, объединив два задания в одно, что устраняет необходимость в шагах отправки и скачивания.
У меня нет полномочий на создание идентификатора, назначаемого пользователем
См. статью «Настройка развертывания GitHub Actions из Центра развертывания».
Что можно сделать с помощью GitHub Copilot в моем пространстве кода?
Вы можете заметить, что представление чата GitHub Copilot уже было там, когда вы создали кодовое пространство. Для вашего удобства мы включаем расширение чата GitHub Copilot в определение контейнера (см. .devcontainer/devcontainer.json). Однако вам нужна учетная запись GitHub Copilot (доступна бесплатная пробная версия 30 дней).
Несколько советов для вас при разговоре с GitHub Copilot:
- В одном сеансе чата вопросы и ответы дополняют друг друга, и вы можете корректировать свои вопросы, чтобы получить более точный ответ.
- По умолчанию GitHub Copilot не имеет доступа к файлу в репозитории. Чтобы задать вопросы о файле, сначала откройте файл в редакторе.
- Чтобы разрешить GitHub Copilot получить доступ ко всем файлам в репозитории при подготовке его ответов, начните с вашего вопроса
@workspace
. Дополнительные сведения см. в разделе Use the @workspace agent. - В сеансе чата GitHub Copilot может предложить изменения и (с
@workspace
) даже указать, где их внести, но ему не разрешено делать изменения за вас. Вам решать, добавлять ли предлагаемые изменения и тестировать их.
Следующие шаги
Перейдите к следующему руководству, чтобы узнать, как защитить приложение с помощью личного домена и сертификата.
Также ознакомьтесь с другими ресурсами: