
Original uploader was Rodzilla at en.wikipedia, Inside and Rear of Webserver, CC BY 2.5
Una de las ventajas que podemos utilizar cuando tenemos instalado un sistema operativo como Ubuntu es la de tener un sistema operativo muy parecido al que utilizan la mayoría de servidores en Internet.
Esto puede ayudarnos mucho a la hora de desarrollar aplicaciones o probar nuestra página web en local antes de ponerla en el servidor real, y así evitar posibles problemas que puedan ocurrir en el transcurso de subir la web a “producción” (término utilizado para denominar cuando un sistema está listo para su puesta en marcha).
En este artículo vamos a aprender a instalar y configurar un servidor web con todos los elementos indispensables (Apache, como servidor web; PHP, para contenido dinámico; y MySQL para bases de datos). Este conjunto de aplicaciones, para nuestro caso, se suele denominar LAMP (por las siglas de Linux, Apache, MySQL y PHP).
Instalación
Lo primero que tenemos que hacer es instalar todos los elementos necesarios para que funcione un servidor web. Voy a poner el comando completo y después voy a explicar qué es cada cosa.
sudo apt-get install apache2 php curl php-curl mysql php-mysql libapache2-mod-php
Ahora vamos a ir uno por uno:
- apache2: es la aplicación que actúa como servidor web.
- php: el intérprete del lado del servidor para poder usar algún tipo de lenguaje de programación dinámico.
- curl: aplicación para realizar peticiones. Muy útil si vamos a utilizar algún tipo de API en nuestra aplicación.
- php-curl: librería de php para poder usar curl.
- mysql: servidor de bases de datos.
- php-mysql: librería de php para poder usar mysql.
- libapache2-mod-php*: librería de apache2 para poder ejecutar archivos .php.
Durante la instalación, aparecerá una pantalla para que introduzcamos una contraseña. Esa contraseña es la de root de MySQL, es decir, el usuario con más permisos. Yo recomiendo desde aquí utilizar una contraseña segura.
Una vez que ya tenemos todas las aplicaciones y librerías necesarias, vamos a empezar con la segunda parte, la de la configuración de todos los servicios.
Configuración de apache2
Vamos a hacer una configuración que se podría considerar avanzada. Lo que vamos a tener al final de este apartado serán dos servidores webs virtuales configurados en la misma dirección IP pero usando dos puertos distintos, es decir, podremos acceder a dos webs totalmente distintas en la misma IP (o dominio) sólo con cambiar el puerto.
Para ello, lo primero es preparar dos carpetas. Por defecto, la instalación de Apache crea la carpeta donde poner nuestros archivos para que sean visibles a través del servidor web en “/var/www/html”. Lo que vamos a hacer es crear otra carpeta que le pondremos el nombre de “other” en la ruta “/var/www”. Para ello ejecutamos el siguiente comando:
sudo mkdir /var/www/other
Es importante que el usuario que ejecuta el servidor web (un usuario que crea la instalación de Apache, llamado “www-data”, que se añade automáticamente a un grupo que también crea la instalación y que tiene el mismo nombre) sea el dueño de las carpetas, para que después no haya problemas con los permisos de la aplicación. Lo único que tenemos que hacer es poner el siguiente comando:
sudo chown www-data:www-data -R /var/www
Ese comando lo que significa es que vamos a cambiar la propiedad de las carpetas que están a partir de “www” (ésta incluida), es decir, de forma recursiva (-R), y que el nuevo dueño va a ser el usuario www-data y el grupo www-data (con el formato usuario:grupo).
Y vamos a aplicar los permisos necesarios, dejando todos los permisos para el propietario (7) y de lectura y ejecución para el grupo y para el resto (5, 5).
sudo chmod 755 -R /var/www/html /var/www/other
Ya tenemos todos los temas de carpetas y permisos solucionados. Ahora vamos con los archivos de configuración. El primero de ellos “ports.conf”.
Antes de seguir adelante, yo voy a usar “nano” como editor, pero se puede usar cualquiera, incluso los que tienen interfaz gráfica. El primero lo voy a hacer con “nano” y “pluma” (que es el editor por defecto de Ubuntu MATE) a modo de ejemplo, pero después voy a seguir sólo con “nano”.
sudo nano /etc/apache2/ports.conf
Habría que añadir la línea que está resaltada en el siguiente código:
# If you just change the port or add more ports here, you will likely also # have to change the VirtualHost statement in # /etc/apache2/sites-enabled/000-default.conf Listen 80 Listen 8080 <IfModule ssl_module> Listen 443 </IfModule> <IfModule mod_gnutls.c> Listen 443 </IfModule> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
En mi caso es “8080” porque es el segundo puerto que voy a utilizar (el que utiliza por defecto Apache es 80, como se ve en la imagen, el primer “Listen”).
Después de modificar el archivo tenemos que pulsar “Control+o” para guardar y, despues, “Control+x” para salir.
Ahora usando pluma:
gksudo pluma /etc/apache2/ports.conf
En este caso podemos simplemente darle al botón de guardar y, después, pulsar la (X) del panel superior derecho para cerrar.
Con esto ya hemos configurado nuestro servidor para que escuche en dos puertos distintos, en mi caso, el puerto 80 y el 8080. Ahora vamos a indicarle que hay dos aplicaciones distintas que van a ejecutarse cada una en un puerto. Para ello vamos a modificar el “virtualhost” por defecto y vamos a crear otro.
sudo nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. ServerName localhost ServerAdmin webmaster@localhost DocumentRoot /var/www/html <Directory /var/www/html> Options Indexes FollowSymLinks AllowOverride All </Directory> # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Al igual que antes, hay que añadir o modificar las líneas resaltadas.
Ahora vamos a crear el segundo VirtualHost y a configurarlo adecuadamente.
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/other.conf
sudo nano /etc/apache2/sites-available/other.conf
<VirtualHost *:8080> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. ServerName localhost ServerAdmin webmaster@localhost DocumentRoot /var/www/other <Directory /var/www/other> Options Indexes FollowSymLinks AllowOverride All </Directory> # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Como vemos al principio del archivo, esta aplicación será la que use el puerto “8080” que hemos configurado antes.
Ya hemos terminado con la parte de configuración de ficheros, ahora terminamos con unos pocos comandos más.
Activamos el mod rewrite (en el caso de que lo vayamos a necesitar):
sudo a2enmod rewrite
Añadimos el segundo sitio que hemos creado (other.conf) a la lista de sitios disponibles:
sudo a2ensite other.conf
Y, para terminar, reiniciamos el servicio Apache:
sudo service apache2 restart
Con todo esto que hemos hecho tendremos que ser capaces de acceder tanto a http://localhost como a http://localhost:8080 .
Yo, para comprobarlo, he dejado el index que instala Apache por defecto en la dirección principal (puerto 80) y he creado un archivo llamado “info.php” en el secundario (puerto 8080) con el siguiente contenido:
<?php phpinfo(); ?>
Y os dejo aquí las capturas de las dos “aplicaciones”.

Página mostrada en el puerto 80

Página mostrada en el puerto 8080
Conclusión
Ya hemos configurado todo lo necesario para tener dos aplicaciones en el mismo servidor y en el mismo dominio o IP, ahora sólo faltaría rellenar las dos aplicaciones con contenido.
Es un proceso que, la primera vez, puede resultar un poco difícil o tedioso, pero una vez que lo has realizado varias veces se vuelve completamente automático.
Para todos aquellos que quieran seguir la guía ¿Cómo crear un servidor casero mediante Debian? (parte 1) pueden seguir por aquí, que sería el siguiente paso. Esa guía se quedó incompleta al cerrar la web Forat.info.
La entrada ¿Cómo instalar y configurar un servidor web en Ubuntu 16.04? se publicó primero en forInformática.