Vagrant para proyectos php: dile adiós a Wamp o Xamp

Vagrant es una herramienta muy útil para los programadores PHP que todavía usan plataformas de desarrollo tales como Wamp o Xamp.

Te vamos a explicar como crear un servidor virtual LAMP, que correrá sobre Virtualbox, y que podremos utilizar como servidor de desarollo.

Tanto Wamp como Xamp son dos herramientas muy útiles para desarrollar en PHP en entornos Windows. Con unos pocos clicks de ratón obtendremos una plataforma de desarrollo LAMP pero sin la «L».

Es decir, tendremos en nuestro ordenador Windows un servidor Apache, una base de datos MySql, y lo necesario para ejecutar scripts PHP, y podremos desarrollar proyectos que en el futuro correrán en un servidor LAMP propiamente dicho (es decir, un servidor con Linux).

En principio la idea es muy buena, pero siempre hay problemillas…

Problemillas con Wamp o Xamp

He usado durante muchos años Wamp para desarrollar mis proyectos PHP, principalmente basados en frameworks como CakePhp, Laravel, Slim Framework, o CMS’s como Joomla o WordPress.

Y en casi todos los proyectos, he tenido los mismos problemas derivados del hecho de estar corriendo software en una máquina Windows, que posteriormente tendria que funcionar en una máquina Linux.

Es decir, era muy habitual conseguir un software que funcionaba muy bien en el pc de desarrollo de windows, pero presentaba problemillas al publicarlo en el servidor linux.

  • El primero que se me viene a la cabeza es todo lo relacionado con el acceso a ficheros y a la diferencia en la forma de construir las rutas en Windows y en Linux. Toda aquella función de PHP que use la ruta de un archivo, puede producir un problema si hemos usado el backslash («\») para construir la ruta.
  • Los módulos de apache son otro apartado especial. A veces los proyectos para Apache, necesitan de la existencia de algunos módulos en concreto, que puede que Wamp tenga, o puede que no. Y aunque los tenga, puede que la versión no sea la misma que tendremos en el servidor de desarrollo.
  • Lo mismo pasa con las extensiones de PHP (PECL).
  • Todo lo relacionado con el manejo de ficheros (escribir en ficheros, bloquear ficheros, etc), a veces no funciona de forma tan parecida como debiera.
  • En un entorno windows, no puedes enviar emails tan sencillamente como si dispones de tu propio servidor linux. Olvídate de «sendmail».
  • Si quieres acceder a la aplicación que estás desarrollando desde fuera del PC de desarrollo (es decir, desde tu intranet) la cosa se complica. Esto es muy habitual si estás desarrollando una aplicación móvil (Android o IOS), que tiene que acceder a un backend (en este caso tu aplicación PHP que se ejecuta en WAMP). Con un servidor virtual esto es mucho mas sencillo.

Estoy seguro de que todos vosotros os habéis topado con problemas derivados de desarrollar software que correrá sobre linux en un entorno de programación linux.

Lo ideal es que nuestro entorno de desarrollo se parezca lo mas posible al entorno de producción donde finalmente se publicará el software.

Esto podemos conseguirlo gracias a Virtualbox, y a Vagrant.

¿Que es Virtualbox?

Me sorprendería que no supieras lo que es Virtualbox, pero por si acaso, aqui va un pequeño resumen.

Virtualbox es un software de virtualización, disponible gratuitamente para el uso personal y de empresas. Con virtualbox puedes crear en tu PC windows, una máquina virtual con Linux, que es lo que necesitamos para este ejemplo.

Asi que si no lo tienes instalado ya en tu equipo, lo primero que tienes que hacer es descargar Virtualbox e instalarlo.

¿Que es Vagrant?

Muy sucintamente, Vagrant es una herramienta que permite crear y gestionar maquinas virtuales a través de un script.

Explicado de otra forma, en vez de tener que bajarnos la ISO de la versión de Linux que queramos usar, montarla en una máquina virtual de Virtualbox, y hacer el proceso de instalación paso a paso como si lo estuviesemos instalando en un ordenador real, podemos automatizar todo el proceso mediante un script.

En este script, especificaremos todo lo que nuestro proyecto va a necesitar. Por ejemplo, la distribucion y version de Linux, la version de Mysql, la version de Apache, la version de PHP, todos los modulos de Apache y PHP necesarios, y todas las personalizaciones necesarias para esa maquina virtual.

Una vez creado el script «Vagrant» que dará vida a nuestra maquina virtual, tan solo tenemos que arrancar la maquina virtual con un comando, y esta se creará como por arte de magia.

Por lo tanto, si no lo has hecho ya, deberías descargar e instalar Vagrant.

Crear una máquina virtual LAMP para sustituir a Wamp y Xamp

Supongamos que tenemos que trabajar en un proyecto para php que correrá sobre un servidor Ubuntu 18, y que requiere de php 7.2. Las versiones de Apache y de Mysql no son tan determinantes, por lo cual en principio vamos a instalar las que vengan por defecto con la version de ubuntu (aunque se podría detallar las versiones tambien).

