Configuración de servidor web Apache

configuracion-de-servidor-web-apache
configuracion-de-servidor-web-apache

Configurar un servidor web Apache consiste en preparar el servicio para que pueda recibir peticiones HTTP o HTTPS, localizar el sitio correcto, entregar los archivos adecuados y aplicar reglas básicas de seguridad, rendimiento y mantenimiento. Apache HTTP Server sigue siendo una de las opciones más usadas para publicar páginas web, aplicaciones PHP, paneles internos, APIs y sitios corporativos porque es estable, flexible y tiene una enorme cantidad de módulos.

En esta guía veremos una configuración práctica desde cero: instalación, estructura de archivos, hosts virtuales, módulos importantes, permisos, HTTPS, logs, reglas de seguridad y comprobaciones finales. El objetivo no es memorizar cada directiva de Apache, sino entender qué se configura, dónde se configura y cómo diagnosticar problemas comunes.

👉 Y recuerda, si quieres aprender más de Linux, pincha en este curso de Linux gratis

👉 También te dejo por aquí una guía de comandos Linux por categorías

Qué es Apache y cómo funciona

Apache es un servidor web. Su función principal es escuchar conexiones en uno o varios puertos, normalmente el puerto 80 para HTTP y el 443 para HTTPS, interpretar la petición del navegador y devolver una respuesta. Esa respuesta puede ser un archivo HTML, una imagen, una hoja CSS, una descarga, una redirección o el resultado generado por una aplicación.

Apache se organiza mediante archivos de configuración. En distribuciones basadas en Debian o Ubuntu, la configuración suele estar en /etc/apache2/. En sistemas Red Hat, Rocky Linux, AlmaLinux o CentOS, suele encontrarse en /etc/httpd/. Aunque cambie la ruta, la lógica es muy parecida: hay una configuración global, módulos que se activan o desactivan, sitios definidos como hosts virtuales y archivos de log para revisar lo que ocurre.

Un concepto clave es el de host virtual. Un mismo servidor puede alojar varios dominios, por ejemplo example.com, tienda.example.com y blog.example.net. Apache decide qué configuración usar leyendo el dominio de la petición y comparándolo con las directivas ServerName y ServerAlias.

Instalación de servidor web Apache

En Debian o Ubuntu, Apache se instala desde los repositorios oficiales:

sudo apt update
sudo apt install apache2

Después de instalarlo, se puede comprobar el estado del servicio:

sudo systemctl status apache2

En Rocky Linux, AlmaLinux, CentOS o Fedora, el paquete suele llamarse httpd:

sudo dnf install httpd
sudo systemctl enable --now httpd
sudo systemctl status httpd

Si el servicio está activo, el navegador debería mostrar la página por defecto al visitar la IP del servidor. Si no carga, conviene revisar tres puntos: que Apache esté iniciado, que el firewall permita tráfico web y que el servidor sea accesible desde la red.

Puertos y firewall

Apache normalmente escucha en los puertos 80 y 443. El puerto 80 se usa para HTTP sin cifrado. El puerto 443 se usa para HTTPS con certificado TLS. En servidores públicos, lo habitual es permitir ambos, redirigiendo después todo el tráfico HTTP hacia HTTPS.

En Ubuntu con UFW:

sudo ufw allow 'Apache Full'
sudo ufw status

También se pueden abrir los puertos directamente:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

En sistemas con firewalld:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Una configuración correcta de Apache no servirá de mucho si el firewall bloquea las conexiones. Por eso, cuando una página no carga desde fuera pero sí responde localmente, el firewall y las reglas del proveedor de hosting son los primeros lugares que conviene revisar.

Estructura de configuración en Debian y Ubuntu

En Debian y Ubuntu, Apache tiene una estructura muy cómoda:

/etc/apache2/
├── apache2.conf
├── ports.conf
├── mods-available/
├── mods-enabled/
├── sites-available/
├── sites-enabled/
├── conf-available/
└── conf-enabled/

