Поделиться через


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

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

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

Предпосылки

1 - Run the sample

Сначала вы настраиваете пример приложения на основе данных в качестве отправной точки. For your convenience, the sample repository, includes a dev container configuration. Контейнер разработки имеет все необходимое для разработки приложения, включая базу данных, кэш и все переменные среды, необходимые образцу приложения. Контейнер разработки может выполняться в пространстве кода GitHub, что означает, что вы можете запустить пример на любом компьютере с веб-браузером.

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

  1. Войдите в свою учетную запись GitHub.
  2. Navigate to https://github.com/Azure-Samples/laravel-tasks/fork.
  3. Выберите Создать форк.

Шаг 2. В форке GitHub:

  1. Select Code>Create codespace on main. Кодовое пространство настраивается за несколько минут. Кроме того, предоставленный ENV-файл уже содержит фиктивную APP_KEY переменную, которую Laravel должен выполнять локально.

Step 3: In the codespace terminal:

  1. Run composer install.
  2. Run database migrations with php artisan migrate.
  3. Запустите приложение, выполнив команду php artisan serve.
  4. Когда появится уведомление Your application running on port 80 is available., нажмите кнопку "Открыть в браузере". Пример приложения должен отображаться на новой вкладке браузера. Чтобы остановить приложение, введите Ctrl+C.

Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".

2. Создание службы приложений, базы данных и кэша

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

  • The Name for the web app. Он используется в качестве части DNS-имени приложения в виде https://<app-name>-<hash>.<region>.azurewebsites.net.
  • The Region to run the app physically in the world. Он также используется в качестве части DNS-имени приложения.
  • The Runtime stack for the app. Здесь следует выбрать версию PHP, которая будет использоваться для приложения.
  • План размещения для приложения. Это ценовая категория, которая включает набор функций и емкость масштабирования для вашего приложения.
  • Группа ресурсов для приложения. Группа ресурсов позволяет группировать (в логическом контейнере) все ресурсы Azure, необходимые для приложения.

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

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

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

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

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

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

  • Группа ресурсов: контейнер для всех созданных ресурсов.
  • План службы приложений: Определяет вычислительные ресурсы для службы приложений. Создается план Linux на уровне Базовый.
  • App Service: Represents your app and runs in the App Service plan.
  • Виртуальная сеть: интегрированная с приложением Служба приложений и изолирует внутренний сетевой трафик.
  • Частные конечные точки: доступ к конечным точкам для сервера базы данных и кэша Redis в виртуальной сети.
  • Сетевые интерфейсы: представляет частные IP-адреса, по одному для каждой из частных конечных точек.
  • Azure Database for MySQL Flexible Server: Accessible only from behind its private endpoint. База данных и пользователь создаются на этом сервере.
  • Azure Cache for Redis: Accessible only from behind its private endpoint.
  • Частные зоны DNS: разрешают разрешение DNS для сервера базы данных и хранилища Redis внутри виртуальной сети.

3. Секреты безопасного подключения

Мастер создания создал переменные подключения для вас уже в качестве параметров приложения. However, the security best practice is to keep secrets out of App Service completely. You'll move your secrets to a key vault and change your app setting to Key Vault references with the help of Service Connectors.

Шаг 1. Получение существующей строки подключения

  1. In the left menu of the App Service page, select Settings > Environment variables.
  2. Выберите AZURE_MYSQL_PASSWORD.
  3. В "Добавление/Изменение настроек приложения", в поле "Значение" скопируйте строку пароля для последующего использования. Параметры приложения, которые отображаются, позволяют подключаться к базе данных MySQL и кэшу Redis, защищенному за частными конечными точками. Однако секреты сохраняются непосредственно в приложении Служба приложений, что не является лучшим. You'll change this.

Шаг 2. Создание хранилища ключей для безопасного управления секретами

  1. В верхней строке поиска введите "хранилище ключей", а затем выберите >.
  2. В группе ресурсов выберите msdocs-laravel-mysql-tutorial.
  3. В имени хранилища ключей введите имя, состоящее только из букв и чисел.
  4. В регионе задайте для него то же расположение, что и группа ресурсов.