Vamos a crear un directorio para nuestro proyecto, llamado «c:\MiProyecto».

Abriremos una consola de comandos y navegaremos a este directorio. En windows puedes abrir la carpeta, y pulsar en «Fichero->Windows PowerShell».

Una vez en la consola, ejecutaremos el comando «Vagrant init», que creará un fichero llamado «Vagrantfile» con una configuración estandar. El fichero de configuración estandar no se adecua a nuestros propositos, por ello vamos a personalizarlo como el siguiente ejemplo. A continuación veremos punto por punto el significado de cada comando:

El fichero Vagrantfile, paso a paso

La sintaxis del fichero Vagrantfile es la del lenguaje Ruby. Sin embargo no necesitas conocer este lenguaje para crear tu maquina virtual de desarrollo, ya que los ajustes que hay que hacer son muy sencillos e intuitivos.

El box

La primera línea de interés es

En esta línea especificaremos que «box» usaremos para crear nuesta máquina virtual. Podriamos decir que un «box» es un sistema operativo, aunque este es solo parcialmente cierto.

En el ejemplo anterior estamos indicando a Vagrant que usaremos como sistema operativo la version 18.04 de Ubuntu. Sin embargo hay «boxes» que no solo contienen el sistema operativo, sino software preinstalado que podriamos necesitar.

Hay centenared de boxes diferentes, que puedes encontrar en la pagina web de Vagrant. Sin embargo nosotros vamos a usar el box básico, con una versión limpia de Ubuntu 18, y el resto lo instalaremos nosotros.

El puerto de para acceder a la maquina virtual

La siguiente línea de interes es:

Lo que estamos viendo es simplemente una redireccion de puertos. Esta redirección de puertos conseguirá que cuando en tu pc de desarollo invoques la url «http://localhost:8080» en el navegador, realmente seas redirigido al puerto 80 del servidor virtual linux, y puedas acceder a tu pagina web en el servidor linux.

Además si estas desarrollando software para IOs o Android, y tienes que acceder a tu backend en la maquina virtual, es muy util la siguiente línea:

Esta configuración redirecciona las peticiones que recibimos a traves de la red, es decir, desde fuera del pc de desarollo, al servidor virtual. Por ejemplo, si estas desarrollando para Android, y estas probando tu aplicacion en un telefono Android que tienes en la palma de tu mano, esta app no puede alcanzar el backend invocando «http://localhost:8080», ya que esto solo funciona desde el propio PC de desarrollo.

Pero gracias a la configuración anterior, si podrás invocar la url «http://ip-de-mi-pc-en-la-intranet:8080», y esta petición será redirigida apropiadamente al servidor virtual.

Conseguir lo mismo con WAMP, era una tarea ligeramente mas dificil.

Memoria y CPU para la maquina virtual.

El rendimiento del servidor virtual puede ajustarse asignandole mas memoria y mas cpus que las establecidas por el script por defecto. El valor de cada parametro debes decidirlo tu en funcion de las posibilidades de tu ordenador. En mi caso, como tengo mucha ram y mucha cpu, puedo permitirme asignarle 4Gb de ram y 2cpus a mi maquina virtual.

Esto puede parecer poco, pero hay que pensar que normalmente en mi equipo se esta ejecutando al mismo tiempo lo siguiente:

  • La maquina virtual «Vagrantizada» con Ubuntu
  • PhpStorm, para trabajar en el backend y en el frontend, si lo hay.
  • Android Studio, para trabajar en la app de turno.
  • Uno o dos emuladores de Android, para probar la app.

Aunque no siempre se necesita todo al mismo tiempo, hay ocasiones en las que no hay mas remedio que tener todo lo anterior abierto, mas algunas pestañas de Chrome, etc. Por lo tanto, aunque tu equipo tenga muchos Gb de ram, al final no te sobrarán tantos.

La configuración de la máquina virtual

La última sección del script es la que realiza el aprovsionamiento de la máquina virtual, es decir, la que instala todo el software necesario. En nuestro caso, es el siguiente:

Como podeis ver, esta sección no es ni mas ni menos que lenguaje de shell de Linux. Mediante los comandos de shell podreis instalar y configurar la máquina virtual de linux a vuestro antojo.

En nuestro caso, se realizan las siguientes operaciones:

  • Instalar herramientas utilies, como unzip, composer, curl, etc.
  • Instalar y configurar Mysql
  • Instalar y configurar Apache, junto con los modulos necesarios.
  • Configurar el Vhost por defecto de apache
  • Instalar Php 7.2 con todos los modulos necesarios.
  • Configurar Xdebug en php, para que podamos hacer debug desde nuestro entorno de desarrollo.
  • Mapear la carpeta de nuestro proyecto en el PC («C:\MiProyecto»), con la carpeta «/var/www» en el servidor linux.