apache2.conf contiene la configuración principal. ports.conf define los puertos en los que Apache escucha. mods-available contiene módulos disponibles y mods-enabled contiene enlaces a los módulos activos. Lo mismo ocurre con los sitios: sites-available guarda configuraciones disponibles y sites-enabled contiene las configuraciones activas.

Esta separación evita editar todo en un único archivo enorme. Lo recomendable es crear un archivo de configuración por sitio dentro de sites-available y activarlo con a2ensite.

Crear el directorio del sitio

Antes de crear el host virtual, conviene preparar el directorio donde vivirán los archivos del sitio. Una ruta común es /var/www/nombre-del-sitio.

sudo mkdir -p /var/www/configuracion-apache/public_html

Después, se asigna la propiedad al usuario que administrará los archivos:

sudo chown -R $USER:www-data /var/www/configuracion-apache

Y se aplican permisos razonables:

sudo find /var/www/configuracion-apache -type d -exec chmod 755 {} \;
sudo find /var/www/configuracion-apache -type f -exec chmod 644 {} \;

Estos permisos permiten que Apache lea el contenido sin dejar archivos ejecutables o modificables innecesariamente. En sitios con aplicaciones que necesitan escribir en ciertas carpetas, como WordPress en wp-content/uploads, los permisos deben ajustarse con más cuidado solo en esas rutas concretas.

Crear una página de prueba

Para comprobar que el host virtual funciona, se puede crear un index.html sencillo:

nano /var/www/configuracion-apache/public_html/index.html

Contenido de ejemplo:

<!doctype html>
<html lang="es">
<head>
  <meta charset="utf-8">
  <title>Configuración Apache</title>
</head>
<body>
  <h1>Apache funciona correctamente</h1>
  <p>Este sitio se sirve desde un host virtual propio.</p>
</body>
</html>

Esta prueba permite separar dos tipos de problemas: si Apache sirve este archivo, el servidor web funciona; si después falla una aplicación concreta, el problema probablemente está en la aplicación, en PHP, en la base de datos o en sus permisos.

Configurar un host virtual

Un host virtual indica a Apache qué dominio atender, qué carpeta usar como raíz del sitio y qué reglas aplicar. En Debian o Ubuntu, se puede crear un archivo como este:

sudo nano /etc/apache2/sites-available/configuracion-apache.conf

Ejemplo básico:

<VirtualHost *:80>
    ServerName ejemplo.com
    ServerAlias www.ejemplo.com
    ServerAdmin [email protected]

    DocumentRoot /var/www/configuracion-apache/public_html

    <Directory /var/www/configuracion-apache/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

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

La directiva ServerName define el dominio principal. ServerAlias permite añadir variantes, como el subdominio www. DocumentRoot indica la carpeta pública del sitio. El bloque Directory define permisos y comportamiento para esa carpeta.

La línea Options -Indexes es especialmente importante. Desactiva el listado automático de directorios, evitando que Apache muestre el contenido de una carpeta cuando no existe un archivo índice. AllowOverride All permite que archivos .htaccess modifiquen ciertas reglas, algo habitual en WordPress y otros CMS. Si no se necesita .htaccess, es mejor usar una configuración más restrictiva para mejorar rendimiento y control.

Para activar el sitio:

sudo a2ensite configuracion-apache.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

apache2ctl configtest comprueba la sintaxis antes de recargar. Es una práctica esencial, porque evita reiniciar el servicio con una configuración rota.

Desactivar el sitio por defecto

En instalaciones nuevas, el servidor web Apache suele traer un sitio por defecto activo. Si se va a servir un dominio propio, conviene desactivarlo:

sudo a2dissite 000-default.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

No siempre es obligatorio, pero reduce confusiones. Si una petición llega sin coincidir con ningún dominio configurado, Apache usa el primer host virtual cargado. Mantener activo el sitio por defecto puede hacer que aparezca una página inesperada al visitar una IP o un dominio mal apuntado.

Configuración en Red Hat / Rocky Linux

En sistemas tipo Red Hat, el archivo principal suele estar en /etc/httpd/conf/httpd.conf, y las configuraciones adicionales se guardan en /etc/httpd/conf.d/.

