Configuración básica de Apache.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: https://www.alcancelibre.org

Licencia Creative Commons
© 1999-2026 Joel Barrios Dueñas. Este manual se distribuye bajo la licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional (CC BY-NC-SA 4.0). Usted es libre de compartir y adaptar el material bajo los siguientes términos: debe dar crédito al autor, no puede utilizarlo para fines comerciales y debe compartir las obras derivadas bajo la misma licencia. La licencia completa está disponible en https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.es.

Introducción.

Apache, aunque ha mejorado mucho su rendimiento en años recientes, fue diseñado para un Internet muy distinto al actual. Esta realidad explica su pérdida de popularidad frente a alternativas como Nginx. Sin embargo, sigue siendo una herramienta poderosa, didáctica y ampliamente soportada, perfecta para entornos de aprendizaje, desarrollo y despliegues donde su modelo de procesos y su extensa modularidad resultan ventajosos.

Acerca del protocolo HTTP.

HTTP (Hypertext Transfer Protocol o Protocolo de Trasferencia de Hipertexto) es el método utilizado para transferir o transportar información a través de Internet y la World Wide Web (WWW). Su propósito original fue proveer una forma de publicar y recuperar documentos en formato HTML.

El desarrollo del protocolo fue coordinado por el World Wide Web Consortium y la IETF (Internet Engineering Task Force o Fuerza de Trabajo en Ingeniería de Internet), culminando con la publicación de varios RFC (Request For Comments), de entre los que destaca el RFC 2616, mismo que define la versión 1.1 del protocolo, que es la utilizada hoy en día.

HTTP es un protocolo de solicitud y respuesta a través de TCP, entre agentes de usuario (navegadores, motores de índice y otras herramientas) y servidores, regularmente utilizando el puerto 80. En la comunicación entre éstos puede intervenir otros tipos de implementaciones, como servidores intermediarios (proxies), puertas de enlace y túneles.

URL: https://datatracker.ietf.org/doc/html/rfc2616

Acerca de Apache.

Apache es un servidor HTTP de código fuente abierto y licenciamiento libre que funciona en Linux, sistemas operativos derivados de Unix™, Windows™, Novell™ Netware y otras plataformas. Aunque ha perdido popularidad en años recientes por el crecimiento de Nginx, históricamente ha tenido un papel muy importante en el crecimiento de Internet y continúa siendo uno de los servidores HTTP más utilizados, siendo además el servidor de facto contra el cual se realizan las pruebas comparativas y de desempeño para otros productos competidores. Es desarrollado y mantenido por una comunidad de desarrolladores auspiciada por la Apache Software Foundation.

URL: https://www.apache.org

Equipamiento lógico (software) necesario.

Para instalar y configurar Apache, junto con sus extensiones más comunes, se requieren los siguientes paquetes. Los procedimientos se presentan para las distribuciones modernas basadas en RHEL (utilizando dnf) y para ALDOS (utilizando yum).

En AlmaLinux, Rocky Linux y Red Hat™ Enterprise Linux.

Para instalar el servidor Apache (httpd), el soporte para SSL/TLS, PHP, Perl y Python, así como el navegador en terminal Lynx, ejecute los siguientes mandatos:

dnf -y install httpd
dnf -y install mod_ssl
dnf -y install php-fpm php-mysql php-pgsql
dnf -y install mod_perl python3-mod_wsgi
dnf -y install lynx

En ALDOS y sistemas que utilicen yum.

En ALDOS, la distribución basada en Fedora/RHEL que utiliza yum como gestor de paquetes predeterminado, ejecute los siguientes mandatos equivalentes:

yum -y install httpd
yum -y install mod_ssl
yum -y install php-fpm php-mysql php-pgsql
yum -y install mod_perl python39-mod_wsgi
yum -y install lynx