Шаг 3. Защита хранилища ключей с помощью частной конечной точки

  1. Перейдите на вкладку Сеть.
  2. Отмена выбора включения общедоступного доступа.
  3. Выберите "Создать частную конечную точку".
  4. В группе ресурсов выберите msdocs-laravel-mysql-tutorial.
  5. В диалоговом окне в разделе Расположение выберите то же самое местоположение, что и для вашего приложения в службе App Service.
  6. В поле Name введите msdocs-laravel-mysql-XYZVaultEndpoint.
  7. В виртуальной сети выберите msdocs-laravel-mysql-XYZVnet.
  8. In Subnet, msdocs-laravel-mysql-XYZSubnet.
  9. Нажмите ОК.
  10. Выберите Проверить и создать, а затем выберите Создать. Wait for the key vault deployment to finish. Должно появиться сообщение "Развертывание завершено".

Шаг 4. Настройка соединителя MySQL

  1. В верхней строке поиска введите msdocs-laravel-mysql, а затем выберите ресурс службы приложений msdocs-laravel-mysql-XYZ.
  2. In the App Service page, in the left menu, select Settings > Service Connector. Уже есть два соединителя, которые мастер создания приложений создал для вас.
  3. Установите флажок рядом с соединителем MySQL, а затем нажмите кнопку "Изменить".
  4. Выберите вкладку Аутентификация.
  5. Вставьте пароль, скопированный ранее.
  6. Выберите "Сохранить секрет" в Key Vault.
  7. В разделе "Подключение к Key Vault" выберите "Создать". Диалоговое окно создания подключения открывается поверх диалогового окна редактирования.

Шаг 5. Установка подключения к Key Vault

  1. В диалоговом окне "Создание подключения" для подключения Key Vault в Key Vault выберите созданное ранее хранилище ключей.
  2. Выберите Review + Create.
  3. После завершения проверки выберите Создать.

Шаг 6. Завершение параметров соединителя MySQL

  1. You're back in the edit dialog for defaultConnector. In the Authentication tab, wait for the key vault connector to be created. When it's finished, the Key Vault Connection dropdown automatically selects it.
  2. Выберите Далее: сеть.
  3. Выберите Сохранить. Подождите, пока появится уведомление об успешном обновлении.

Шаг 7. Настройка соединителя Redis для использования секретов Key Vault

  1. На странице соединителей служб установите флажок рядом с соединителем Cache for Redis, а затем нажмите кнопку "Изменить".
  2. Выберите вкладку Аутентификация.
  3. Выберите "Сохранить секрет" в Key Vault.
  4. В разделе "Подключение к Key Vault" выберите созданное хранилище ключей.
  5. Выберите Далее: сеть.
  6. Выберите " Настроить правила брандмауэра", чтобы включить доступ к целевой службе. Мастер создания приложения уже защитил базу данных SQL с помощью частной конечной точки.
  7. Выберите Сохранить. Подождите, пока появится уведомление об успешном обновлении.

Шаг 8. Проверка интеграции Key Vault

  1. From the left menu, select Settings > Environment variables again.
  2. Рядом с AZURE_MYSQL_PASSWORD выберите "Показать значение". Значение должно быть @Microsoft.KeyVault(...), что означает, что это ссылка на хранилище ключей, потому что секрет теперь управляется в хранилище ключей.
  3. Чтобы проверить строка подключения Redis, выберите "Показать значение рядом с AZURE_REDIS_CONNECTIONSTRING".

To summarize, the process for securing your connection secrets involved:

  • Retrieving the connection secrets from the App Service app's environment variables.
  • Creating a key vault.
  • Creating a Key Vault connection with the system-assigned managed identity.
  • Updating the service connectors to store the secrets in the key vault.

Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".


4. Настройка переменных Laravel

Шаг 1. Создайте CACHE_DRIVER в качестве параметра приложения.

  1. На вкладке "Параметры приложения" нажмите кнопку "Добавить".
  2. В поле "Имя" введите CACHE_DRIVER.
  3. В поле "Значение" введите redis.
  4. Нажмите кнопку "Применить", а затем еще раз применить , а затем подтвердите.

