Preparando un entorno de desarrollo web con ubuntu server y virtualbox

Normalmente estamos acostumbrados a instalar el software necesario para nuestro desarrollo web (servidor web, servidor de bases de datos…) en nuestra máquina de trabajo para probar en modo local que la aplicación que estamos generando funcione tal y como nosotros deseamos. Esto, que por una parte es perfectamente válido y puede ser útil a la mayoría de desarrolladores, presenta algunas desventajas: cada vez que iniciamos el sistema se inician una serie de servicios que puede no sernos útiles en todo momento (por ejemplo si usamos la máquina para consultar el correo o ver una película) y que ocupan cpu y memoria del sistema, y que nuestro sistema de trabajo puede no ser el mismo sobre el cual correrá finalmente la aplicación (por ejemplo, una aplicación desarrollada bajo Windows para ser ejecutada bajo un servidor Linux).

Para evitar eso propongo utilizar VirtualBox (software que permite correr una instancia de un sistema operativo dentro de otro), sobre el cual ejecutaremos el sistema operativo que deseemos como servidor (o sobre el cual finalmente vaya a implementarse las aplicaciones). En el caso de este artículo voy a utilizar Ubuntu Server 10.04 LTS virtualizado sobre un Ubuntu Desktop 9.10 que es el que uso como entorno de desarrollo (y de uso diario también), pero podría darse el caso de virtualizar una distro de Linux sobre un entorno de desarrollo Windows por ejemplo. Veamos como hacer esto.

Esquema general

Nuestro entorno de desarrollo va a quedar de la siguiente forma:

Por un lado tenemos una instancia de un sistema operativo que actuará como servidor (y que a partir de ahora para abreviar me referiré a ella como servidor a secas) sobre el cual instalaremos todo el software necesario para su funcionamiento: servidor web, servidor de bases de datos, servidor de correo, intérprete de scripts, etc. Esta instancia funcionará gracias a VirtualBox. Debe además simular el entorno sobre el cual finalmente correrá nuestro desarrollo, de esta forma nos aseguramos que realmente funcionará sin problemas una vez pase a producción. En esta instancia sólo se ejecutan los distintos servicios, y no se almacenan los archivos de la aplicación.

Por otro lado tenemos nuestro entorno de trabajo (sistema huésped o el sistema actualmente instalado en nuestro equipo). Es aquí dónde se encuentra nuestro editor de código favorito, los distintos navegadores para probar la aplicación y lo más importante, todo el código fuente de la misma. ¿Por qué es esto así? Debido a la constante actualización de un archivo de código, si este tiene que ser subido al servidor (nuestra instancia bajo VirtualBox) cada vez que se modifica, resulta muy poco práctico todo este invento. Para evitar esto, nuestro código permanece en nuestro sistema principal y mediante el uso de las carpetas compartidas que permite VirtualBox, el servidor podrá leer los archivos para servirlos.

Preparando el servidor

Lógicamente para poder ejecutar la instancia del servidor vamos a necesitar dos cosas: la primera es tener correctamente instalado VirtualBox en nuestro equipo y la segunda disponer de una imagen con el sistema operativo a instalar. Tras ello deberemos proceder a instalar dicho sistema en VirtualBox pero esta tarea es algo que se sale fuera del objetivo de este artículo. Para ello San Google siempre tiene la respuesta, aunque aquí dejo dos enlaces interesantes en el caso que el sistema huésped sea Ubuntu: enlace 1 y enlace 2. Una vez instalado, arrancada la máquina virtual y ya cargado el sistema operativo, nos aparecerá una ventana negra con el prompt del sistema.

Tras iniciar sesión en el sistema con el usuario y la contraseña proporcionados durante el proceso de instalación, tendremos a nuestra disposición la típica consola Linux, sobre la cual vamos a realizar unas operaciones. En primer lugar vamos a instalar un servidor ssh, para que de esta forma podamos acceder a administrar vía consola nuestro servidor sin necesidad de usar la interfaz de VirtualBox (podemos tenerla así minimizada). Quizás esto no sea del todo importante, pues realmente si alguna vez necesitáramos ejecutar algún comando en nuestro servidor (aparte de los iniciales para instalar los servicios que usaremos) podríamos hacerlo directamente desde esta interfaz, pero dado que cuando nos encontremos ante un entorno de producción real administraremos nuestro servidor de forma remota, aquí haremos lo mismo para habituarse a ello.