Nota sobre las rutas de contenido: Por estándar, los contenidos de servicios HTTP/HTTPS pueden ubicarse debajo de /srv/www. Sin embargo, ALDOS, Fedora, RHEL y sus derivados utilizan de facto /var/www. Siguiendo los procedimientos de este documento, se puede trabajar indistintamente con una u otra ruta a elección del administrador.

Alias útil para Lynx: Para hacer más amigable el uso del navegador Lynx desde la terminal, evitando el diálogo de aceptación de galletas (cookies) y haciendo visible el cursor, puede añadir el siguiente alias al archivo ~/.bashrc de su usuario:

alias lynx="/usr/bin/lynx -accept_all_cookies -show_cursor"

Modificaciones necesarias en el muro cortafuegos (firewall).

Es necesario abrir los puertos 80/TCP (HTTP) y 443/TCP (HTTPS) en el muro cortafuegos para permitir el tráfico web. Utilice firewall-cmd para añadir los servicios correspondientes de forma permanente:

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

Iniciar servicio y añadirlo al arranque del sistema.

A continuación, se describen los mandatos para gestionar el servicio httpd (Apache) tanto en sistemas con Systemd como en aquellos que utilizan SysVinit, como ALDOS.

En AlmaLinux, Rocky Linux y Red Hat™ Enterprise Linux (Systemd).

Utilice los siguientes mandatos systemctl para gestionar el servicio:

# Habilitar el servicio para que inicie con el sistema
systemctl enable httpd

# Iniciar el servicio
systemctl start httpd

# Reiniciar el servicio (interrumpe conexiones activas)
systemctl restart httpd

# Recargar la configuración sin interrumpir conexiones
systemctl reload httpd

# Detener el servicio
systemctl stop httpd

En ALDOS y sistemas que utilicen SysVinit.

Utilice los siguientes mandatos chkconfig y service para gestionar el servicio:

# Activar el servicio en todos los niveles de ejecución
chkconfig httpd on

# Iniciar el servicio
service httpd start

# Reiniciar el servicio (interrumpe conexiones activas)
service httpd restart

# Recargar la configuración sin interrumpir conexiones
service httpd reload

# Detener el servicio
service httpd stop

SELinux y Apache.

En AlmaLinux, Rocky Linux y Red Hat™ Enterprise Linux, de modo predeterminado SELinux viene activo en modo obligatorio (enforcing). Éste añade una capa de seguridad y protección adicional. Algunas de sus políticas impedirán utilizar ciertas funciones, como directorios virtuales fuera de /var/www, directorios ~/public_html, el envío de correo electrónico desde aplicaciones web, entre otras.

Desactivar por completo SELinux en un sistema operativo para servidores —en lugar de intentar aprender a configurarlo correctamente— dista de ser una práctica profesional responsable. Tal acción denota un desconocimiento de aspectos de seguridad fundamentales en las distribuciones empresariales de Linux y expone el sistema a riesgos innecesarios.

Políticas más utilizadas.

A continuación, se listan las políticas (booleans) de SELinux más comunes para Apache, que pueden habilitarse o deshabilitarse según las necesidades del servicio.

# Permitir el envío de correo electrónico (necesario para webmails)
setsebool -P httpd_can_sendmail=1

# Permitir que Apache lea contenidos en los directorios de inicio de usuarios
setsebool -P httpd_read_user_content=1

# Habilitar el uso de directorios ~/public_html para usuarios o anfitriones virtuales
setsebool -P httpd_enable_homedirs=1

# Permitir a Apache gestionar directorios vía FTP o actuar como servidor FTP
setsebool -P httpd_enable_ftp_server=1

# Desactivar la ejecución de guiones de instrucciones (*scripts*) CGI
setsebool -P httpd_enable_cgi=0

# Permitir Inclusiones del Lado del Servidor (SSI)
setsebool -P httpd_ssi_exec=1

# Permitir conexiones de red hacia bases de datos en otros servidores
setsebool -P httpd_can_network_connect_db=1

# Permitir conexiones de red hacia otros servicios (ej: sieve en Roundcube)
setsebool -P httpd_can_network_connect=1