Шаг 2. Используя те же действия, описанные на шаге 1, создайте следующие параметры приложения:

  • MYSQL_ATTR_SSL_CA: используйте /home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem в качестве значения. Этот параметр приложения указывает на путь к TLS/SSL-сертификату, необходимому для доступа к серверу MySQL. It's included in the sample repository for convenience.
  • LOG_CHANNEL: Используйте stderr в качестве значения. This setting tells Laravel to pipe logs to stderr, which makes it available to the App Service logs.
  • APP_DEBUG: используйте true в качестве значения. It's a Laravel debugging variable that enables debug mode pages.
  • 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. В меню слева выберите >.

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

  1. В поле Источник выберите GitHub. По умолчанию в качестве поставщика сборки выбрано GitHub Actions.
  2. Войдите в свою учетную запись GitHub и следуйте инструкциям по авторизации Azure.
  3. В поле Организация выберите свою учетную запись.
  4. В репозитории выберите msdocs-postgresql-sample-app.
  5. In Branch, select main.
  6. Для типа проверки подлинности выберите пользовательскую идентификацию.
  7. В меню сверху выберите Сохранить. Служба приложений фиксирует файл рабочего процесса в выбранном репозитории GitHub в каталоге .github/workflows. By default, the deployment center creates a user-assigned identity for the workflow to authenticate using Microsoft Entra (OIDC authentication). Для дополнительных вариантов проверки подлинности см. статью "Развертывание в Службе приложений с помощью GitHub Actions".

Шаг 3. Вернитесь в кодовое пространство GitHub вашего форка образца. Выполните команду git pull origin main. This pulls the newly committed workflow file into your codespace.

Шаг 4 (вариант 1: с GitHub Copilot):

  1. Запустите новый сеанс чата, выбрав представление чата, а затем выберите +.
  2. Спросите: "@workspace Как приложение подключается к базе данных и Redis?" Copilot может дать вам некоторое объяснение о том, как настроены параметры в конфигурации/database.php.
  3. Спросите: "@workspace В рабочем режиме мое приложение работает в веб-приложении службы приложений, которое использует соединитель службы Azure для подключения к гибкому серверу MySQL. Какие имена переменных среды я должен использовать? Copilot может предоставить вам предложение кода, аналогичное шагам в Варианте 2: без использования GitHub Copilot ниже и даже сообщить вам, что изменения нужно внести в файл config/database.php."
  4. Откройте config/database.php в обозревателе и добавьте предложенный код.
  5. Ask, "@workspace My App Service app also uses Azure Service Connector to connect to a Cache for Redis using the Django client type. What are the environment variable names I need to use?*" Copilot might give you a code suggestion similar to the one in the Option 2: without GitHub Copilot steps below and even tell you to make the change in the config/database.php file. При появлении запроса войдите в GitHub Copilot для Azure, чтобы получить более точные ответы.
  6. Add the code suggestion. GitHub Copilot не дает вам одинаковый ответ каждый раз, и это не всегда правильно. Вам может потребоваться задать дополнительные вопросы, чтобы точно настроить ответ. Советы см. в статье "Что можно сделать с помощью GitHub Copilot в моем пространстве кода?".

Шаг 4 (вариант 2: без GitHub Copilot):

  1. Откройте config/database.php в обозревателе. mysql Найдите раздел и внесите следующие изменения:
  2. Замените DB_HOST (строку 49) на AZURE_MYSQL_HOST.
  3. Замените DB_DATABASE (строку 51) на AZURE_MYSQL_DBNAME.
  4. Замените DB_USERNAME (строку 52) на AZURE_MYSQL_USERNAME.
  5. Замените DB_PASSWORD (строку 53) на AZURE_MYSQL_PASSWORD.
  6. Замените DB_PORT (строка 50) на AZURE_MYSQL_PORT.
  7. Прокрутите страницу до раздела Redis cache и внесите следующие изменения:
  8. Замените REDIS_HOST (строку) на AZURE_REDIS_HOST.
  9. Замените REDIS_PASSWORD на AZURE_REDIS_PASSWORD.
  10. Замените REDIS_PORT на AZURE_REDIS_PORT.
  11. Замените REDIS_CACHE_DB на AZURE_REDIS_DATABASE.
  12. В том же разделе добавьте строку с 'scheme' => 'tls',. Эта конфигурация сообщает Laravel использовать шифрование для подключения к Redis.