Un host virtual puede crearse así:

sudo nano /etc/httpd/conf.d/configuracion-apache.conf

Ejemplo:

<VirtualHost *:80>
    ServerName ejemplo.com
    ServerAlias www.ejemplo.com
    DocumentRoot /var/www/configuracion-apache/public_html

    <Directory /var/www/configuracion-apache/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /var/log/httpd/configuracion-apache-error.log
    CustomLog /var/log/httpd/configuracion-apache-access.log combined
</VirtualHost>

Después:

sudo apachectl configtest
sudo systemctl reload httpd

La idea es la misma, aunque cambien los comandos de activación. En Red Hat no se usan a2ensite o a2enmod por defecto; normalmente se coloca el archivo .conf en conf.d y Apache lo carga automáticamente.

Activar módulos importantes

Apache puede ampliar sus funciones mediante módulos. Algunos de los más comunes son:

rewrite: permite reescrituras de URL y enlaces permanentes amigables.

ssl: habilita HTTPS.

headers: permite añadir o modificar cabeceras HTTP.

expires: controla caché mediante cabeceras de expiración.

proxy y proxy_http: permiten usar Apache como proxy inverso hacia una aplicación interna.

En Ubuntu o Debian, se activan con a2enmod:

sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod expires
sudo systemctl reload apache2

En sistemas Red Hat, muchos módulos ya están disponibles si el paquete correspondiente está instalado. La configuración puede variar según la versión, por lo que conviene revisar /etc/httpd/conf.modules.d/.

Redirección de HTTP a HTTPS

Aunque Certbot puede crear la redirección, es útil entender cómo funciona. Un host virtual en el puerto 80 puede redirigir todo el tráfico a HTTPS:

<VirtualHost *:80>
    ServerName ejemplo.com
    ServerAlias www.ejemplo.com
    Redirect permanent / https://ejemplo.com/
</VirtualHost>

El host virtual HTTPS sería el encargado de servir el sitio real:

<VirtualHost *:443>
    ServerName ejemplo.com
    ServerAlias www.ejemplo.com
    DocumentRoot /var/www/configuracion-apache/public_html

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/ejemplo.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ejemplo.com/privkey.pem

    <Directory /var/www/configuracion-apache/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

En la práctica, si se usa Certbot, este archivo puede quedar dividido o modificado automáticamente. Aun así, revisar la configuración ayuda a detectar duplicidades o redirecciones en bucle.

Configurar Apache para WordPress

WordPress funciona muy bien con Apache, especialmente cuando se usa mod_rewrite para enlaces permanentes. Una configuración típica necesita permitir .htaccess en la carpeta pública:

<Directory /var/www/wordpress/public_html>
    Options -Indexes +FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

Después se activa el módulo de reescritura:

sudo a2enmod rewrite
sudo systemctl reload apache2

Dentro de WordPress, al guardar los enlaces permanentes, el CMS genera reglas en .htaccess. Si las páginas internas devuelven error 404 pero la portada funciona, suele ser señal de que mod_rewrite no está activo o AllowOverride no permite leer las reglas.

Para un entorno más controlado, las reglas de WordPress pueden trasladarse del .htaccess al host virtual, pero eso exige administrar los cambios manualmente. En sitios compartidos o administrados por usuarios no técnicos, .htaccess sigue siendo una solución práctica.

Logs de Apache

Los logs son la herramienta principal para diagnosticar problemas. Apache registra accesos y errores. En Debian o Ubuntu suelen estar en /var/log/apache2/; en Red Hat, en /var/log/httpd/.

Para ver errores recientes:

sudo tail -f /var/log/apache2/error.log

Si el host virtual tiene logs propios:

sudo tail -f /var/log/apache2/configuracion-apache-error.log

El log de errores puede mostrar problemas de permisos, módulos no cargados, errores de sintaxis, certificados incorrectos o fallos al acceder a archivos. El log de accesos muestra qué URLs se están solicitando, desde qué IPs y con qué códigos de respuesta.

Los códigos más frecuentes son:

200: respuesta correcta.