Para instalar el demonio de ssh en nuestro servidor escribiremos en la consola que nos aparece en la ventana de nuestra máquina virtual:

sudo apt-get install openssh-server

Y el gestor de paquetes del sistema empezará a descargar e instalar el demonio sshd. Una vez finalizado este proceso en teoría ya podríamos acceder de forma remota al servidor, y digo en teoría porque nos encontramos con el primer problema: ¿qué dirección IP tiene nuestra máquina virtual? Sin dirección IP no podemos conectarnos a ningún servidor a no ser que sea nuestro propio ordenador que nos conectamos como localhost. Pero nuestro ordenador tampoco es, pues estamos trabajando con una máquina virtual. El procedimiento para permitir esto es bastante simple: se trata de establecer una traducción entre los puertos de la máquina virtual y los de la nuestra física. Dicho con otras palabras, establezco una regla en VirtualBox que permita escuchar en un puerto de mi SO actual (por ejemplo el puerto 2222) e internamente VirtualBox pasa todo el contenido a otro puerto dentro de la máquina virtual (por ejemplo el 22, que es el puerto por defecto de ssh). Estas acciones desafortunadamente no se pueden hacer con la interfaz gráfica de VirtualBox, así que tendremos que hacerlo desde la consola. Abrimos una terminal en nuestro pc y escribimos:

VBoxManage setextradata "Ubuntu Server 10.04" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/Protocol" TCP
VBoxManage setextradata "Ubuntu Server 10.04" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/GuestPort" 22
VBoxManage setextradata "Ubuntu Server 10.04" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort" 2222

Mediante esas reglas de configuración de VirtualBox le hemos dicho: para la máquina virtual de nombre Ubuntu Server 10.04 crea una regla de nombre ssh que para el protocolo TCP, VirtualBox se ponga a escuchar por el puerto 2222 de la máquina huésped y reenvíe la información al puerto 22 de la máquina virtual. Es importante mencionar que esas reglas deben aplicarse con máquina virtual apagada. Si quieres una explicación algo más detallada, consulta este artículo.

Solamente queda una cosa por hacer: cambiar la tarjeta de red que VirtualBox simula en la máquina virtual. Para ello, en la ventana principal de VirtualBox, seleccionamos la máquina virtual de nuestro servidor y pulsamos sobre el botón Configuración. En la nueva ventana que nos aparece, en la parte de la izquierda, seleccionamos Red, y en la parte de la derecha desplegamos la pestaña Avanzadas y en el cuadro desplegable llamado Tipo de Adaptador, escogemos PCnet-PCI II (Am79C970A) y pulsamos sobre Aceptar. Esto es necesario por que hemos configurado las reglas para el dispositivo de tipo pcnet. Una vez realizado este paso, iniciamos nuestra máquina virtual y cuando en la interfaz nos aparezca el texto de bienvenida y la opción de introducir login y password ya tendremos activo el servidor. Cabe mencionar que para que nuestro servidor funcione no es necesario iniciar sesión en él, eso sólo lo haremos cuando necesitemos instalar o configurar algún servicio.

Para comprobar que todo funcione correctamente, abrimos una terminal en nuestro equipo y escribimos:

ssh -p 2222 usuario@localhost

Dónde usuario es el usuario que hemos configurado cuando se instaló el servidor. Nos pedirá la contraseña y una vez escrita estaremos dentro del servidor si todo el proceso ha ido bien. Cada vez que necesitemos entrar al servidor lo haremos de esta forma, de la misma manera que lo haríamos si estuviéramos trabajando con un servidor remoto.

Configurando las carpetas compartidas

