Introducción:
En un servidor Apache, la configuración de VirtualHosts permite alojar múltiples sitios web en una misma máquina, lo que resulta fundamental para administradores de sistemas y desarrolladores web. Esta funcionalidad es esencial en entornos donde se gestionan varios proyectos, ya sea en servidores de producción o en entornos de prueba.
En este tutorial, aprenderás a configurar sitios virtuales en Apache2, estableciendo distintos dominios o subdominios en un mismo servidor. A lo largo de la guía, se explicarán los pasos para crear directorios de sitios, definir VirtualHosts, asignar permisos y habilitar los sitios de manera correcta.
Estos tutoriales están basados en prácticas reales del segundo curso del ciclo superior de FP ASIR o ASIX en Valencia y están diseñados para estudiantes y principiantes que desean aprender a configurar Apache2 en distintos escenarios, como ya expliqué en este artículo.
En estos tutoriales guiados se pretende crear 3 portales web. Como únicamente tenemos un servidor web, haremos uso de servidores virtuales para alojar los 3 portales, que serán:
• http://www.semipresencial.net (acceso anónimo)
• http://software.semipresencial.net (acceso autentificado)
• https://secure.semipresencial.net (acceso autentificado y comunicación segura por https)
A través de estas guías paso a paso, te mostraré como:
✔ Configurar VirtualHosts para gestionar múltiples sitios en un servidor.
✔ Implementar autenticación con .htpasswd para proteger áreas sensibles.
✔ Habilitar HTTPS con certificados SSL autofirmados para asegurar conexiones.
Cada tutorial ofrece instrucciones claras y detalladas, permitiéndote aplicar estos conocimientos en entornos reales o pruebas en laboratorio.
¿Que es un VirtualHost en Apache2?
Un VirtualHost en Apache2 es una configuración que permite alojar múltiples sitios web en un solo servidor. Esto significa que un mismo servidor Apache puede gestionar diferentes dominios o subdominios sin necesidad de máquinas adicionales.
Imagina que quieres alojar dos páginas web. Una opción sería configurar dos servidores. Las desventajas de esta solución son considerables: desperdicio de recursos, costes elevados y doble trabajo en cuanto al mantenimiento. Ni te cuento si quieres alojar 10 o 100.
La solución es utilizar hosts virtuales. Gracias a la virtualización, todos los sitios se alojan en el mismo servidor y comparten los recursos de este. Por tanto, el número de host soportados dependerá de los recursos del sistema.
Aunque todos los host estén en el mismo servidor, la administración y ejecución de cada sitio web se realiza en un host virtual independiente.
Apache permite dos tipos de VirtualHosts:
VirtualHosts basados en nombre
- Se diferencian por el dominio o subdominio configurado.
- Son los más comunes, ya que permiten alojar varios sitios en la misma dirección IP.
- Se definen con ServerName y ServerAlias.
- Ejemplo: Un servidor con la IP 192.168.1.100 puede alojar los sitios midominio.com y otrodominio.com sin necesidad de una IP diferente para cada uno.
VirtualHosts basados en IP
- Cada sitio web tiene una dirección IP dedicada.
- Son menos comunes hoy en día, pero se utilizan cuando se necesita separar sitios por razones técnicas o de seguridad.
- Ejemplo: 192.168.1.101 para midominio.com y 192.168.1.102 para otrodominio.com.
¿Para qué se usan los VirtualHosts?
- Permiten alojar múltiples sitios en un solo servidor.
- Facilitan la organización de sitios de prueba y desarrollo.
- Son esenciales para proveedores de hosting y entornos empresariales.
En este tutorial, aprenderás a configurar VirtualHosts basados en nombre, que son los más utilizados para administrar varios sitios en Apache2.
Como ya dije este tutorial se engloba dentro de una unidad formativa realizada en el segundo curso del ciclo superior de FP ASYR o ASIX en Valencia, así que vamos con el tutorial nº1:
Cómo Configurar un Sitio Virtual en Apache2: Tutorial Paso a Paso
Como se requiere de pruebas en el navegador, esta práctica la puedes hacer directamente en el cliente Ubuntu, instalando ahí el servidor Apache. Aunque no habría problema en hacerlo en un Ubuntu Server.
Parámetros de la práctica
Crearé en una máquina virtual de VirtualBox un cliente Lubuntu Desktop con 2 GB de Ram y aunque no venga al caso, con dos tarjetas de red. Una conectada en modo NAT cuya IP la coge por DHCP y otra tarjeta conectada en modo Red Interna con la IP manual: 192.168.1.11/24
Preparación del entorno
Voy a instalar Apache2 en Lubuntu Desktop. Primero, me aseguro de tener el sistema actualizado. Abro la terminal y ejecuto:
sudo apt update && sudo apt upgrade -y
Instalar Apache
Escribo lo siguiente en la terminal:
sudo apt install apache2 -y
Este comando instalará Apache2 junto con las dependencias necesarias.
Una vez finalizada la instalación, verifico que el servicio esté funcionando con el siguiente comando:
sudo systemctl status apache2

