Tutorial: Creación de una aplicación PHP y MySQL en Azure App Service

Azure App Service proporciona un servicio de hospedaje web muy escalable y con aplicación automática de revisiones con el sistema operativo Linux. 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). Cuando haya terminado, tendrá una aplicación de Laravel que se ejecuta en Azure App Service en Linux.

Captura de pantalla de un ejemplo de aplicación de Azure llamada Task List que muestra las nuevas tareas agregadas.

En este tutorial, aprenderá a:

  • Crear en Azure una aplicación de PHP y MySQL segura de forma predeterminada
  • Configurar secretos de conexión a MySQL usando la configuración de la aplicación
  • Implementar el código de la aplicación mediante Acciones de GitHub
  • Actualización de la aplicación y nueva implementación
  • Ejecutar migraciones de base de datos de forma segura
  • Transmitir registros de diagnóstico desde Azure
  • Administrar la aplicación en Azure Portal

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

Instrucciones Instantánea
En Azure Portal:
  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.
Captura de pantalla que muestra cómo usar el cuadro de búsqueda de la barra de herramientas superior para encontrar el asistente de creación Aplicación web + base de datos
En la página Crear aplicación web + base de datos, rellene el formulario como se indica a continuación.
  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.0.

    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.

  5. Anote el nombre de base de datos que se genera automáticamente (<app-name>-database). Lo necesitará más adelante.

  6. Haga clic en Revisar y crear.

Cuando se haya completado la validación, haga clic en Crear.
Captura de pantalla que muestra cómo configurar una aplicación y base de datos nuevas en el asistente Crear aplicación web + base de datos
La implementación tarda unos minutos en completarse y crea 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 P1v2.
  • 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.
  • Servidor flexible de Azure Database for MySQL → Accesible solo desde la red virtual. Una base de datos y un usuario se crean automáticamente en el servidor.
  • Zona DNS privada → Habilita la resolución DNS del servidor de base de datos MySQL en la red virtual.
Una vez completada la implementación, haga clic en el botón Ir al recurso. Se le llevará directamente a la aplicación App Service.
Captura de pantalla que muestra el formulario que se rellena para crear una aplicación web en Azure

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

El asistente para la creación generó una cadena de conexión a la base de datos, pero en un formato que todavía no se puede usar en el código. En este paso, creará la configuración de la aplicación con el formato que la aplicación necesita.

Instrucciones Instantánea
En la página App Service, en el menú de la izquierda, seleccione Configuración. Captura de pantalla que muestra cómo abrir la página de configuración de App Service
En la pestaña Configuración de la aplicación de la página Configuración, cree una configuración DB_DATABASE:
  1. Haga clic en Nueva configuración de la aplicación.

  2. En el campo Nombre, escriba DB_DATABASE.

  3. En el campo Valor, escriba el nombre de base de datos que generó automáticamente el asistente de creación, que es similar a msdocs-docs-laravel-mysql-XYZ-database.

  4. Haga clic en OK.

Captura de pantalla que muestra cómo ver la cadena de conexión generada automáticamente
De nuevo en la pestaña Configuración de la aplicación:
  1. Desplácese hasta la parte inferior y seleccione la cadena de conexión defaultConnection, que generó el asistente de creación y que contiene el nombre de usuario y la contraseña que necesita.

  2. En el campo Valor, seleccione el botón Copiar y pegue el valor en un archivo de texto para usarlo más adelante. Está en el siguiente formato (se han incluido saltos de línea para una mayor claridad):

    Database=mysql;
    Server=<database-server-domain-name>;
    User Id=<username>;
    Password=<password>
    
  3. Seleccione Cancelar.

Captura de pantalla en la que se muestra cómo crear una configuración de aplicación
Cree la siguiente configuración de aplicación adicional siguiendo los mismos pasos para crear una configuración de aplicación.
  • DB_HOST: use el valor de database-server-domain-name<> de la cadena de conexión copiada como valor.

  • DB_USERNAME: use el valor de <username> de la cadena de conexión copiada como valor.

  • DB_PASSWORD: use el valor de <password> de la cadena de conexión copiada como valor.

  • MYSQL_ATTR_SSL_CA: use /home/site/wwwroot/ssl/BaltimoreCyberTrustRoot.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.

  • APP_DEBUG: use true como valor. Es una variable de depuración de Laravel.

  • APP_KEY: use base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= como valor. Es una variable de cifrado de Laravel.

    Importante

    Aquí se usa este 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.

Captura de pantalla que muestra toda la configuración de la aplicación necesaria en la página de configuración

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 iniciará 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.

Instrucciones Instantánea
En una nueva ventana del explorador:
  1. Inicie sesión en su cuenta de GitHub.

  2. Vaya a https://github.com/Azure-Samples/laravel-tasks.

  3. Haga clic en Fork (Bifurcar).

  4. Haz clic en Crear bifurcación.