# Desactivar la ejecución de lenguajes de programación integrados (ej: mod_php antiguo)
setsebool -P httpd_builtin_scripting=0

# Permitir conexiones a puertos de OpenStack
setsebool -P httpd_use_openstack=1

# Consultar todas las políticas disponibles para Apache
getsebool -a | grep httpd

# Consultar políticas con descripción
semanage boolean -l | grep httpd

Nota: Las políticas httpd_can_sendmail e httpd_read_user_content son indispensables para el funcionamiento de cualquier cliente de correo electrónico basado en web (webmail).

Contextos más utilizados.

SELinux utiliza contextos de seguridad en archivos y directorios. El contenido dentro de /var/www hereda automáticamente el contexto httpd_sys_content_t. Para utilizar rutas alternativas como /srv/www, es necesario asignar los contextos adecuados.

# Asignar contexto para contenido web en una ruta personalizada
chcon -t httpd_sys_content_t /srv/www/dominio/public_html

# Asignar contexto para directorio de guiones CGI ejecutables
chcon -t httpd_sys_script_exec_t /srv/www/dominio/cgi-bin

# Contexto para archivos PHP con permisos de sólo lectura
chcon -t httpd_sys_script_ro_t /srv/www/dominio/public_html/leer.php

# Contexto para archivos PHP con permisos de lectura y escritura (cache, config, etc.)
chcon -t httpd_sys_script_rw_t /srv/www/dominio/public_html/escribir.php

Para hacer que un contexto sea permanente (se restaure tras ejecutar restorecon), utilice semanage fcontext:

semanage fcontext -a -t httpd_sys_rw_content_t \
    /srv/www/dominio/public_html/leer.php

Procedimientos.

Esta sección cubre configuraciones prácticas comunes para Apache, como la creación de directorios virtuales, control de acceso y ajustes específicos para PHP.

Archivos de configuración.

Cualquier ajuste que se requiera realizar, ya sea para configurar anfitriones virtuales u otra funcionalidad adicional, puede realizarse sin modificar el archivo principal /etc/httpd/conf/httpd.conf. Basta con crear cualquier archivo con extensión .conf dentro del directorio /etc/httpd/conf.d/. Apache incluirá automáticamente estos archivos al recargar su configuración.

Ocultar la versión de Apache.

Por defecto, Apache muestra su versión en páginas de error e índices, e incluye el método TRACE, lo que puede facilitar ataques de tipo Cross-Site Tracing (XST). Una buena práctica de seguridad es ocultar esta información.

Cree un nuevo archivo de configuración llamado /etc/httpd/conf.d/serversignature.conf:

vim /etc/httpd/conf.d/serversignature.conf

Añada el siguiente contenido:

ServerSignature Off
ServerTokens Prod
TraceEnable Off

Guarde los cambios y recargue el servicio para aplicar la nueva configuración:

systemctl reload httpd

O bien, en sistemas con SysVinit:

service httpd reload

Directorios virtuales.

El siguiente ejemplo añade un alias para el directorio /srv/www/ejemplo/, que se accederá desde la URL http://127.0.0.1/ejemplo/.

Primero, prepare el directorio y su contexto SELinux:

mkdir -p /srv/www/ejemplo
chcon -t httpd_sys_content_t /srv/www
semanage fcontext -a -t httpd_sys_content_t /srv/www
ls -Z /srv/www

Cree el archivo de configuración del directorio virtual /etc/httpd/conf.d/ejemplos.conf:

vim /etc/httpd/conf.d/ejemplos.conf

Añada la siguiente configuración básica:

Alias /ejemplo /srv/www/ejemplo

Recargue el servicio. Al acceder a la URL, se mostrará un error 403 (acceso denegado) porque se carece de un archivo índice. Para permitir listar el contenido del directorio, modifique la configuración añadiendo una directiva <Directory>:

Alias /ejemplo /srv/www/ejemplo
<Directory "/srv/www/ejemplo">
    Options Indexes
    Require local
    Require all granted