Probar que Apache funciona:
Para probarlo abro un navegador en Lubuntu y escribo en la barra de direcciones: http://localhost

Primer portal: http://www.semipresencial.net (acceso anónimo)
Crear el directorio del sitio web:
Creo la carpeta donde se almacenarán los archivos del sitio web. Ejecutando este comando:
sudo mkdir -p /var/www/semipresencial

Desglose del comando:
- sudo:
- Este comando se utiliza para ejecutar otro comando con privilegios de superusuario (root). Esto es necesario porque la creación de directorios en ciertas ubicaciones del sistema, como /var/www/, requiere permisos administrativos.
- mkdir:
- Este es el comando que se utiliza para “hacer directorios” (make directories). Su función principal es crear nuevas carpetas o directorios en el sistema de archivos.
- -p:
- Esta es una opción del comando mkdir que significa “parents” (padres). Su función es crear directorios padres si no existen.
- En este caso, si el directorio /var/www/ no existe, la opción -p se asegurará de que se cree antes de intentar crear el directorio semipresencial. Esto evita errores si la estructura de directorios necesaria no está presente.
- Esta es una opción del comando mkdir que significa “parents” (padres). Su función es crear directorios padres si no existen.
- /var/www/semipresencial:
- Esta es la ruta completa del directorio que se va a crear.
- /var/www/ es una ubicación comúnmente utilizada en sistemas Linux para almacenar archivos de sitios web.
- semipresencial es el nombre del nuevo directorio que se creará dentro de /var/www/.
- Esta es la ruta completa del directorio que se va a crear.
La opción -p asegura que se creen todos los directorios necesarios en la ruta si no existen.
Resumen:
Este comando crea un directorio llamado “semipresencial” dentro del directorio “/var/www/“. La opción “-p” asegura que cualquier directorio padre necesario en la ruta se cree automáticamente. El comando “sudo” garantiza que se ejecute con los permisos necesarios.
Esto es muy comun cuando se esta configurando un servidor web, ya que el directorio “/var/www/” es donde se alojan los archivos de los sitios web. Por lo tanto con este comando se esta creando el directorio para alojar los archivos del sitio web “semipresencial”.
Los permisos que tiene son los correctos pero voy a cambiar el propietario de la carpeta al usuario actual, en este caso Jesus.
sudo chown -R $USER:$USER /var/www/semipresencial

Desglose del comando:
- sudo
- Este comando es esencial para ejecutar acciones que requieren privilegios de administrador (superusuario o “root”). En sistemas Linux, muchas operaciones de modificación de archivos y directorios, especialmente en áreas críticas del sistema como /var/www/, necesitan estos privilegios elevados.
- chown
- “chown” es la abreviatura de “change owner” (cambiar propietario). Su función principal es modificar el propietario y el grupo propietario de un archivo o directorio. Esto es crucial para controlar quién tiene permiso para acceder y modificar esos archivos.
- -R
- Esta opción es fundamental. La “R” significa “recursivo”. Cuando se usa, chown no solo cambia el propietario del directorio especificado, sino también de todos los archivos y subdirectorios que contiene. Esto es muy útil cuando necesitas aplicar cambios a una estructura de directorios completa.
- $USER:$USER
- Aquí es donde se especifica el nuevo propietario y grupo.
$USER es una variable de entorno que representa el nombre del usuario actual que está ejecutando el comando. Al usar $USER:$USER, estás indicando que tanto el propietario como el grupo propietario deben ser el mismo usuario que está utilizando la terminal.
En términos sencillos, estás dando la propiedad del directorio al usuario que está ejecutando el comando.
- Aquí es donde se especifica el nuevo propietario y grupo.
- /var/www/semipresencial
- Esta es la ruta completa del directorio al que se aplicarán los cambios de propietario.
- /var/www/ es un directorio estándar en sistemas Linux para almacenar archivos de sitios web.
- semipresencial es el nombre específico del directorio que estás modificando.
Resumen:
Este comando toma el directorio /var/www/semipresencial y, de forma recursiva, cambia su propietario y grupo propietario al usuario que está ejecutando el comando. Esto asegura que ese usuario tenga los permisos necesarios para trabajar con los archivos dentro de ese directorio.
Importancia:
- Seguridad: Controlar la propiedad de los archivos es vital para la seguridad del sistema. Impide que usuarios no autorizados modifiquen archivos críticos.
- Permisos de acceso: Asignar la propiedad correcta garantiza que el servidor web (como Apache) y el usuario puedan leer, escribir y ejecutar los archivos necesarios.
- Gestión de archivos: Facilita la administración de los archivos del sitio web, permitiendo al propietario realizar cambios sin problemas de permisos.
Crear la página principal:
Creo un archivo index.html con el mensaje de bienvenida “Bienvenido a portal público semipresencial.net”, con tamaño de H1 escribiendo el comando:
echo 'Bienvenido a portal público semipresencial.net
' | sudo tee /var/www/semipresencial/index.html