Шаг 5.

  1. Select the Source Control extension.
  2. In the textbox, type a commit message like Configure Azure database and cache connectons. Or, select and let GitHub Copilot generate a commit message for you.
  3. Нажмите кнопку "Зафиксировать", а затем подтвердите значение "Да".
  4. Нажмите кнопку "Синхронизировать изменения 1", а затем нажмите кнопку "ОК".

Шаг 6. Назад на странице Центра развертывания в портал Azure:

  1. Select the Logs tab, then select Refresh to see the new deployment run.
  2. In the log item for the deployment run, select the Build/Deploy Logs entry with the latest timestamp.

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

Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".

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

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

Шаг 1. Назад на странице Служба приложений в меню слева

  1. Выберите Средства разработки>SSH.
  2. Выберите Перейти.

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

  1. Run cd /home/site/wwwroot. Here are all your deployed files.
  2. Run php artisan migrate --force. При успешном завершении Служба приложений успешно подключается к базе данных MySQL.

Tip

В сеансе SSH только изменения в файлах в /home могут сохраняться после перезапуска приложения. Changes outside of /home aren't persisted.

7 - Change site root

Жизненный цикл приложения Laravel начинается в каталоге /public. Контейнер PHP по умолчанию для App Service использует 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 && service nginx reload.
  2. Нажмите кнопку "Сохранить", а затем нажмите кнопку "Продолжить". Команда заменяет файл конфигурации Nginx в контейнере PHP и перезапускает Nginx. Эта конфигурация гарантирует, что одно и то же изменение вносится в контейнере при каждом запуске.

8. Переход к приложению

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

  1. В меню слева выберите Обзор.
  2. Выберите домен по умолчанию приложения.

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

Tip

The sample application implements the cache-aside pattern. When you reload the page after making data changes, Response time in the webpage shows a much faster time because it's loading the data from the cache instead of the database.

9 - Stream diagnostic logs

Служба приложений Azure захватывает все сообщения, выводимые на консоль, чтобы помочь вам в диагностике проблем с приложением. Пример приложения выводит сообщения журнала консоли в каждой из своих конечных точек для демонстрации этой возможности. By default, Laravel's logging functionality (for example, Log::info()) outputs to a local file. Ваш предыдущий параметр LOG_CHANNEL приложения делает записи журнала доступными из потока журналов службы приложений.

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

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

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

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

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

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

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

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

Шаг 3.

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

2. Создание ресурсов Azure и развертывание примера приложения

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

Пространство кода GitHub уже имеет интерфейс командной строки разработчика Azure (AZD).

  1. Создайте ключ шифрования Laravel с помощью php artisan key:generate --show:

    php artisan key:generate --show
    
  2. Войдите в Azure, выполнив команду azd auth login и следуя подсказкам.

    azd auth login
    
  3. Создайте необходимые ресурсы Azure и разверните код приложения с помощью команды azd up. Следуйте запросу, чтобы выбрать нужную подписку и расположение для ресурсов Azure.

    azd up
    
  4. При появлении запроса укажите следующие ответы:

    Вопрос Ответ
    Введите новое имя среды Введите уникальное имя. Шаблон AZD использует это имя как часть DNS-имени веб-приложения в Azure (<app-name>-<hash>.azurewebsites.net). Разрешены буквенно-цифровые символы и дефисы.
    Выбор подписки Azure для использования Выберите подписку.
    Выбор расположения Azure для использования Выберите расположение.
    Введите значение для защищенного параметра инфраструктуры appKey Use the output of php artisan key:generate --show here. Шаблон AZD создает секрет для Key Vault, который можно использовать в вашем приложении.
    Введите значение для защищенного параметра инфраструктуры databasePassword Пароль базы данных для MySQL. Оно должно содержать по крайней мере 8 символов и содержать прописные буквы, строчные буквы, цифры и специальные символы.

    Выполнение azd up команды занимает около 15 минут (кэш Redis занимает больше всего времени). Он также компилирует и развертывает код вашего приложения, но позже вы измените его, чтобы он работал с App Service. Во время выполнения команда предоставляет сообщения о процессе подготовки и развертывания, включая ссылку на развертывание в Azure. По завершении команда также отображает ссылку на приложение развертывания.

    Этот шаблон AZD содержит файлы (azure.yaml и каталог infra), создающие архитектуру безопасную по умолчанию со следующими ресурсами Azure:

    • Группа ресурсов: контейнер для всех созданных ресурсов.
    • План службы приложений: Определяет вычислительные ресурсы для службы приложений. A Linux plan in the B1 tier is created.
    • App Service: Represents your app and runs in the App Service plan.
    • Виртуальная сеть: интегрированная с приложением Служба приложений и изолирует внутренний сетевой трафик.
    • Azure Database for MySQL Flexible Server: доступен только из виртуальной сети через интеграцию зоны DNS. База данных создается для вас на сервере.
    • Кэш Azure для Redis. Доступно только из виртуальной сети.
    • Private endpoints: Access endpoints for the key vault and the Redis cache in the virtual network.
    • Частные зоны DNS: включите возможность разрешения DNS для хранилища ключей, сервера базы данных и кэша Redis в виртуальной сети.
    • Рабочая область Log Analytics: служит целевым контейнером для вашего приложения для отправки журналов, в которой вы также можете запрашивать журналы.
    • Хранилище ключей. Используется для сохранения пароля базы данных при повторном развертывании с помощью AZD.

Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".

3. Использование строк подключения Azure в коде приложения

Шаблон AZD, который вы используете, создал переменные подключения для вас уже в виде параметров приложения и выводит их в терминал для вашего удобства. Параметры приложения — это один из способов уберечь секреты подключения от попадания в репозиторий кода.

  1. В выходных данных 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.

  2. В обозревателе откройте config/database.php. Это файл конфигурации для подключений к кэшу базы данных и Redis.

  3. Найдите часть, которая определяет mysql соединение (строки 46-64) и замените DB_HOST, DB_PORT, DB_DATABASEDB_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.

  4. Найдите часть, определяющую подключение кэша 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.

    Примечание.

    Remember that your changes aren't deployed yet. Вы развернете их в конце следующего шага.

4. Настройка параметров Laravel в веб-приложении

  1. В обозревателе откройте infra/resources.bicep. Это файл шаблона Bicep, определяющий созданные ресурсы Azure.

  2. Найдите часть, которая определяет параметры приложения (строки 510-514) и раскомментируйте их. Эти параметры приложения:

    Настройки Описание
    CACHE_DRIVER Инструктирует Laravel использовать Redis в качестве системы кэширования (см. документацию по Laravel).
    MYSQL_ATTR_SSL_CA Необходимо открыть подключение TLS к MySQL в Azure. Файл сертификата включен в пример репозитория для удобства. This variable is used by the mysql connection in config/database.php
    LOG_CHANNEL Указывает Laravel направлять журналы в stderr, что делает их доступными для журналов службы приложений (см. документацию Laravel).
    APP_DEBUG Включите страницы режима отладки в Laravel (см. документацию по Laravel).
    APP_KEY Переменная шифрования Laravel. Шаблон AZD уже создал секрет Key Vault (строки 212-217), поэтому вы получаете к нему доступ с помощью ссылки на Key Vault.
  3. In infra/resources.bicep, find the resource definition for the App Service app and uncomment line 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). For your convenience, the sample repository contains a replacement configuration file called default, which tells Nginx to look in the /public directory. Эта настраиваемая команда appCommandLine запускается каждый раз, когда приложение запускается, чтобы применять замену файлов при каждом перезапуске контейнера Linux из чистого состояния.

  4. Вернитесь в терминал Codespace и запустите azd up еще раз.

    azd up
    

Tip

azd up запускает azd package, azd provision и azd deploy вместе, и это имеет смысл, поскольку вы вносите изменения как в инфраструктуру, так и в приложения. Чтобы внести изменения только в инфраструктуру, выполните команду azd provision. To just deploy changes to application code, run azd deploy.

Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".

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