Esta útil opción de VirtualBox nos va a permitir disponer de los archivos fuente de nuestra aplicación en nuestro sistema huésped, siendo la máquina virtual la que los lee de nuestro sistema para servirlos. De esta forma, cada vez que nosotros o un servicio acceda por ejemplo a la carpeta /home/www en nuestro servidor, estará accediendo realmente por ejemplo a la carpeta /home/usuario/desarrollo de nuestra máquina local, que es dónde tenemos todos los archivos fuentes de la aplicación. Es muy parecido a la traducción de puertos que hacíamos anteriormente.

Para realizar esto necesitamos primero instalar en nuestro Ubuntu Server las llamadas Guest Additions. Este procedimiento es algo que se sale del objetivo de este artículo, pero recomiendo leer este artículo que es con el que he aprendido yo en dónde viene todo claramente explicado. Una vez realizado esto debemos configurar las carpetas compartidas en VirtualBox. Esto es algo que también se sale fuera del objetivo de este artículo, por lo que recomiendo la lectura de este artículo en dónde se explica claramente. Lo único a tener en cuenta es que los nombres y las carpetas que usaremos en este artículo difieren de los que se dan en el artículo recomendado. Para evitar confusiones, las equivalencias son las siguientes:

Forma: en nuestro tutorial -> en el tutorial recomendado

Directorio real dónde se encuentra el código fuente: /home/usuario/desarrollo -> /…/Compartida con Virtual Box

Nombre que le damos para compartir: www -> Compartida

Directorio de la máquina virtual dónde se montará la carpeta: /home/www -> /media/compartida

Una vez tengamos configurada las carpetas compartidas y verifiquemos que funciona correctamente tenemos que realizar una configuración adicional que no se especifica en el mencionado tutorial. Tal y como está explicado en él, cada vez que iniciemos la máquina virtual tenemos que ejecutar el comando mount para montar la carpeta compartida. Esto resulta totalmente impráctico, por lo que a continuación vamos a ver la forma de que el sistema realice esto de forma automática por nosotros cada vez que se inicie.

Entramos mediante ssh en nuestro servidor de la forma que hemos visto anteriormente y escribimos en la terminal:

sudo nano /etc/fstab

Y se nos abrirá el editor de consola nano con el contenido del archivo fstab. Este archivo contiene las particiones y los puntos de montaje del sistema que se efectuarán al inicio. Nos vamos al final del todo e insertamos la siguiente línea:

www /home/www vboxsf rw,exec,uid=1000,gid=1000,dev 0 0

Lo más relevante es: www (el nombre que le hemos dado en VirtualBox para compartir), /home/www (el punto de montaje de la carpeta compartida), rw (permisos de lectura y escritura), uid=1000,gid=1000 (la carpeta se montará como si fuese una carpeta creada por ese usuario y ese grupo. 1000 es por defecto el ID del primer usuario y grupo que se crea en el sistema). De esta forma, cada vez que en el servidor accedamos a /home/www estaremos accediendo a /home/usuario/desarrollo de nuestro sistema local.

Configuración adicional

Con esto ya tendríamos todo preparado para usar nuestro entorno de desarrollo. Cada vez que necesitemos disponer de los servicios (web, bbdd, etc) iniciaremos la máquina virtual y listo. Para evitarnos tener que hacerlo desde la interfaz de VirtualBox podemos crear algún acceso directo en el escritorio para que pulsando en él se inicie o se pare la máquina virtual, ahorrándonos también que se muestre la interfaz gráfica del propio Ubuntu Server. Para ello, creamos dos accesos directos (iniciar y parar respectivamente) y en el comando a ejecutar escribimos:

VBoxHeadless --startvm "Aquí el nombre de la máquina" -vrdp=off

Para iniciar la máquina y para pararla:

VBoxManage controlvm "Aquí el nombre de la máquina" poweroff

En mi caso he buscado en /usr/share/icons algún icono con un botón rojo y otro verde para asociarselo a los accesos directos.

Publicado el 13/06/2010

Sobre el autor

Es un analista / programador en NoSoloSoftware, una empresa de desarrollo software de nueva creación radicada en Córdoba (España). Le gusta investigar las tecnologías web usadas en el cloud computing, especialmente el mundo que rodea a Ruby y Rails, y sobre todo emprender y resolver problemas de ingeniería.

Redes sociales