Desglose:
echo
:- Este comando se utiliza para mostrar texto en la salida estándar (normalmente la terminal). En este caso, se utiliza para generar una cadena de texto HTML.
'
:Bienvenido a portal público semipresencial.net
'- Esta es la cadena de texto que
echo
mostrará. Es una etiqueta HTML(encabezado de nivel 1) que contiene el mensaje “Bienvenido a portal público semipresencial.net”. Esto creará un encabezado grande en una página web.
- Esta es la cadena de texto que
|
|
(pipe):- Este símbolo es una “tubería”. Se utiliza para redirigir la salida del comando anterior (
echo
) a la entrada del siguiente comando (sudo tee
). En otras palabras, la salida delecho
se pasa como entrada altee
.
- Este símbolo es una “tubería”. Se utiliza para redirigir la salida del comando anterior (
sudo tee /var/www/semipresencial/index.html
sudo
:- Como antes,
sudo
se utiliza para ejecutar el comandotee
con privilegios de superusuario. Esto es necesario porque escribir en el directorio/var/www/semipresencial/
generalmente requiere permisos administrativos.
- Como antes,
tee
:- El comando
tee
lee la entrada estándar (en este caso, la salida deecho
) y la escribe tanto en la salida estándar (la terminal) como en uno o más archivos.
- El comando
/var/www/semipresencial/index.html
:- Esta es la ruta del archivo donde
tee
escribirá la entrada. En este caso, creará (o sobrescribirá) un archivo llamadoindex.html
en el directorio/var/www/semipresencial/
. Este archivo contendrá el código HTML generado porecho
.
- Esta es la ruta del archivo donde
Resumen:
Este comando combina varias acciones:
- Genera un fragmento de código HTML con un mensaje de bienvenida.
- Redirige esa salida al comando tee.
- tee toma esa salida y la escribe en un archivo llamado index.html dentro del directorio /var/www/semipresencial/.
- El uso de sudo asegura que el archivo se cree con los permisos necesarios.
En esencia, este comando crea una página web HTML simple que muestra un mensaje de bienvenida. Esto es muy común cuando se configura un sitio web, ya que el archivo “index.html” es el que se muestra por defecto cuando se accede a un directorio en un servidor web.
Se podría haber creado también con nano con la orden:
sudo nano /var/www/semipresencial/index.html

Configurar el archivo del servidor virtual:
Copiar la plantilla base de configuración de Apache:
Cada server virtual debe de tener su propio archivo de configuración.
Debo crear un archivo de configuración (extensión .conf) en la carpeta donde se guardan los archivos de configuración de Apache ( /etc/apache2/sites-available) Para no crear desde cero este archivo voy a tomar como base el archivo de configuración por defecto que suele tener el nombre:
000-default.conf. Por tanto ejecuto el siguiente comando:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/semipresencial.conf

Desglose:
sudo
- Como en los comandos anteriores,
sudo
se utiliza para ejecutar el comando con privilegios de superusuario (root). Esto es necesario porque la copia de archivos en directorios del sistema, como/etc/apache2/sites-available/
, requiere permisos administrativos.
cp
cp
es el comando que se utiliza para “copiar” archivos y directorios. Su función principal es crear una copia de un archivo o directorio en una ubicación diferente.
/etc/apache2/sites-available/000-default.conf
- Esta es la ruta completa del archivo que se va a copiar.
/etc/apache2/sites-available/
es el directorio donde Apache almacena los archivos de configuración de los sitios virtuales disponibles.000-default.conf
es el archivo de configuración predeterminado de Apache. Este archivo contiene la configuración básica de un sitio virtual.
/etc/apache2/sites-available/semipresencial.conf
- Esta es la ruta completa del archivo que se va a crear (la copia).
/etc/apache2/sites-available/
(nuevamente) es el directorio de destino.semipresencial.conf
es el nombre del nuevo archivo que se creará como copia de000-default.conf
.
Resumen
Este comando copia el archivo de configuración predeterminado de Apache (000-default.conf
) y crea una copia llamada semipresencial.conf
en el mismo directorio. Esto es un paso común al configurar nuevos sitios virtuales en Apache, ya que permite utilizar la configuración predeterminada como punto de partida y personalizarla según las necesidades del nuevo sitio.
Importancia:
- Configuración base:
000-default.conf
proporciona una configuración base funcional para un sitio virtual. Al copiarlo, se evita tener que escribir la configuración desde cero. - Personalización: Al tener una copia, se puede modificar
semipresencial.conf
sin afectar la configuración predeterminada. Esto permite adaptar la configuración a los requisitos específicos del sitio “semipresencial“. - Gestión de sitios virtuales: Este paso es fundamental para crear y gestionar múltiples sitios virtuales en un servidor Apache. Permite mantener configuraciones separadas para cada sitio.
Abrir el archivo y editarlo:
sudo nano /etc/apache2/sites-available/semipresencial.conf
Cambiar las siguientes líneas:
• ServerName www.semipresencial.net
• ServerAdmin [email protected]
• DocumentRoot /var/www/semipresencial
• ErrorLog ${APACHE_LOG_DIR}/error_www-semipresencial-net.log
• CustomLog ${APACHE_LOG_DIR}/access_www-semipresencial-net.log combined

Debajo de “CustomLog” añado:
AllowOverride All
Require all granted

Guardar y cerrar
Activar el sitio virtual
Activo la configuración del servidor virtual:
sudo a2ensite semipresencial.conf

Crea un enlace simbólico en /etc/apache2/sites-enabled hacia el archivo /etc/apache2/sites-available/semipresencial.conf.
El mensaje me está indicando que he habilitado correctamente la configuración del sitio virtual semipresencial. Sin embargo, para que los cambios surtan efecto, necesito recargar el servicio de Apache.
Para hacerlo, ejecuto el siguiente comando:
sudo systemctl reload apache2
Añadir el dominio a “/etc/hosts”:
Para que funcione localmente añado el dominio al archivo “hosts”:
echo "127.0.0.1 www.semipresencial.net" | sudo tee -a /etc/hosts
O bien lo edito directamente con nano y agrego manualmente la linea:
sudo nano /etc/hosts
Dentro del archivo, añado esta línea debajo de la ya existente: 127.0.0.1 CliLubJesus.
127.0.0.1 www.semipresencial.net
Guardo y cierro.

Personalmente me gusta más esta última opción, aunque son válidas las dos.
Reiniciar Apache:
Aplico los cambios reiniciando Apache:
sudo systemctl restart apache2
Compruebo que esté activo con:
sudo systemctl status apache2

Probar el servidor:
Abro el navegador y escribo:
http://www.semipresencial.net

Codificación de caracteres:
El archivo index.html que creé no tiene correctamente configurada la codificación de caracteres. Esto ocurre porque los navegadores necesitan que se especifique que el contenido está en formato UTF-8 para mostrar correctamente los caracteres especiales como “í” o “ó” o “ñ” etc.
Modificar el archivo index.html
Abro el archivo index.html con nano:
sudo nano /var/www/semipresencial/index.html
Agregar la declaración de codificación: Me aseguro de que el archivo tenga el siguiente contenido:
Semipresencial
Bienvenido a portal público semipresencial.net
La línea especifica que el contenido está en UTF-8, una codificación que permite caracteres especiales como acentos.
Guardar y salir

Revisar en el navegador:
Vuelvo a cargar la página en el navegador
http://www.semipresencial.net

Conclusión
Configurar VirtualHosts en Apache2 es una habilidad esencial para gestionar múltiples sitios web en un solo servidor. Con esta guía, aprendiste a crear directorios de sitios, definir archivos de configuración, habilitar sitios y probar su funcionamiento.
Esta técnica es fundamental tanto para entornos de desarrollo como para producción, con lo que permite una gestión eficiente de dominios y subdominios. Ahora se pueden seguir explorando mejoras, como la configuración de HTTPS con SSL o la implementación de autenticación con .htpasswd para proteger tu sitio en los siguientes tutoriales que realizaré.
Un saludo y hasta el próximo artículo