</Directory>

La opción Indexes permite listar el contenido del directorio cuando se carece de un archivo index.html. En Apache 2.4, la política predeterminada es denegar el acceso, por lo que se necesita Require all granted.

Recargue el servicio nuevamente. Ahora puede verificar el acceso con el navegador Lynx:

lynx http://127.0.0.1/ejemplo/

Para añadir más funcionalidades como Inclusiones del Lado del Servidor (SSI), enlaces simbólicos controlados y el uso de archivos .htaccess, puede extender la configuración:

Alias /ejemplo /srv/www/ejemplo
<Directory "/srv/www/ejemplo">
    Options Indexes Includes SymLinksIfOwnerMatch
    AllowOverride all
    Require local
    Require all granted
</Directory>

Nota: Un error común es escribir incorrectamente AllowOverride, que debe de ir con doble 'r'.

Limitar el acceso a directorios por dirección IP.

Puede combinar el control de acceso basado en IP con otras directivas. El siguiente ejemplo permite el acceso sólo desde la máquina local (127.0.0.0/8) y desde el segmento de red 192.168.70.0/25:

Alias /ejemplo /srv/www/ejemplo
<Directory "/srv/www/ejemplo">
    Require local
    Require ip 192.168.70.0/25
    Options Indexes
</Directory>

Recuerde recargar el servicio tras cada cambio en la configuración.

Limitar el acceso por usuario y contraseña.

La autenticación básica HTTP permite proteger directorios con usuario y contraseña. Primero, cree un directorio protegido y su archivo de configuración:

mkdir -p /srv/www/privado
vim /etc/httpd/conf.d/ejemplo-autenticar.conf

Añada al archivo la siguiente configuración:

Alias /privado /srv/www/privado
<Directory "/srv/www/privado">
    Options Indexes
    AllowOverride All
</Directory>

Dentro del directorio protegido, cree un archivo .htaccess:

vim /srv/www/privado/.htaccess

Con el siguiente contenido:

AuthName "Solamente usuarios autorizados"
AuthType Basic
Require valid-user
AuthUserFile /srv/www/.htpasswd

Cree el archivo de contraseñas y ajuste sus permisos:

touch /srv/www/.htpasswd
chmod 600 /srv/www/.htpasswd
chown apache:apache /srv/www/.htpasswd

Añada usuarios con el mandato htpasswd:

htpasswd /srv/www/.htpasswd juan
htpasswd /srv/www/.htpasswd pedro
htpasswd /srv/www/.htpasswd hugo
htpasswd /srv/www/.htpasswd luis

Recargue el servicio de Apache. Al acceder a http://127.0.0.1/privado/ se le solicitará usuario y contraseña.

Redirección de directorios y URL con Apache.

Apache ofrece métodos flexibles para redirigir solicitudes de una ubicación a otra, ya sea dentro del mismo servidor o hacia un destino externo. Esto resulta útil para reorganizar la estructura de un sitio, migrar aplicaciones o integrar servicios. Los dos métodos principales son la directiva simple Redirect y el módulo potente mod_rewrite.

Método 1: Redirección simple con la directiva Redirect

El método más directo utiliza la directiva Redirect, ideal para redirecciones permanentes o temporales de rutas completas.

  1. Cree un archivo de configuración, por ejemplo /etc/httpd/conf.d/ejemplo-redireccion.conf:
    vi /etc/httpd/conf.d/ejemplo-redireccion.conf
  2. Añada una directiva similar a la siguiente, que redirige permanentemente (código 301) todo el acceso a /webmail hacia un servidor de correo externo:
    Redirect 301 /webmail https://mail.dominio.tld/
    • 301: Indica una redirección permanente. Los navegadores y motores de búsqueda actualizan sus enlaces. Para una redirección temporal (manteniendo la URL original a largo plazo), utilice 302.
    • /webmail: La ruta relativa en el servidor que se desea redirigir.
    • https://mail.dominio.tld/: El destino absoluto. Nota: mail.dominio.tld es un ejemplo hipotético que debe reemplazarse por una dirección válida.
  3. Guarde el archivo y recargue la configuración de Apache:
    systemctl reload httpd

    O, en sistemas con SysVinit:

    service httpd reload

