08 - Servidores web: Apache

En esta práctica vamos a configurar un entorno básico con Apache, PHP y MariaDB usando Docker Compose. Con esta configuración, podrás disponer de un servidor web que ejecute código PHP y que utilice una base de datos MariaDB. Además, incluiremos PhpMyAdmin para gestionar la base de datos de forma gráfica.

Lo primero será crear una máquina Alpine base que será nuestra dmz (tendrá el servidor web y, más adelante, un servidor ftp para poder transferir archivos). Como siempre, creamos 2 adaptadores de red: eth0 con “Adaptador puente” para poder conectarnos vía ssh y eth1 con “Red interna” con nombre de red dmz.

A la tarjeta de red interna, le pondremos ip fija 172.39.2.2.

Para empezar, vamos a definir los servicios en el archivo docker-compose.yml para crear y configurar los contenedores de Apache con PHP, MariaDB y PhpMyAdmin. Usaremos las imágenes de docker smr-php-apache.tar, smr-mariadb.tar y smr-phpmyadmin.tar.

Crea una carpeta para tu proyecto (por ejemplo, mi-servidor-web) y dentro de esta carpeta, crea el archivo docker-compose.yml:

name: apache

services:
  web:
    image: smr/php:8.1-apache
    container_name: servidor-web
    ports:
      - "80:80"
    volumes:
      - ./www:/var/www/html
    depends_on:
      - db
    restart: always 

  db:
    image: smr/mariadb
    container_name: servidor-db
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./db:/var/lib/mysql
    restart: always 

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: servidor-phpmyadmin
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "8090:80"
    depends_on:
      - db
    restart: always 

  • web: Utiliza la imagen smr/php:8.1-apache, que incluye Apache y PHP 8.1. La carpeta www en tu máquina local se montará en /var/www/html, la raíz de documentos de Apache. Esto permitirá que puedas editar los archivos PHP localmente y ver los cambios en tiempo real.
  • db: Usa la imagen smr/mariadb para crear un contenedor de base de datos MariaDB. La contraseña de root se establece mediante la variable MYSQL_ROOT_PASSWORD. Además, los datos de la base de datos se almacenarán en la carpeta db en tu máquina local, lo que permite persistir los datos.
  • phpmyadmin: Proporciona una interfaz gráfica para administrar la base de datos MariaDB. Estará accesible en el puerto 8090 de tu máquina.

Dentro de la carpeta del proyecto, crea otras dos:

  • www: Aquí almacenaremos nuestros archivos PHP.
  • conf: Archivos de configuración de Apache.

Para comprobar que PHP se ejecuta correctamente, crea un archivo index.php dentro de la carpeta www con el siguiente contenido:

<?php
phpinfo();

Una vez creados los archivos y la estructura, levanta los tres servicios mediante docker compose.

Para comprobar que el servidor funciona, crearemos otra máquina virtual, pero esta vez usaremos un Linux con entorno gráfico: Lubuntu. El adapatador será “Red interna” con el mismo nombre que el servidor, dmz.

Al no tener servidor DHCP, le pondremos la ip 172.39.2.99.

Si abrimos el navegador y accedemos a 172.39.2.2, deberíamos ver la página de configuración de PHP, y si accedemos a 172.39.2.2:8089 nos debería abrir PhpMyAdmin.

Con esta configuración básica, tu servidor web Apache con PHP y MariaDB estará listo para ejecutar y probar aplicaciones web.

Una vez que los contenedores estén en funcionamiento, copia el contenido de la carpeta de configuración de Apache al directorio local:

docker cp servidor-web:/etc/apache2 ./conf

Esto nos permitirá modificar la configuración de apache desde la máquina local. Luego, modifica el archivo docker-compose.yml para incluir el mapeo de la carpeta de configuración de Apache:

name: apache

services:
  web:
    image: smr/php:8.1-apache
    container_name: servidor-web
    ports:
      - "80:80"
    volumes:
      - ./www:/var/www/html
      - ./conf:/etc/apache2
    depends_on:
      - db
    restart: always 

  db:
    image: smr/mariadb
    container_name: servidor-db
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./db:/var/lib/mysql
    restart: always 

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: servidor-phpmyadmin
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "8090:80"
    depends_on:
      - db
    restart: always 

Con esta configuración, tendremos todo el contenido de Apache mapeado correctamente, y podremos editar los archivos de configuración localmente en ./conf/apache2.

Para crear un sitio virtual en Apache, primero necesitamos definir la configuración del sitio en un archivo específico. Esto nos permitirá servir múltiples sitios desde el mismo servidor web.

Vamos a configurar dos sitios virtuales, www.web1.com y www.web2.com, cada uno con una web diferente.

Crea dos archivos en ./conf/apache2/sites-available (web1.conf y web2.conf) que contendrán la configuración de cada sitio:

<VirtualHost *:80>
   ServerName www.web1.com
   ServerAlias web1.com
   DocumentRoot /var/www/html/web1

   <Directory /var/www/html/web1>
      AllowOverride All
      Require all granted
   </Directory>

   ErrorLog ${APACHE_LOG_DIR}/web1-error.log
   CustomLog ${APACHE_LOG_DIR}/web1-access.log combined
</VirtualHost>