Este ultimo punto, el de mapear la carpeta del proyecto en el pc con la carpeta «/var/www» del servidor, nos permite que el servidor web apache acceda directamente a los archivos de nuestro proyecto «fuera» de la maquina virtual. De esta manera no habra que «subir los archivos» al servidor virtual ni nada por el estilo.

Como veis, el script shell hace referencia a un par de archivos que se copian a la maquina virtual. En concreto, la configuracion del virtual host, la configuracion de la base de datos mysql, y la configuracion de php.

Estos archivos podrian ajustarse a mano, pero entonces Vagrant perdería la gracia. Por ello los he incluido en un directorio en mi proyecto llamado «c:\MiProyecto\.provision». En el directorio «.provision» podeis añadir mas recursos necesarios para vuestro proyecto, como podria ser un export de una base de datos.

Al final del articulo podeis descargar un fichero zip con el fichero vagrant y los ficheros de provision necesarios.

Listos para crear nuesta maquina virtual

Una vez el script Vagrantfile este configurado a nuestro gusto, y los recursos adcionales para nuestro proyecto esten añadidos en el directorio .provision, podremos arrancar nuestra maquina virtual.

Para ello abrimos una consola de comandos de windows en la carpeta de nuestro proyecto, y ejecutamos el comando:

La primera vez que ejecutemos el comando, ocurrirá lo siguiente:

  • Vagrant descargara el box de internet, en este caso, la iso para la instalación de Ubuntu 18.
  • A continuación instalará el sistema operativo en la máquina virtual, con la redirección de puertos, la cantidad de RAM y cpu que le hemos especificado.
  • Finalmente, ejecutará los comandos shell de configuración (instalar mysql, apache, php, etc).
Proceso de creación del servidor virtual al ejecutar el comando "vagrant up"
Proceso de creación del servidor virtual al ejecutar el comando «vagrant up»

Por lo tanto la primera vez que ejecutemos el comando el proceso de creación y configuración de la máquina virtual puede durar un tiempo, dependiendo de la velocidad de nuestro equipo y nuestra conexión a internet.

Al cabo de un rato, el proceso habrá terminado, y podremos acceder a nuestro servidor web en la direccion http://localhost:8080, y veremos la pantalla de información de php:

Pagina de informacion de php en el servidor de virtual creado con vagrant
Pagina de informacion de php en el servidor de virtual creado con vagrant

Ya podemos empezar a programar. Incluso el debug con PhpStorm funciona en este caso «out of the box», sin mas quebraderos de cabeza.

Parar la máquina virtual

Para parar la máquina virtual basta con ejecutar el comando «vagrant halt» en la consola.

Otra opcion es abrir la interfaz de Virtualbox, y parar la máquina virtual desde la interfaz.

Destruir la máquina virtual

Con el comando «vagrant destroy» destruiremos esta máquina virtual, y perderemos todos los cambios que hayamos hecho en ella y que no esten en el script de provision. Por ejemplo, si hemos creado una base de datos, o algo similar.

No se perderán los cambios hechos a nuestro codigo fuente, porque recordemos, los archivos del proyecto se encuentran en nuestro PC, no en la máquina virtual.

Acceder a la maquina virtual con ssh

La máquina virtual de virtualbox creada con vagrant, es como otra máquina virtual cualquiera, y podemos acceder a ella mediante ssh. Basta con usar nuestro cliente de SSH favorito.

Tenemos dos opciones:

  1. Desde la línea de comandos de Powershell con el comando «vagrant ssh». Se iniciará una sesión de ssh y para salir a la línea de comandos de powershell tendremos que escribir el comando «exit».
  2. Con un cliente de ssh cualquiera, como Putty o WinScp, conectándonos con el usuario «vagrant», contraseña «vagrant» a la dirección ip 127.0.0.1:2222

¿Que debo incluir en el commit de mi repositorio?

Yo suelo incluir:

  • El fichero Vagrantfile
  • El directorio .provision

Y suelo excluir:

  • El directorio .Vagrant

La magia de vagrant nos permite que incluyendo el fichero Vagrantfile en los commits de nuestro repositorio, otros desarrolladores de nuestro equipo pueden descargar el codigo fuente de la aplicación, y junto con ello, lo necesario para crear una maquina virtual en unos minutos y sin esfuerzo.

No mas necesidad de instalar Wamp en cada ordenador de los miembros del equipo, ni de configuraciones rocambolescas para multiples proyectos. Cada proyecto tendrá su propia maquina virtual, que no se verá «contaminada» con configuraciónes de otros proyectos.

Recursos

Vagrant: https://www.vagrantup.com/

VirtualBox: https://www.virtualbox.org/

Resumen

Hemos visto como prescindir de Wamp o Xamp, y sustituirlo por un servidor virtual corriendo en Virtualbox.

Para ello hemos usado la herramienta Vagrant, que permite crear máquinas virtuales de forma automatizada utilizando un sencillo script.