301 o 302: redirección.

403: acceso prohibido.

404: recurso no encontrado.

500: error interno del servidor.

502 o 503: habituales cuando Apache actúa como proxy y la aplicación de destino no responde.

Permisos y propietario de archivos

Muchos errores de Apache se deben a permisos. El servidor necesita leer los archivos públicos, pero no debería tener permisos excesivos. Una base razonable para archivos estáticos es:

sudo find /var/www/sitio -type d -exec chmod 755 {} \;
sudo find /var/www/sitio -type f -exec chmod 644 {} \;

El propietario depende del flujo de trabajo. En un servidor administrado por una persona, puede ser cómodo que el usuario despliegue archivos y que el grupo pertenezca al usuario web. En un servidor con despliegue automatizado, puede haber un usuario específico para la aplicación.

Lo importante es evitar soluciones como chmod 777. Aunque pueden hacer que un error desaparezca, abren la puerta a modificaciones no deseadas y problemas de seguridad. Si Apache no puede leer un archivo, lo correcto es identificar qué usuario ejecuta el proceso y ajustar propietario, grupo o permisos de forma precisa.

Seguridad básica en Apache

Una instalación por defecto puede funcionar, pero no siempre está endurecida. Algunas medidas básicas ayudan mucho.

Primero, desactivar el listado de directorios:

Options -Indexes

Segundo, reducir la información expuesta por el servidor. En Debian o Ubuntu, se puede ajustar en /etc/apache2/conf-available/security.conf:

ServerTokens Prod
ServerSignature Off

Tercero, añadir cabeceras de seguridad con mod_headers:

Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"

También puede añadirse una política HSTS cuando el sitio ya funciona correctamente solo con HTTPS:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

HSTS debe activarse con cuidado. Si se configura mal en un dominio o subdominios que no tienen HTTPS preparado, los navegadores pueden bloquear el acceso.

Rendimiento y compresión

Apache puede comprimir respuestas para reducir transferencia y mejorar tiempos de carga. En Debian o Ubuntu:

sudo a2enmod deflate
sudo systemctl reload apache2

Una configuración básica puede incluir:

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
    AddOutputFilterByType DEFLATE application/javascript application/json
</IfModule>

También se pueden definir reglas de caché con mod_expires:

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/webp "access plus 1 month"
    ExpiresByType text/css "access plus 1 week"
    ExpiresByType application/javascript "access plus 1 week"
</IfModule>

La caché mejora el rendimiento, pero hay que aplicarla con criterio. En archivos que cambian a menudo, una caché larga puede hacer que los usuarios vean versiones antiguas. Por eso muchas aplicaciones añaden versiones a los nombres de archivos CSS y JavaScript.

Apache como proxy inverso

Apache también puede colocarse delante de aplicaciones que corren en otro puerto, como Node.js, Python, Java o contenedores. En ese caso, Apache recibe la petición pública y la reenvía a una aplicación interna.

Primero se activan los módulos necesarios:

sudo a2enmod proxy proxy_http headers
sudo systemctl reload apache2

Ejemplo de host virtual:

<VirtualHost *:80>
    ServerName app.ejemplo.com

    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/

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

Este patrón es útil cuando la aplicación no debe exponerse directamente a internet. Apache gestiona el dominio, HTTPS, logs y algunas cabeceras, mientras la aplicación escucha solo en localhost.

Conclusión

La configuración de un servidor web Apache se entiende mejor como una suma de piezas: servicio activo, puertos abiertos, dominio apuntando al servidor, host virtual correcto, permisos adecuados, módulos necesarios y logs bien ubicados. Cuando cada pieza está clara, Apache deja de ser una caja negra y se convierte en una herramienta predecible.

La mejor práctica para la configuracion de un servidor web Apache, es avanzar por pasos: instalar, probar la página por defecto, crear el directorio del sitio, activar el host virtual, comprobar logs, añadir HTTPS y endurecer la configuración. Así, si algo falla, sabrás exactamente en qué punto buscar.

Comentarios

No hay comentarios aún. ¿Por qué no comienzas el debate?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *