Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tutorial se muestra cómo crear una aplicación PHP segura en Azure App Service se conecta a una base de datos MySQL (mediante el servidor flexible de Azure Database for MySQL). También implementará un Azure Cache for Redis para habilitar el código de almacenamiento en caché en la aplicación. Azure App Service es un servicio de hospedaje web con gran capacidad de escalado y aplicación automática de revisiones que puede implementar fácilmente aplicaciones en Windows o Linux. Cuando haya terminado, tendrá una aplicación de Laravel que se ejecuta en Azure App Service en Linux.
Prerrequisitos
- Una cuenta de Azure con una suscripción activa. Si no tiene una cuenta de Azure, puede crearla gratis.
- Una cuenta de GitHub. También puede obtener una gratis.
- Conocimientos de PHP con el desarrollo de Laravel.
- (Opcional) Para probar GitHub Copilot, una cuenta de GitHub Copilot. Hay disponible una evaluación gratuita de 30 días.
1 - Ejecución del ejemplo
En primer lugar, configurará una aplicación controlada por datos de ejemplo como punto inicial. Para lograr mayor comodidad, el repositorio de ejemplo incluye una configuración de contenedor de desarrollo. El contenedor de desarrollo tiene todo lo que necesita para desarrollar una aplicación, incluida la base de datos, la caché y todas las variables de entorno necesarias para la aplicación de ejemplo. El contenedor de desarrollo puede ejecutarse en un codespace de GitHub, lo que significa que puede ejecutar el ejemplo en cualquier equipo con un explorador web.
Paso 1: En una nueva ventana del navegador:
- Inicie sesión en su cuenta de GitHub.
- Vaya a https://github.com/Azure-Samples/laravel-tasks/fork.
- Seleccione Crear bifurcación.
Paso 2: en la bifurcación de GitHub:
- Seleccione Código>Crear codespace en la rama principal.
El codespace tarda unos minutos en configurarse. Además, el archivo .env proporcionado ya contiene una variable ficticia
APP_KEY
que Laravel debe ejecutar localmente.
Paso 3: En el terminal de codespace:
- Ejecute
composer install
. - Ejecute las migraciones de la base de datos con
php artisan migrate
. - Ejecute la aplicación con
php artisan serve
. - Cuando vea la notificación
Your application running on port 80 is available.
, seleccione Abrir en explorador. Debería ver la aplicación de ejemplo en una nueva pestaña del explorador. Para detener la aplicación, escribaCtrl
+C
.
¿Tiene problemas? Consulte la sección Solución de problemas.
2- Creación de App Service, base de datos y caché
En este paso, creará los recursos de Azure. Los pasos que se usan en este tutorial crean un conjunto de recursos seguros de forma predeterminada que incluyen App Service, Azure Database for MySQL y Azure Cache for Redis. En el proceso de creación, especifique lo siguiente:
- El Nombre de la aplicación web. Se usa como parte del nombre DNS de la aplicación.
- La región para ejecutar la aplicación físicamente en el mundo. También se usa como parte del nombre DNS de la aplicación.
- La pila en tiempo de ejecución para la aplicación. Es donde se selecciona la versión de PHP que se va a usar para la aplicación.
- El plan de hospedaje para la aplicación. Es el plan de tarifa que incluye el conjunto de características y la capacidad de escalado de la aplicación.
- El Grupo de recursos de la aplicación. Un grupo de recursos permite agrupar (en un contenedor lógico) todos los recursos de Azure necesarios para la aplicación.
Inicie sesión en Azure Portal y siga estos pasos para crear los recursos de Azure App Service.
Paso 1: En el portal Azure:
- En la barra de búsqueda superior, escriba app service.
- Seleccione el elemento con la etiqueta App Service en el encabezado Servicios.
- Seleccione Crear>Aplicación web. También puede ir directamente al asistente de creación.
Paso 2: En la página Crear aplicación web, rellene el formulario de la siguiente forma.
- Nombre: msdocs-laravel-mysql-XYZ. Se generará un grupo de recursos denominado msdocs-laravel-mysql-XYZ_group .
- Pila en tiempo de ejecución: PHP 8.4.
- Sistema operativo: Linux.
- Región: cualquier región de Azure cercana a usted.
- Plan de Linux: cree nuevo y use el nombre msdocs-laravel-mysql-XYZ.
- Plan de precios: Básico. Cuando esté listo, puede escalar verticalmente a un plan de tarifa distinto.
Paso 3:
- Seleccione la pestaña Base de datos .
- Seleccione Crear una base de datos.
- En Motor, seleccione MySQL - Servidor flexible.
- Seleccione Crear Azure Cache para Redis.
- En Nombre (en Caché), escriba un nombre para la memoria caché.
- En SKU, seleccione Basic (Básico).
Paso 4:
- Seleccione la pestaña Implementación .
- Habilite la implementación continua.
- En Organización, seleccione el alias de GitHub.
- En Repositorio, seleccione laravel-tasks.
- En Rama, seleccione main.
- Asegúrese de que la autenticación básica está deshabilitada.
- Seleccione Revisar + crear.
- Una vez completada la validación, seleccione Crear.
Paso 5: La implementación tarda unos minutos en completarse. Una vez completada la implementación, seleccione el botón Ir al recurso. Se le dirigirá directamente a la aplicación App Service, pero se crean los siguientes recursos:
- Grupo de recursos: contenedor para todos los recursos creados.
- Plan de App Service: define los recursos de proceso de App Service. Se crea un plan de Linux en el nivel Básico.
- App Service: representa su aplicación y se ejecuta en el plan de App Service.
- Red virtual: se integra con la aplicación App Service y aísla el tráfico de back-end.
- Puntos de conexión privados: acceda a puntos de conexión para el servidor de bases de datos y Redis Cache en la red virtual.
- Interfaces de red: representa direcciones IP privadas, una para cada uno de los puntos de conexión privados.
- Servidor Flexible de Azure Database for MySQL: accesible solo desde detrás del punto de conexión privado. Una base de datos y un usuario se crean automáticamente en el servidor.
- Azure Cache for Redis: accesible solo desde detrás de su punto de conexión privado.
- Zonas DNS privado: habilitar la resolución DNS del servidor de base de datos y la caché de Redis en la red virtual.
3- Protección de secretos de conexión
El Asistente para la creación generó automáticamente las variables de conectividad como valores de configuración de la aplicación. Sin embargo, el procedimiento recomendado de seguridad es mantener completamente los secretos fuera de App Service. Moverá los secretos a un almacén de claves y cambiará la configuración de la aplicación a referencias de Key Vault con la ayuda de Service Connectors.
Paso 1: Recuperación de la cadena de conexión existente
- En el menú de la izquierda de la página App Service, seleccione Configuración > Variables de entorno.
- Seleccione Cadenas de conexión.
- Seleccione AZURE_MYSQL_CONNECTIONSTRING.
- En Agregar o editar configuración de la aplicación, en el campo Valor , copie el nombre de usuario y la contraseña para usarlos más adelante. La cadena de conexión le permite conectarse a la base de datos MySQL protegida detrás de puntos de conexión privados. Sin embargo, el secreto se guarda directamente en la aplicación de App Service, que no es lo mejor. Cambiará esto.
Paso 2: Creación de un almacén de claves para la administración segura de secretos
- En la barra de búsqueda superior, escriba "almacén de claves" y, a continuación, seleccione Marketplace>Key Vault.
- En Grupo de recursos, seleccione msdocs-laravel-mysql-XYZ_group.
- En Nombre del almacén de claves, escriba un nombre que consta de solo letras y números.
- En Región, establézcalo en la misma ubicación que el grupo de recursos.
Paso 3: Asegurar la bóveda de claves con un punto de conexión privado
- Seleccione la pestaña Redes.
- Anule la selección de Habilitar acceso público.
- Seleccione Crear un punto de conexión privado.
- En Grupo de recursos, seleccione msdocs-laravel-mysql-XYZ_group.
- En el cuadro de diálogo, en Ubicación, seleccione la misma ubicación que la aplicación de App Service.
- En Nombre, escriba msdocs-laravel-mysql-XYZVaultEndpoint.
- En Red virtual, seleccione la red virtual en el grupo msdocs-laravel-mysql-XYZ_group .
- En Subred, seleccione la subred compatible disponible. El Asistente para aplicaciones web lo creó para su comodidad.
- Seleccione Aceptar.
- Seleccione Revisar y crear y, luego, Crear. Espere a que finalice la implementación del almacén de claves. Debería ver "La implementación está completa".
Paso 4: Creación del conector mySQL
- En la barra de búsqueda superior, escriba msdocs-laravel-mysql y, a continuación, seleccione el recurso de App Service denominado msdocs-laravel-mysql-XYZ.
- En la página App Service, en el menú de la izquierda, seleccione Configuración > Conector de servicio.
- Selecciona Crear.
- En Tipo de servicio, seleccione DB for MySQL flexible server (Base de datos para servidor flexible de MySQL).
- En Servidor flexible de MySQL, seleccione el servidor (por ejemplo, msdocs-laravel-mysql-235-server).
- En Base de datos MySQL, seleccione la base de datos (por ejemplo, msdocs-laravel-mysql-235-database).
Paso 5: Configuración de la autenticación para el conector mySQL
- Seleccione la pestaña Autenticación.
- Seleccione Cadena de conexión.
- En Contraseña, pegue la contraseña que copió anteriormente.
- Seleccione Almacenar secreto en Key Vault.
- En Conexión de Key Vault, seleccione Crear nuevo. Se abre un cuadro de diálogo Crear conexión encima del cuadro de diálogo de edición.
Paso 6: Establecimiento de la conexión de Key Vault
- En el cuadro de diálogo Crear conexión para la conexión de Key Vault, en Key Vault, seleccione el almacén de claves que ha creado antes.
- Seleccione Revisar + crear.
- Cuando se complete la validación, seleccione Crear.
Paso 6: Finalización de la configuración del conector mySQL
- Vuelve al cuadro de diálogo del conector de MySQL. En la pestaña Autenticación, espere a que se cree el conector del almacén de claves. Cuando haya terminado, la lista desplegable Conexión de Key Vault la selecciona automáticamente.
- Seleccione Revisar + crear.
- Selecciona Crear. Espere hasta que aparezca la Actualización correcta notificación.
Paso 7: Configuración del conector de Redis para usar secretos de Key Vault
- En la página Conectores de servicio, active la casilla situada junto al conector de Cache for Redis y, a continuación, seleccione Editar.
- Seleccione la pestaña Autenticación.
- Seleccione Almacenar secreto en Key Vault.
- En Conexión con Key Vault, seleccione el almacén de claves que creó.
- Seleccione Siguiente: Redes.
- Seleccione Configurar reglas de firewall para habilitar el acceso al servicio de destino. El Asistente para la creación de aplicaciones ya ha protegido la base de datos SQL con un punto de conexión privado.
- Seleccione Guardar. Espere hasta que aparezca la Actualización correcta notificación.
Paso 8: Comprobar la integración de Key Vault
- En el menú de la izquierda, vuelva a seleccionar Configuración > Variables de entorno.
- Junto a AZURE_MYSQL_PASSWORD, seleccione Mostrar valor. El valor debe ser
@Microsoft.KeyVault(...)
, lo que significa que es una referencia del almacén de claves porque el secreto ahora se administra en el almacén de claves. - Para comprobar la cadena de conexión de Redis, seleccione Mostrar valor junto a AZURE_REDIS_CONNECTIONSTRING.
En resumen, el proceso para proteger los secretos de conexión implica:
- Recuperar los secretos de conexión de las variables de entorno de la aplicación de App Service.
- Creación de un almacén de claves.
- Crear una conexión de Key Vault con la identidad administrada asignada por el sistema.
- Actualizar los conectores de servicio para almacenar los secretos en el almacén de claves.
¿Tiene problemas? Consulte la sección Solución de problemas.
4- Configuración de variables laravel
Paso 1: Cree CACHE_DRIVER
como una configuración de aplicación.
- En la pestaña Configuración de la aplicación, seleccione + Agregar.
- En el campo Nombre, escriba CACHE_DRIVER.
- En el campo Valor, escriba redis.
- Seleccione Aplicar y, a continuación, Vuelva a aplicar y, a continuación, Confirme.
Paso 2: Con los mismos pasos del paso 1, cree la siguiente configuración de la aplicación:
- MYSQL_ATTR_SSL_CA: use /home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem como valor. Esta configuración de la aplicación apunta a la ruta de acceso del certificado TLS/SSL que necesita para acceder al servidor MySQL. Está incluido en el repositorio de ejemplo para mayor comodidad.
- LOG_CHANNEL: use stderr como valor. Esta configuración indica a Laravel que canalice los registros a stderr, lo que hace que esté disponible para los registros de App Service.
- APP_DEBUG: Usa true como valor. Es una variable de depuración Laravel que habilita páginas en modo de depuración.
- APP_KEY: Usa base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= como el valor. Es una variable de cifrado de Laravel.
Importante
Aquí se usa el valor APP_KEY
para mayor comodidad. En escenarios de producción, se debe generar específicamente para la implementación usando php artisan key:generate --show
en la línea de comandos.
Lo ideal es que la configuración de la aplicación APP_KEY
se configure también como una referencia del almacén de claves, que es un proceso de varios pasos. Para obtener más información, consulte ¿Cómo cambio la configuración de la aplicación de APP_KEY a una referencia de Key Vault?
5- Implementación de código de ejemplo
En este paso, configurará la implementación de GitHub mediante Acciones de GitHub. Es solo una de las muchas maneras de implementar en App Service, pero también una excelente manera de disponer de integración continua en el proceso de implementación. De forma predeterminada, cada uno de los git push
al repositorio de GitHub inicia la acción de compilación e implementación.
Paso 1: De nuevo en el espacio de código de GitHub de la bifurcación de ejemplo, ejecute git pull origin main
.
Esto extrae el archivo de flujo de trabajo recién confirmado en el codespace.
Paso 2 (opción 1: con GitHub Copilot):
- Inicie una nueva sesión de chat al seleccionar la vista Chat y, después, seleccionar +.
- Pregunte: "@workspace ¿Cómo se conecta la aplicación a la base de datos y redis?". Copilot puede darle una explicación sobre cómo se configuran los valores en config/database.php.
- Pregunte: "@workspace En modo de producción, mi aplicación se ejecuta en una aplicación web de App Service, que usa Azure Service Connector para conectarse a un servidor flexible de MySQL. ¿Cuáles son los nombres de las variables de entorno que necesito usar?" Copilot puede proporcionarle una sugerencia de código similar a la de la opción 2: sin los pasos de GitHub Copilot que se indican a continuación e incluso indicarle que realice el cambio en el archivo config/database.php .
- Abra config/database.php en el explorador y agregue la sugerencia de código.
- Pregunte: "@workspace Mi aplicación App Service también usa Azure Service Connector para conectarse a una instancia de Cache for Redis mediante el tipo de cliente Django. ¿Cuáles son los nombres de las variables de entorno que necesito usar?*" Copilot puede proporcionarle una sugerencia de código similar a la de la opción 2: sin los pasos de GitHub Copilot que se indican a continuación e incluso indicarle que realice el cambio en el archivo config/database.php . Si se le solicita, inicie sesión en GitHub Copilot para Azure para obtener respuestas más precisas.
- Agregue la sugerencia de código. GitHub Copilot no proporciona la misma respuesta cada vez y no siempre esta es correcta. Es posible que tenga que formular más preguntas para ajustar su respuesta. Para obtener sugerencias, consulte ¿Qué puedo hacer con GitHub Copilot en mi espacio de código?.
Paso 2 (opción 2: sin GitHub Copilot):
- Abra config/database.php en el explorador. Busque la sección
mysql
y realice los cambios siguientes: - Reemplace
DB_HOST
(línea 49) porAZURE_MYSQL_HOST
. - Reemplace
DB_DATABASE
(línea 51) porAZURE_MYSQL_DBNAME
. - Reemplace
DB_USERNAME
(línea 52) porAZURE_MYSQL_USERNAME
. - Reemplace
DB_PASSWORD
(línea 53) porAZURE_MYSQL_PASSWORD
. - Reemplace
DB_PORT
(línea 50) porAZURE_MYSQL_PORT
. - Desplácese hasta la sección Redis
cache
y realice los cambios siguientes: - Reemplace
REDIS_HOST
(línea 142) porAZURE_REDIS_HOST
. - Reemplace
REDIS_PASSWORD
(línea 144) porAZURE_REDIS_PASSWORD
. - Reemplace
REDIS_PORT
(línea 145) porAZURE_REDIS_PORT
. - Reemplace
REDIS_CACHE_DB
(línea 146) porAZURE_REDIS_DATABASE
. - En la misma sección, agregue una línea con
'scheme' => 'tls',
. Esta configuración indica a Laravel que use el cifrado para conectarse a Redis.
Paso 3:
- Seleccione la extensión Control de código fuente.
- En el cuadro de texto, escriba un mensaje de confirmación, por ejemplo,
Configure Azure database and cache connections
. O bien, seleccioney deje que GitHub Copilot genere un mensaje de confirmación de manera automática.
- Seleccione Confirmar y, a continuación, confirme con Sí.
- Seleccione Sincronización de cambios 1 y confirme con Aceptar.
Paso 4: De nuevo en la página Centro de implementación de Azure Portal:
- Seleccione la pestaña Registros y, a continuación, seleccione Actualizar para ver la nueva ejecución de implementación.
- En el elemento de registro de la ejecución de implementación, seleccione la entrada Registros de compilación/implementación con la marca de tiempo más reciente.
Paso 5: Se le ha llevado al repositorio de GitHub y verá que la acción de GitHub se está ejecutando. El archivo de flujo de trabajo define dos fases independientes: compilación e implementación. Espere a que la ejecución de GitHub muestre un estado de Éxito. Tarda unos 10 minutos.
¿Tiene problemas? Consulte la sección Solución de problemas.
6- Generar esquema de base de datos
El asistente de creación coloca el servidor de base de datos MySQL detrás de un punto de conexión privado, por lo que solo estará accesible desde la red virtual. Dado que la aplicación App Service ya está integrada en la red virtual, la forma más fácil de migrar la base de datos es hacerlo directamente desde el contenedor de App Service.
Paso 1: De vuelta en la página App Service, en el menú de la izquierda,
- Seleccione Herramientas de desarrollo>SSH.
- Haga clic en Ir.
Paso 2: En el terminal SSH:
- Ejecute
cd /home/site/wwwroot
. Aquí están todos los archivos implementados. - Ejecute
php artisan migrate --force
. Si se realiza correctamente, App Service se conecta correctamente a la base de datos de MySQL.
Sugerencia
En la sesión SSH, solo los cambios en los archivos de /home
pueden persistir más allá de los reinicios de la aplicación. Los cambios efectuados fuera de /home
no se conservan.
7 - Cambiar la raíz del sitio
El ciclo de vida de la aplicación de Laravel comienza en su lugar en el directorio public. El contenedor de PHP predeterminado para App Service usa Nginx, que se inicia en el directorio raíz de la aplicación. Para cambiar la raíz del sitio, debe cambiar el archivo de configuración de Nginx en el contenedor de PHP (/etc/nginx/sites-available/default). Para su comodidad, el repositorio de ejemplo ya contiene un archivo de configuración personalizado denominado default. Como hemos señalado antes, no conviene reemplazar este archivo mediante el shell de SSH, ya que el cambio está fuera de /home
y se perderá después de reiniciar la aplicación.
Paso 1:
- En el menú de la izquierda, seleccione Configuración.
- Seleccione la pestaña Configuración general.
Paso 2: En la pestaña Configuración general:
- En el cuadro Comando de inicio, escriba el siguiente comando: cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload.
- Seleccione Guardar y, después, Continuar. El comando reemplaza el archivo de configuración de Nginx en el contenedor de PHP y reinicia Nginx. Esta configuración garantiza que este mismo cambio se va a realizar en el contenedor cada vez que se inicie.
8 - Navegar a la aplicación
Paso 1. En la página App Service:
- En el menú de la izquierda, seleccione Información general.
- Seleccione el dominio predeterminado de la aplicación.
Paso 2: Añadir algunas tareas a la lista. Felicidades, ya está ejecutando una aplicación PHP segura orientada a datos en Azure App Service.
Sugerencia
La aplicación de ejemplo implementa el patrón cache-aside. Cuando recargue la página después de hacer cambios en los datos, el Tiempo de respuesta en la página web muestra un tiempo mucho más rápido porque está cargando los datos desde la caché en lugar de la base de datos.
9- Transmisión de registros de diagnóstico
Azure App Service captura todos los mensajes registrados en la consola para ayudarle a diagnosticar problemas de la aplicación. La aplicación de ejemplo genera mensajes de registro de consola en cada uno de sus puntos de conexión para demostrar esta capacidad. De forma predeterminada, la funcionalidad de registro de Laravel (por ejemplo, Log::info()
) se genera en un archivo local. La configuración de LOG_CHANNEL
de la aplicación anterior hace que las entradas de registro sean accesibles desde el flujo de registro de App Service.
Paso 1. En la página App Service:
- En el menú de la izquierda, seleccione Registros de App Service.
- En Registro de aplicaciones, seleccione Sistema de archivos.
Paso 2: En el menú de la izquierda, seleccione Flujo de registro. Verás los registros de tu aplicación, incluidos los registros de plataforma y los registros desde dentro del contenedor.
Limpieza de recursos
Cuando acabe, puede eliminar todos los recursos de la suscripción de Azure mediante la eliminación del grupo de recursos.
Paso 1:En la barra de búsqueda de la parte superior de Azure Portal:
- Escriba el nombre del grupo de recursos.
- Seleccione el grupo de recursos.
Paso 2: En la página del grupo de recursos, seleccione Borrar grupo de recursos.
Paso 3:
- Escriba el nombre del grupo de recursos para confirmar la eliminación.
- Seleccione Eliminar.
2. Creación de recursos de Azure e implementación de una aplicación de ejemplo
En este paso, creará los recursos de Azure e implementará una aplicación de ejemplo en App Service en Linux. Los pasos que se usan en este tutorial crean un conjunto de recursos seguros de manera predeterminada que incluyen App Service y Azure DB for MySQL.
El espacio de código de GitHub ya tiene la CLI para desarrolladores de Azure (AZD).
Genere una clave de cifrado Laravel con
php artisan key:generate --show
:php artisan key:generate --show
Inicie sesión en Azure mediante la ejecución del comando
azd auth login
y siga la solicitud:azd auth login
Cree los recursos de Azure necesarios e implemente el código de la aplicación con el comando
azd up
. Siga la solicitud para seleccionar la suscripción y la ubicación deseadas para los recursos de Azure.azd up
Cuando se le solicite, proporcione las siguientes respuestas:
Pregunta Respuesta Escribir un nuevo nombre de entorno Escriba un nombre único. La plantilla de AZD usa este nombre como parte del nombre DNS de la aplicación web en Azure ( <app-name>-<hash>.azurewebsites.net
). Se permiten caracteres alfanuméricos y guiones.Selección de una suscripción de Azure que se va a usar Seleccione su suscripción. Selección de una ubicación de Azure que se va a usar Seleccione una ubicación. Escriba un valor para el parámetro protegido de infraestructura "appKey". Use la salida de php artisan key:generate --show
aquí. La plantilla de AZD crea un secreto de Key Vault para ello que puedas usar en la aplicación.Escriba un valor para el parámetro protegido de infraestructura "databasePassword". Contraseña de base de datos para MySQL. Debe tener al menos 8 caracteres de longitud y contener letras mayúsculas, letras minúsculas, números y caracteres especiales. El comando
azd up
tarda unos 15 minutos en completarse (la Redis Cache tarda más tiempo). También compila e implementa el código de la aplicación, pero modifica el código más adelante para trabajar con App Service. Mientras se ejecuta, el comando proporciona mensajes sobre el proceso de aprovisionamiento e implementación, incluido un vínculo a la implementación en Azure. Cuando termina, el comando también muestra un vínculo a la aplicación implementada.Esta plantilla de AZD contiene archivos (azure.yaml y el directorio infra) que generarán una arquitectura segura de manera predeterminada con los siguientes recursos de Azure:
- Grupo de recursos: contenedor para todos los recursos creados.
- Plan de App Service: define los recursos de proceso de App Service. Se crea un plan de Linux en el nivel B1.
- App Service: representa su aplicación y se ejecuta en el plan de App Service.
- Red virtual: se integra con la aplicación App Service y aísla el tráfico de back-end.
- Servidor flexible de Azure Database for MySQL: accesible solo desde la red virtual mediante la integración de la zona DNS. Se crea una base de datos automáticamente en el servidor.
- Azure Cache for Redis: accesible solo desde la red virtual.
- Puntos de conexión privados: Puntos de conexión de acceso para la bóveda de claves y la caché de Redis en la red virtual.
- Zonas DNS privadas: Habilita la resolución DNS de la bóveda de claves, el servidor de base de datos y la caché de Redis en la red virtual.
- Área de trabajo de Log Analytics: actúa como contenedor de destino para que su aplicación envíe sus registros, donde también puede consultar los registros.
- Almacén de claves: se usa para mantener la contraseña de la base de datos igual al volver a implementar con AZD.
¿Tiene problemas? Consulte la sección Solución de problemas.
3. Uso de cadenas de conexión de Azure en el código de aplicación
La plantilla de AZD que usa ya ha generado las variables de conectividad como valores de la aplicación y las envía al terminal para mayor comodidad. La configuración de la aplicación es una forma de mantener los secretos de conexión fuera del repositorio de código.
En la salida de AZD, busque la configuración de la aplicación que comienza por
AZURE_MYSQL_
yAZURE_REDIS_
. Solo se muestran los nombres de configuración. Tienen este aspecto en la salida de 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
La configuración a partir de
AZURE_MYSQL_
son variables de conexión para la base de datos MySQL y la configuración que comienza porAZURE_REDIS_
son para la caché de Redis. Necesitas usarlos en tu código más adelante. Para mayor comodidad, la plantilla de AZD muestra el vínculo directo a la página de configuración de la aplicación en Azure Portal.En el explorador, abra config/database.php. Este es el archivo de configuración de las conexiones de base de datos y caché de Redis.
Busque la parte que define la
mysql
conexión (líneas 46-64) y reemplaceDB_HOST
,DB_PORT
,DB_DATABASE
,DB_USERNAME
, yDB_PASSWORD
por los ajustes de aplicaciónAZURE_MYSQL_
de la salida de AZD. Lamysql
conexión debe ser similar al código siguiente.'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'), ]) : [], ],
Para obtener más información sobre la configuración de la base de datos en Laravel, consulte la documentación de Laravel.
Busque la parte que define la conexión de caché de Redis (líneas 140-147) y reemplace
REDIS_HOST
,REDIS_PASSWORD
,REDIS_PORT
yREDIS_CACHE_DB
con la configuración de la aplicaciónAzure_REDIS_
de la salida de AZD. Además, agregue'scheme' => 'tls',
a la conexión. La conexión de caché debe ser similar al código siguiente:'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'), ],
Para más información sobre la configuración de caché de Redis en Laravel, consulte la documentación de Laravel.
Nota:
Recuerde que los cambios aún no están implementados. Vas a implementarlos al final del paso siguiente.
4. Configuración de la configuración de Laravel en la aplicación web
En el explorador, abra infra/resources.bicep. Este es el archivo de Bicep que define los recursos de Azure creados.
Busque la parte que define la configuración de la aplicación (líneas 510-514) y quite la marca de comentario. Estas opciones de configuración de la aplicación son:
Configuración Descripción CACHE_DRIVER
Indica a Laravel que use Redis como caché (consulte la documentación de Laravel). MYSQL_ATTR_SSL_CA
Necesario para abrir una conexión TLS a MySQL en Azure. El archivo de certificado se incluye en el repositorio de ejemplo para mayor comodidad. La conexión mysql usa esta variable en config/database.php LOG_CHANNEL
Indica a Laravel que canalice los registros a stderr
, lo que hace que esté disponible para los registros de App Service (consulte la documentación de Laravel).APP_DEBUG
Habilite las páginas del modo de depuración en Laravel (consulte la documentación de Laravel). APP_KEY
Variable de cifrado Laravel. La plantilla de AZD ya ha creado un secreto de Key Vault (líneas 212-217), así que lo accedes con una referencia de Key Vault. En infra/resources.bicep, busque la definición de recurso para la aplicación de App Service y quite la marca de comentario de línea 315:
appCommandLine: 'cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload'
El ciclo de vida de la aplicación laravel comienza en el directorio /public en lugar de en la raíz de la aplicación. El contenedor PHP predeterminado para App Service usa Nginx, que se inicia en la raíz de la aplicación. Para cambiar la raíz del sitio, debe cambiar el archivo de configuración de Nginx en el contenedor de PHP (/etc/nginx/sites-available/default). Para mayor comodidad, el repositorio de ejemplo contiene un archivo de configuración de reemplazo denominado predeterminado, que indica a Nginx que busque en el directorio /public . Este comando personalizado en
appCommandLine
se ejecuta cada vez que la aplicación comienza a aplicar el reemplazo de archivos cada vez que el contenedor de Linux se vuelve a cargar desde un estado limpio.De vuelta en el terminal de Codespace, ejecute
azd up
otra vez.azd up
Sugerencia
azd up
ejecuta azd package
, azd provision
y azd deploy
juntos, y tiene sentido porque está realizando cambios en la infraestructura y en la aplicación. Para realizar cambios en la infraestructura solo, ejecute azd provision
. Para implementar solo los cambios en el código de la aplicación, ejecute azd deploy
.
¿Tiene problemas? Consulte la sección Solución de problemas.
5. Generar esquema de base de datos
Con la base de datos MySQL protegida por la red virtual, la manera más fácil de ejecutar migraciones de bases de datos de Laravel se encuentra en una sesión SSH con el contenedor de Linux en App Service.
En la salida de AZD, busque la dirección URL de la sesión SSH y vaya a ella en el explorador. Así es como se ve en el resultado:
Open SSH session to App Service container at: <URL>
En la sesión SSH, ejecute migraciones de base de datos desde el directorio /home/site/wwwroot :
cd /home/site/wwwroot php artisan migrate --force
Si se realiza correctamente, App Service se conecta a la base de datos.
Nota:
Cuando la aplicación se reinicie, solo persisten los cambios realizados en los archivos ubicados en /home
.
¿Tiene problemas? Consulte la sección Solución de problemas.
6. Navegación hasta la aplicación
En la salida de AZD, busque la dirección URL de la aplicación y vaya a ella en el explorador. La dirección URL tiene este aspecto en la salida de AZD:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <URL>
Agregue algunas tareas a la lista.
Enhorabuena, ya está ejecutando una aplicación web en Azure App Service, con conectividad protegida a Azure DB for MySQL.
¿Tiene problemas? Consulte la sección Solución de problemas.
7. Transmisión de registros de diagnóstico
Azure App Service captura todos los mensajes registrados en la consola para ayudarle a diagnosticar problemas de la aplicación. Para mayor comodidad, la plantilla de AZD ya ha habilitado el registro en el sistema de archivos local y está enviando los registros a un área de trabajo de Log Analytics.
La aplicación de ejemplo genera mensajes de registro de consola en cada uno de sus puntos de conexión para demostrar esta capacidad. De forma predeterminada, la funcionalidad de registro de Laravel (por ejemplo, Log::info()
) se genera en un archivo local. La configuración de LOG_CHANNEL
de la aplicación anterior hace que las entradas de registro sean accesibles desde el flujo de registro de App Service.
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]);
});
En la salida de AZD, busque el vínculo para transmitir registros de App Service y vaya a él en el explorador. El vínculo tiene este aspecto en la salida de AZD:
Stream App Service logs at: <URL>
¿Tiene problemas? Consulte la sección Solución de problemas.
8. Limpieza de recursos
Para eliminar todos los recursos de Azure en el entorno de implementación actual, ejecute azd down
y siga las indicaciones.
azd down
Solución de problemas
Obtengo el error durante las migraciones de base de datos. php_network_getaddresses: getaddrinfo for mysqldb failed: No address associated with hostname...
Indica que las variables de conexión de MySQL no están configuradas correctamente. Compruebe que la configuración de la AZURE_MYSQL_
aplicación está configurada correctamente en 3. Use cadenas de conexión de Azure en el código de la aplicación.
Obtengo una página en blanco en el explorador.
Indica que App Service no encuentra los archivos de inicio de PHP en /public. Siga los pasos descritos en 4. Configure las opciones de Laravel en la aplicación web.
Obtengo una página de depuración en el explorador que dice Unsupported cipher or incorrect key length.
Indica que la APP_KEY
configuración está establecida en una clave no válida. Al ejecutar azd up
, asegúrese de establecer appKey
en la salida de php artisan key:generate --show
.
Obtengo una página de depuración en el explorador que dice Uncaught Error: Class "Illuminate\..." not found.
Este error y errores similares indican que no se ejecutó composer install
antes azd up
o que los paquetes del directorio /vendor están obsoletos. Ejecute composer install
y azd deploy
de nuevo.
Obtengo una página de depuración en el explorador que dice php_network_getaddresses: getaddrinfo for redishost failed: Name or service not known.
Indica que las variables de conexión de Redis no están configuradas correctamente. Compruebe que la configuración de la AZURE_REDIS_
aplicación está configurada correctamente en 3. Use cadenas de conexión de Azure en el código de la aplicación.
Obtengo una página de depuración en el explorador que dice SQLSTATE[42S02]: Base table or view not found: 1146 Table 'XXXX-XXXXXXXXX-mysql-database.tasks' doesn't exist
Significa que no ha ejecutado migraciones de base de datos o que las migraciones de base de datos no se realizaron correctamente. Siga los pasos descritos en 5. Generar esquema de base de datos.
Preguntas más frecuentes
- ¿Cuánto cuesta esta configuración?
- ¿Cómo me conecto a la base de datos MySQL protegida tras la red virtual con otras herramientas?
- ¿Cómo cambio la configuración de la aplicación APP_KEY a una referencia de Key Vault?
- ¿Cómo funciona el desarrollo de aplicaciones locales con Acciones de GitHub?
- ¿Por qué la implementación de Acciones de GitHub es tan lenta?
- No tengo permisos para crear una identidad asignada por el usuario
- ¿Qué puedo hacer con GitHub Copilot en mi codespace?
- ¿Cuánto cuesta esta configuración?
- ¿Cómo me conecto a la base de datos MySQL protegida tras la red virtual con otras herramientas?
- ¿Cómo funciona el desarrollo de aplicaciones locales con Acciones de GitHub?
- ¿Por qué la implementación de Acciones de GitHub es tan lenta?
- No tengo permisos para crear una identidad asignada por el usuario
- ¿Qué puedo hacer con GitHub Copilot en mi codespace?
¿Cuánto cuesta esta configuración?
Los precios por los recursos creados son los siguientes:
- El plan de App Service se crea en el nivel Básico y puede escalar o reducirse verticalmente. Consulte Precios de App Service.
- El servidor flexible de MySQL se crea en el nivel B1ms y puede escalar o reducirse verticalmente. Con una cuenta gratuita de Azure, el nivel B1ms es gratuito durante 12 meses, hasta los límites mensuales que se hayan fijado. Consulte Precios de Azure Database for MySQL.
- El Azure Cache for Redis se crea en el nivel Básico con el tamaño mínimo de caché. Hay un pequeño costo asociado a este nivel. Puede escalar verticalmente a niveles de rendimiento superiores para una mayor disponibilidad, agrupación en clústeres y otras características. Consulte Precios de Azure Cache for Redis.
- La red virtual no incurre en cargo alguno, a menos que establezcas alguna funcionalidad extra, como, por ejemplo, el emparejamiento de red. Vea Precios de Azure Virtual Network.
- La zona DNS privada conlleva un pequeño cargo. Vea Precios de Azure DNS.
¿Cómo me conecto a la base de datos MySQL protegida tras la red virtual con otras herramientas?
- Para tener un acceso básico desde una herramienta de línea de comandos, puede ejecutar
mysql
desde el terminal de SSH de la aplicación. - Para conectarse desde una herramienta de escritorio como MySQL Workbench, la máquina debe estar en la red virtual. Por ejemplo, podría ser una máquina virtual de Azure conectada a una de las subredes, o una máquina de una red local que tenga una conexión VPN de sitio a sitio a la red virtual de Azure.
- También puede integrar Azure Cloud Shell en la red virtual.
¿Cómo cambio la configuración de la aplicación APP_KEY a una referencia de Key Vault?
En los pasos del portal 4 - Configuración de variables de Laravel, puede cambiar APP_KEY
a una referencia de Key Vault mediante la ejecución de los siguientes comandos de la CLI de Azure en el Codespace de 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)"
También puede hacer lo mismo en el portal. Para obtener más información, consulte:
¿Cómo funciona el desarrollo de aplicaciones locales con Acciones de GitHub?
Tome como ejemplo el archivo de flujo de trabajo generado automáticamente de App Service: cada git push
inicia una nueva ejecución de compilación e implementación. Desde un clon local del repositorio de GitHub, haces las actualizaciones deseadas y las insertas en GitHub. Por ejemplo:
git add .
git commit -m "<some-message>"
git push origin main
¿Por qué la implementación de Acciones de GitHub es tan lenta?
El archivo de flujo de trabajo generado automáticamente de App Service define un proceso de compilación e implementación posterior; esto es, se ejecutan dos trabajos. Dado que cada trabajo se ejecuta en su propio entorno limpio, el archivo de flujo de trabajo garantiza que el trabajo deploy
va a tener acceso a los archivos del trabajo build
:
- Al final del trabajo
build
, cargue los archivos como artefactos. - Descargue los artefactos al inicio del trabajo
deploy
.
Casi todo el tiempo que tarda el proceso de dos trabajos se dedica a cargar y descargar artefactos. Si lo desea, puede simplificar el archivo de flujo de trabajo combinando los dos trabajos en uno, con lo cual no será necesario realizar los pasos de carga y descarga.
No tengo permisos para crear una identidad asignada por el usuario
Consulte Configurar la implementación de GitHub Actions desde el Centro de implementación.
¿Qué puedo hacer con GitHub Copilot en mi codespace?
Es posible que observe que la vista de chat de GitHub Copilot ya estaba allí cuando creó el codespace. Para mayor comodidad, incluimos la extensión de chat de GitHub Copilot en la definición del contenedor (consulte .devcontainer/devcontainer.json). Sin embargo, necesita una cuenta de GitHub Copilot (versión de prueba gratuita de 30 días disponible).
Algunas sugerencias para usted al hablar con GitHub Copilot:
- En una sola sesión de chat, las preguntas y respuestas se basan entre sí y puede ajustar sus preguntas para ajustar la respuesta que obtenga.
- De forma predeterminada, GitHub Copilot no tiene acceso a ningún archivo del repositorio. Para formular preguntas sobre un archivo, abra primero el archivo en el editor.
- Para permitir que GitHub Copilot tenga acceso a todos los archivos del repositorio al preparar sus respuestas, comience la pregunta con
@workspace
. Para obtener más información, consulte Use the @workspace agent. - Durante la sesión de chat, GitHub Copilot puede sugerir cambios y (con
@workspace
) incluso indicar dónde realizarlos, pero no está permitido que haga los cambios por ti. Es necesario agregar los cambios sugeridos y probarlos.
Pasos siguientes
Pase al tutorial siguiente para aprender a proteger la aplicación con un dominio personalizado y un certificado.
O bien, eche un vistazo a otros recursos:
Configure PHP app (Configuración de una aplicación de PHP)