<VirtualHost *:80>
   ServerName www.web2.com
   ServerAlias web2.com
   DocumentRoot /var/www/html/web2

   <Directory /var/www/html/web2>
      AllowOverride All
      Require all granted
   </Directory>

   ErrorLog ${APACHE_LOG_DIR}/web2-error.log
   CustomLog ${APACHE_LOG_DIR}/web2-access.log combined
</VirtualHost>

  • ServerName: define el nombre del dominio que utilizarás para acceder al sitio.
  • ServerAlias: crea un alias para que sirva también la url web1.conf (o web2.conf), sin www.
  • DocumentRoot: establece la raíz del documento, que es la carpeta donde se encuentran los archivos de tu sitio.
  • <Directory>: se utiliza para especificar permisos y configuraciones para el directorio donde se encuentra tu sitio.
    • AllowOverride All: permite que los archivos .htaccess en el directorio anulen las configuraciones de Apache, proporcionando flexibilidad para personalizar la configuración sin necesidad de modificar los archivos de configuración principales.
    • Require all granted: concede acceso a todos los usuarios al contenido del directorio, asegurando que el sitio sea accesible públicamente.
  • ErrorLog: define la ubicación del archivo donde se registrarán los errores del sitio. En este caso, los errores se guardarán en miweb-error.log, permitiendo una revisión fácil y eficaz de cualquier problema que surja.
  • CustomLog: especifica la ubicación del archivo de registro de acceso del sitio, miweb-access.log. Usando el formato combined, este registro incluirá detalles sobre cada solicitud, como la dirección IP del visitante, el método HTTP, la URL solicitada, el código de estado de la respuesta, y el agente de usuario, facilitando el análisis del tráfico y la solución de problemas.

Ahora, crearemos las webs en sus respectivos directorios.

Bienvenido/a a sitio1

Bienvenido/a a sitio2

Una vez creados los archivos de configuración del sitio, debes habilitarlos para que Apache lo reconozca. Accede al contenedor del servidor web y ejecuta los siguientes comandos:

docker exec -it servidor-web sh
a2ensite web1.conf
a2ensite web2.conf

El comando a2ensite es una herramienta de administración de Apache que se utiliza para habilitar archivos de configuración de sitios virtuales.

Cuando ejecutas a2ensite web1.conf, Apache crea un enlace simbólico del archivo de configuración web1.conf en el directorio sites-enabled. Este directorio es donde Apache busca los sitios habilitados al arrancar o al recargar su configuración.

Habilitar un sitio mediante a2ensite es importante porque permite que Apache reconozca y sirva el sitio configurado. Si no habilitas el sitio, aunque hayas creado el archivo de configuración, Apache no lo cargará, lo que significa que el sitio no estará accesible desde el navegador.

Después de habilitar el sitio, es necesario aplicar los cambios en la configuración de Apache reiniciando el servicio.

service apache2 reload

Para poder acceder a tu sitio virtual desde Lubuntu usando el nombre de dominio definido (web1.com), añade una entrada en el archivo /etc/hosts de tu máquina local:

ip_servidor-web web1.com
ip_servidor-web web2.com

Esto permite que tu sistema reconozca el nombre de dominio y lo asocie con tu servidor local. Ahora puedes abrir tu navegador y acceder a http://web1.com. Si todo está configurado correctamente, deberías ver el mensaje “Bienvenido/a a sitio1” en la página.

En el siguiente tema, haremos un servidor DNS, con lo que ya no será necesario modificar el archivo /etc/hosts de las máquinas para poder visualizar las webs.

Para configurar subdominios en Apache, puedes crear archivos de configuración similares a los de los sitios virtuales, especificando el nombre del subdominio que deseas utilizar. Esto te permite servir diferentes aplicaciones o secciones de tu sitio bajo diferentes subdominios.

Al igual que hicimos para el sitio principal, crea un archivo de configuración para tu subdominio. Por ejemplo, blog.web1.conf y colócalo en ./conf/apache2/sites-available:

 
<VirtualHost *:80> 
    ServerName www.blog.web1.com 
    ServerAlias blog.web1.com
    DocumentRoot /var/www/html/web1/blog
    <Directory /var/www/html/web1/blog>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/blog-web1-error.log
    CustomLog ${APACHE_LOG_DIR}/blog-web1-access.log combined
</VirtualHost> 

Asegúrate de crear un directorio para tu subdominio en ./www/web1/blog y coloca un archivo index.php con el siguiente contenido:

 
Bienvenido/a a blog.web1.com

Accede al contenedor del servidor web y habilita el sitio del subdominio con el siguiente comando:

 
docker exec -it servidor-web sh 
a2ensite blog.web1.conf 

Para aplicar los cambios, envía la señal para recargar la configuración de Apache:

 
service apache2 reload

Para que Lubuntu reconozca el subdominio, añade una entrada en tu archivo /etc/hosts:

 
ip_servidor-web blog.web1.com

Esto permitirá que tu sistema asocie el subdominio con el servidor local. Ahora, al acceder a http://blog.web1.com, deberías ver el mensaje “Bienvenido/a a blog.web1.com” en el navegador.

Con esta configuración, ahora puedes servir múltiples subdominios desde tu servidor Apache, cada uno con su propio contenido y configuraciones específicas.

  • clase/smr/sr/1eval/apache.txt
  • Última modificación: 2025/10/30 08:45
  • por cesguiro