Comportamiento: Con la configuración anterior, cualquier solicitud a una subruta como http://tuserver.com/webmail/estadisticas.php se redirigirá automáticamente a https://mail.dominio.tld/estadisticas.php.

Método 2: Redirección avanzada con el módulo mod_rewrite

Para un control granular, condiciones complejas o reescritura de patrones dentro de las URL, se utiliza el módulo mod_rewrite. Su sintaxis es más potente pero también más compleja.

Habilitar el módulo: Asegúrese de que el módulo esté cargado. En distribuciones basadas en RHEL, el paquete mod_rewrite suele estar instalado y habilitado por defecto.

La configuración típica dentro de un bloque <Directory>, <VirtualHost> o archivo .htaccess requiere activar el motor y definir reglas.

Ejemplo 1: Redirigir una ruta a un servidor externo La siguiente regla redirige el acceso a /webmail hacia un servicio externo de correo:

RewriteEngine on
RewriteRule "^/webmail$" "https://mail.dominio.tld/" [R=301,L]

Ejemplo 2: Migrar de una aplicación a otra (Squirrelmail a Roundcube) Para redirigir a los usuarios desde una aplicación antigua (/squirrelmail) hacia una nueva (/roundcubemail) en el mismo servidor:

RewriteEngine on
RewriteRule "^/squirrelmail$" "/roundcubemail" [R=301,L]

Explicación de las banderas (flags) en mod_rewrite:

Nota importante sobre la barra diagonal (/): La presencia o ausencia de la barra final en el patrón y el destino puede afectar el comportamiento.

Prueba y aplicación: Tras añadir estas reglas en la configuración apropiada (por ejemplo, dentro de un bloque <Directory "/var/www/html"> o en un archivo .htaccess con AllowOverride All habilitado), recargue el servicio Apache para aplicar los cambios.

Asignación de directivas para PHP.

Es posible ajustar directivas de PHP específicas para un directorio o aplicación mediante archivos .htaccess, evitando modificar el archivo principal php.ini. La sintaxis es php_flag para valores booleanos y php_value para cadenas o números.

Ejemplo: Configurar un directorio /var/www/aplicacion con las siguientes directivas:

  1. allow_url_fopen: Desactivado (sólo necesario para aplicaciones antiguas o mal escritas).
  2. expose_php: Desactivado (oculta que PHP está instalado).
  3. post_max_size: Aumentado a 256 MiB.
  4. upload_max_filesize: Aumentado a 256 MiB.

Cree el directorio y el archivo de configuración de Apache para éste:

mkdir /var/www/aplicacion
vim /etc/httpd/conf.d/ejemplo-directivas-php.conf

Añada lo siguiente al archivo de configuración:

Alias /aplicacion /var/www/aplicacion
<Directory "/var/www/aplicacion">
    AllowOverride All
</Directory>

Dentro del directorio de la aplicación, cree el archivo .htaccess:

vim /var/www/aplicacion/.htaccess

Con el contenido:

php_flag allow_url_fopen Off
php_value post_max_size 256M
php_flag expose_php Off
php_value upload_max_filesize 256M

Nota: Un error común es escribir mal .htaccess (debe llevar doble 'c' y doble 's').

Para verificar los cambios, cree un archivo info.php dentro del directorio:

vim /var/www/aplicacion/info.php

Con el contenido:

<?php
    phpinfo();
?>

Recargue el servicio de Apache y acceda a http://127.0.0.1/aplicacion/info.php. En la sección PHP Core, compare las columnas Local Value (valores para este directorio) y Master Value (valores globales de php.ini).

DirectiveLocal ValueMaster Value
post_max_size 256M 8M
expose_php Off On
allow_url_fopen Off On
upload_max_filesize 256M 2M