Tutorial: Implementación de una aplicación PHP, MySQL y Redis en Azure App Service

En este tutorial se explica cómo crear una aplicación PHP segura en Azure App Service que está conectada a una base de datos MySQL (mediante un 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.

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

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Aplicación de ejemplo

Para seguir este tutorial, clone o descargue la aplicación de ejemplo de Laravel desde el repositorio:

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

Si desea ejecutar la aplicación localmente, haga lo siguiente:

  • En .env, defina la configuración de base de datos (como DB_DATABASE, DB_USERNAME y DB_PASSWORD) usando la configuración de la base de datos MySQL local. Para ejecutar este ejemplo, se necesita un servidor MySQL local.

  • En la raíz del repositorio, inicie Laravel con los siguientes comandos:

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

1: Creación de los recursos de App Service y MySQL

En este paso, creará los recursos de Azure. Con los pasos de este tutorial se crea una configuración de App Service y Azure Database for MySQL que es segura de forma predeterminada. En el proceso de creación especificará lo siguiente:

  • El Nombre de la aplicación web. Es el nombre que se usa como parte del nombre DNS de la aplicación web en el formato https://<app-name>.azurewebsites.net.
  • El Runtime de la aplicación. Es donde se selecciona la versión de PHP que se va a usar para 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:

  1. Escriba "base de datos de aplicación web" en la barra de búsqueda de la parte superior de Azure Portal.
  2. Seleccione el elemento denominado Aplicación web + base de datos en el encabezado Marketplace. También puede ir directamente al asistente de creación.

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

Paso 2: In the páginaCrear aplicación web + base de datos, rellene el formulario de la siguiente manera.

  1. Grupo de recursos → Seleccione Crear nuevo y use el nombre msdocs-laravel-mysql-tutorial.
  2. Región → Cualquier región de Azure cercana.
  3. Nombremsdocs-laravel-mysql-XYZ, donde XYZ son tres caracteres aleatorios. Este nombre debe ser único en Azure.
  4. Pila en tiempo de ejecuciónPHP 8.2.
  5. ¿Agregar Azure Cache for Redis?.
  6. Plan de hospedajeBásico. Cuando esté listo, puede escalar verticalmente a un plan de tarifa de producción más adelante.
  7. MySQL: servidor flexible está seleccionado de forma predeterminada como motor de base de datos. Azure Database for MySQL es una base de datos MySQL como servicio totalmente administrada de Azure, compatible con las últimas ediciones de la comunidad.
  8. Seleccione Revisar + crear.
  9. Una vez completada la validación, seleccione Crear.

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

Step 3: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 de 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 red de back-end.
  • Puntos de conexión privados → puntos de conexión de Access para el servidor de bases de datos y la caché de Redis 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 SQL 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 de DNS privado → habilitar la resolución DNS del servidor de base de datos y la caché de Redis en la red virtual.

A screenshot showing the deployment process completed.

2: Configuración de la conectividad de base de datos

Paso 1: En la página App Service, en el menú de la izquierda, seleccione Configuración.

A screenshot showing how to open the configuration page in App Service.

Paso 2:

  1. Busque la configuración de la aplicación que comience por AZURE_MYSQL_. Fueron generados a partir de la nueva base de datos MySQL por el asistente de creación.
  2. Además, busque la configuración de la aplicación que comience por AZURE_REDIS_. Fueron generados a partir de la nueva caché de Redis por el asistente de creación. Para configurar la aplicación, solo necesita este nombre.
  3. Si lo desea, puede seleccionar el botón Editar, situado a la derecha de cada configuración, y ver o copiar su valor. Más adelante, cambiará el código de la aplicación para usar esta configuración.

A screenshot showing how to create an app setting.

Paso 3: En la pestaña Ajustes de la aplicación de la página Configuración, cree un valor CACHE_DRIVER:

  1. Seleccione Nueva configuración de la aplicación.
  2. En el campo Nombre, escriba CACHE_DRIVER.
  3. En el campo Valor, escriba redis.
  4. Seleccione Aceptar. CACHE_DRIVER ya se usa en el código de la aplicación de Laravel. Esta configuración indica a Laravel que use Redis como caché.

A screenshot showing how to see the autogenerated connection string.

Paso 4: Con los mismos pasos del Paso 3, 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: use true como valor. Es una variable de depuración Laravel que habilita páginas en modo de depuración.
  • APP_KEY: use base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= como valor. Es una variable de cifrado de Laravel.
  1. En la barra de menú superior, seleccione Guardar.
  2. Cuando se le solicite, seleccione Continuar.

A screenshot showing how to save settings in the configuration page.

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.

3: Implementación del 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 repositorios git push de GitHub inicia la acción de compilación e implementación. Realizará algunos cambios en el código base con Visual Studio Code directamente en el explorador y luego dejará que Acciones de GitHub realice la implementación de manera automática.

Paso 1: En una nueva ventana del navegador:

  1. Inicie sesión en su cuenta de GitHub.
  2. Vaya a https://github.com/Azure-Samples/laravel-tasks.
  3. Seleccione Bifurcación.
  4. Seleccione Crear bifurcación.

A screenshot showing how to create a fork of the sample GitHub repository.

Paso 2: En la página de GitHub, abre Visual Studio Code en el navegador pulsando la tecla ..

A screenshot showing how to open the Visual Studio Code browser experience in GitHub.

Paso 3: En el explorador de Visual Studio Code, abra config/database.php en el explorador. Busque la sección mysql y realice los cambios siguientes:

  1. Reemplace DB_HOST por AZURE_MYSQL_HOST.
  2. Reemplace DB_DATABASE por AZURE_MYSQL_DBNAME.
  3. Reemplace DB_USERNAME por AZURE_MYSQL_USERNAME.
  4. Reemplace DB_PASSWORD por AZURE_MYSQL_PASSWORD.
  5. Reemplace DB_PORT por AZURE_MYSQL_PORT. Recuerde que el asistente de creación ha creado automáticamente esta configuración AZURE_MYSQL_.

A screenshot showing Visual Studio Code in the browser and an opened file with modified MySQL variables.

Paso 4: En config/database.php, desplácese hasta la sección Redis cache y realice los siguientes cambios:

  1. Reemplace REDIS_HOST por AZURE_REDIS_HOST.
  2. Reemplace REDIS_PASSWORD por AZURE_REDIS_PASSWORD.
  3. Reemplace REDIS_PORT por AZURE_REDIS_PORT.
  4. Reemplace REDIS_CACHE_DB por AZURE_REDIS_DATABASE.
  5. 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. Recuerde que el asistente de creación ha creado automáticamente esta configuración AZURE_REDIS_.

A screenshot showing Visual Studio Code in the browser and an opened file with modified Redis variables.

Paso 5:

  1. Seleccione la extensión Control de código fuente.
  2. En el cuadro de texto, escriba un mensaje de confirmación, por ejemplo, Configure DB & Redis variables.
  3. Seleccione Confirmar e insertar.

A screenshot showing the changes being committed and pushed to GitHub.

Paso 6: De nuevo en la página App Service, en el menú de la izquierda, seleccione Centro de implementación.

A screenshot showing how to open the deployment center in App Service.

Paso 7: En la página Centro de implementación:

  1. En Origen, seleccione GitHub. De forma predeterminada, Acciones de GitHub está seleccionado como proveedor de compilación.
  2. Inicie sesión en su cuenta de GitHub y siga las indicaciones para autorizar a Azure.
  3. En Organización, seleccione su cuenta.
  4. En Repositorio, seleccione laravel-task.
  5. En Rama, seleccione main.
  6. En el menú superior, elija Guardar. App Service confirma un archivo de flujo de trabajo en el repositorio de GitHub escogido, en el directorio .github/workflows.

A screenshot showing how to configure CI/CD using GitHub Actions.

Paso 8: En la página Centro de implementación:

  1. Seleccione Registros. Ya hay iniciada una ejecución de implementación.
  2. En el elemento de registro de la ejecución de implementación, seleccione Compilar o implementar registros.

A screenshot showing how to open deployment logs in the deployment center.

Paso 9: Se le llevará al repositorio de GitHub, donde ve 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 el estado Completado. Tardará unos 15 minutos.

A screenshot showing a GitHub run in progress.

4: Generación del 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 SSH.

A screenshot showing how to open the SSH shell for your app from the Azure portal.

Paso 2: En el terminal SSH:

  1. Ejecute cd /home/site/wwwroot. Aquí están todos los archivos implementados.
  2. Ejecute php artisan migrate --force. Si se realiza correctamente, App Service se conecta correctamente a la base de datos de MySQL. Cuando la aplicación se reinicie, solo persisten los cambios realizados en los archivos ubicados en /home. Los cambios efectuados fuera de /home no se conservan.

A screenshot showing the commands to run in the SSH shell and their output.

5: Cambio de 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:

  1. En el menú de la izquierda, seleccione Configuración.
  2. Seleccione la pestaña Configuración general.

A screenshot showing how to open the general settings tab in the configuration page of App Service.

Paso 2: En la pestaña Configuración general:

  1. En el cuadro Comando de inicio, escriba el siguiente comando: cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload.
  2. Seleccione Guardar. 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.

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

6: Navegación hasta la aplicación

Paso 1. En la página App Service:

  1. En el menú de la izquierda, seleccione Información general.
  2. Seleccione la dirección URL de la aplicación. También puede navegar directamente a https://<app-name>.azurewebsites.net.

A screenshot showing how to launch an App Service from the Azure portal.

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.

A screenshot of the Laravel app running in 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.

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. 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:

  1. En el menú de la izquierda, seleccione Registros de App Service.
  2. En Registro de aplicaciones, seleccione Sistema de archivos.

A screenshot showing how to enable native logs in App Service in the Azure portal.

Paso 2: En el menú de la izquierda, seleccione Flujo de registro. Verá los registros de la aplicación, incluidos los registros de plataforma y los registros de dentro del contenedor.

A screenshot showing how to view the log stream in the Azure portal.

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:

  1. Escriba el nombre del grupo de recursos.
  2. Seleccione el grupo de recursos.

A screenshot showing how to search for and navigate to a resource group in the Azure portal.

Paso 2: En la página del grupo de recursos, seleccione Borrar grupo de recursos.

A screenshot showing the location of the Delete Resource Group button in the Azure portal.

Paso 3:

  1. Escriba el nombre del grupo de recursos para confirmar la eliminación.
  2. Seleccione Eliminar.

A screenshot of the confirmation dialog for deleting a resource group in the Azure portal. :

Preguntas más frecuentes

¿Cuánto cuesta esta configuración?

Los precios por la creación de los recursos 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 se configure alguna funcionalidad extra, como, por ejemplo, el emparejamiento. 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 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, las actualizaciones deseadas se insertan 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:

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.

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)