Captura de pantalla que muestra cómo crear una bifurcación del repositorio de GitHub de ejemplo
En la página de GitHub, abra Visual Studio Code en el explorador presionando la tecla .. Captura de pantalla que muestra cómo abrir la experiencia de explorador de Visual Studio Code en GitHub
En Visual Studio Code, abra config/database.php en el explorador. En la conexión mysql, vea que la configuración de la aplicación que creó anteriormente para la conexión MySQL ya se está usando (DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD, MYSQL_ATTR_SSL_CA). Captura de pantalla que muestra Visual Studio Code en el explorador y un archivo abierto
De nuevo en la página App Service, en el menú de la izquierda, seleccione Centro de implementación. Captura de pantalla que muestra cómo abrir el centro de implementación de App Service
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-tasks.

  5. En Rama, seleccione main.

  6. En el menú superior, haga clic en Guardar.

App Service confirma un archivo de flujo de trabajo en el repositorio de GitHub seleccionado, en el directorio .github/workflows.
Captura de pantalla que muestra cómo configurar la CI/CD mediante Acciones de GitHub
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.

    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.

Captura de pantalla que muestra cómo abrir registros de implementación en el centro de implementación
En Visual Studio Code en el explorador:
  1. Seleccione la extensión Control de código fuente.

  2. Junto al archivo database.php modificado, seleccione + para almacenar provisionalmente los cambios.

  3. En el cuadro de texto, escriba add certificate.

  4. Seleccione la marca de verificación para confirmar y enviar a GitHub.

Si vuelve a la página Centro de implementación, verá una nueva entrada de registro, porque se ha iniciado otra ejecución. Espere a que la ejecución se complete. Tardará unos 15 minutos.

Sugerencia

La acción de GitHub se define mediante el archivo del repositorio de GitHub, en .github/workflow. Esto se puede hacer más rápidamente personalizando el archivo.

Captura de pantalla que muestra cómo confirmar cambios en la experiencia de explorador de Visual Studio Code

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.

Instrucciones Instantánea
En la página App Service:
  1. En el menú de la izquierda, seleccione SSH.

  2. Seleccione Ir.

Se abre en el explorador una sesión de SSH con el contenedor de App Service. Si lo desea, puede navegar directamente a https://<app-name>.scm.azurewebsites.net/webssh/host en su lugar.
Captura de pantalla que muestra cómo abrir el shell de SSH de la aplicación desde Azure Portal
En el terminal de SSH:
  1. Cambie el directorio a la raíz del código de la aplicación:

    cd /home/site/wwwroot
    
  2. Realice las migraciones de base de datos desde la raíz de la aplicación.

    php artisan migrate --force
    

    Nota

    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.

Captura de pantalla que muestra los comandos que se ejecutan en el shell de SSH y su salida correspondiente

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 8.0 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 8.0 (/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 los cambios se perderán después de reiniciar la aplicación.

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

  2. Seleccione la pestaña Configuración general.

Captura de pantalla que muestra cómo abrir la pestaña Configuración general en la página de configuración de App Service
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.

    Esto reemplaza el archivo de configuración de Nginx en el contenedor de PHP 8.0 y reinicia Nginx. Esta configuración garantiza que este cambio se va a realizar en el contenedor cada vez que se inicie.

  2. Seleccione Guardar.

Captura de pantalla que muestra cómo configurar un comando de inicio en App Service

6: Navegación hasta la aplicación

Instrucciones Instantánea
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.

Captura de pantalla que muestra cómo iniciar una App Service desde Azure Portal
Agregue algunas tareas a la lista. ¡Enhorabuena! Ya está ejecutando una aplicación PHP orientada a datos en Azure App Service. Captura de pantalla de la aplicación Laravel ejecutándose en App Service

7: Transmisión de registros de diagnóstico

Instrucciones Instantánea
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.

Captura de pantalla que muestra cómo habilitar los registros nativos en App Service en Azure Portal
En el menú de la izquierda, haga clic en Secuencia de registro. Verá los registros de la aplicación, incluidos los registros de plataforma y los registros de dentro del contenedor. Captura de pantalla que muestra cómo ver la secuencia de registro en 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.

Instrucciones Instantánea
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.

Captura de pantalla que muestra cómo localizar un grupo de recursos y navegar hasta él en Azure Portal
En la página del grupo de recursos, seleccione Eliminar grupo de recursos. Captura de pantalla que muestra la ubicación del botón Eliminar grupo de recursos en Azure Portal
  1. Escriba el nombre del grupo de recursos para confirmar la eliminación.

  2. Haga clic en Eliminar.

Captura de pantalla del diálogo de confirmación para eliminar un grupo de recursos en 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 Premium V2 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.
  • 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

En este tutorial, ha aprendido a:

  • Crear en Azure una aplicación de PHP y MySQL segura de forma predeterminada
  • Configurar secretos de conexión a MySQL usando la configuración de la aplicación
  • Implementar el código de la aplicación mediante Acciones de GitHub
  • Actualización de la aplicación y nueva implementación
  • Ejecutar migraciones de base de datos de forma segura
  • Transmitir registros de diagnóstico desde Azure
  • Administrar la aplicación en Azure Portal

Pase al siguiente tutorial para aprender cómo asignar un nombre DNS personalizado a la aplicación.

O bien, eche un vistazo a otros recursos:

Configure PHP app (Configuración de una aplicación de PHP)