С помощью базы данных MySQL, защищенной виртуальной сетью, проще всего запустить миграцию баз данных Laravel в сеансе SSH с контейнером Linux в службе приложений.

  1. В выходных данных AZD найдите URL-адрес сеанса SSH и перейдите к нему в браузере. Это выглядит следующим образом в выходных данных:

     Open SSH session to App Service container at: https://<app-name>-<hash>.scm.azurewebsites.net/webssh/host
     
  2. В сеансе SSH выполните миграцию базы данных из каталога /home/site/wwwroot :

    cd /home/site/wwwroot
    php artisan migrate --force
    

    При успешном завершении Служба приложений успешно подключается к базе данных.

Примечание.

После перезапуска приложения могут сохраняться только изменения в файлах в /home.

Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".

6. Перейдите к приложению

  1. В выходных данных AZD найдите URL-адрес приложения и перейдите к нему в браузере. URL-адрес выглядит следующим образом в выходных данных AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>-<hash>.azurewebsites.net/
     
  2. Добавьте несколько задач в список.

    Снимок экрана веб-приложения Laravel с MySQL, выполняющегося в Azure с отображением задач.

    Поздравляем, вы запускаете веб-приложение в службе приложение Azure с безопасным подключением к База данных Azure для MySQL.

Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".

7. Трансляция журналов диагностики

Служба приложений Azure захватывает все сообщения, выводимые на консоль, чтобы помочь вам в диагностике проблем с приложением. For convenience, the AZD template already enabled logging to the local file system and is shipping the logs to a Log Analytics workspace.

Пример приложения выводит сообщения журнала консоли в каждой из своих конечных точек для демонстрации этой возможности. By default, Laravel's logging functionality (for example, Log::info()) outputs to a local file. Ваш предыдущий параметр 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]);
});

In the AZD output, find the link to stream App Service logs and navigate to it in the browser. Ссылка выглядит следующим образом в выходных данных AZD:

Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream

Возникли проблемы? Ознакомьтесь с разделом "Устранение неполадок".

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 параметр имеет недопустимый ключ. When you run azd up, make sure you set appKey to the output of 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 создается на уровне B1ms, и его можно масштабировать вверх или вниз. При использовании бесплатной учетной записи Azure уровень B1ms предоставляется бесплатно в течение 12 месяцев до достижения ежемесячных пределов. См. цены на Базу данных Azure для MySQL.
  • Кэш Azure для Redis создается на уровне "Базовый" с минимальным размером кэша. There's a small cost associated with this tier. Его можно масштабировать до более высоких уровней производительности для повышения доступности, кластеризации и других функций. См. цены на 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 "[email protected](SecretUri=https://$KEY_VAULT_NAME.vault.azure.net/secrets/$SECRET_NAME)"

Вы также можете сделать то же самое на портале. Дополнительные сведения можно найти здесь

  1. Key Vault scope role assignment
  2. Добавление секрета в Key Vault
  3. Получение секрета из Key Vault
  4. Настройка параметров приложения

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

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

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

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

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

Most of the time taken by the two-job process is spent uploading and download artifacts. При желании файл рабочего процесса можно упростить, объединив два задания в одно, что устраняет необходимость в шагах отправки и скачивания.

I don't have permissions to create a user-assigned identity

См. статью «Настройка развертывания GitHub Actions из Центра развертывания».

Что можно сделать с помощью GitHub Copilot в моем пространстве кода?

You might notice that the GitHub Copilot chat view was already there for you when you created the codespace. Для вашего удобства мы включаем расширение чата GitHub Copilot в определение контейнера (см. .devcontainer/devcontainer.json). Однако вам нужна учетная запись GitHub Copilot (доступна бесплатная пробная версия 30 дней).

Несколько советов для вас при разговоре с GitHub Copilot:

  • В одном сеансе чата вопросы и ответы дополняют друг друга, и вы можете корректировать свои вопросы, чтобы получить более точный ответ.
  • По умолчанию GitHub Copilot не имеет доступа к файлу в репозитории. Чтобы задать вопросы о файле, сначала откройте файл в редакторе.
  • Чтобы разрешить GitHub Copilot получить доступ ко всем файлам в репозитории при подготовке его ответов, начните с вашего вопроса @workspace. Дополнительные сведения см. в разделе Use the @workspace agent.
  • В сеансе чата GitHub Copilot может предложить изменения и (с @workspace) даже указать, где их внести, но ему не разрешено делать изменения за вас. Вам решать, добавлять ли предлагаемые изменения и тестировать их.

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

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

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