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.
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.
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
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.
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).
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, 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"
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
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.
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
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
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.
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).
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
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.
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.
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
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>
SymLinksIfOwnerMatch: Habilita enlaces simbólicos sólo si el destino pertenece al mismo usuario.Includes: Permite el uso de SSI.AllowOverride all: Permite el uso de archivos .htaccess para sobreescribir configuraciones.Nota: Un error común es escribir incorrectamente AllowOverride, que debe de ir con doble 'r'.
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.
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.
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.
El método más directo utiliza la directiva Redirect, ideal para redirecciones permanentes o temporales de rutas completas.
/etc/httpd/conf.d/ejemplo-redireccion.conf:
vi /etc/httpd/conf.d/ejemplo-redireccion.conf301) 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.systemctl reload httpd
O, en sistemas con SysVinit:
service httpd reloadComportamiento: 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.
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:
[R=301]: Realiza una redirección HTTP explícita con el código 301 (Permanente). Si se omite el código, por defecto es 302 (Temporal).[L] (Last): Indica que esta debe ser la última regla procesada si coincide.[NC] (No Case): Hace que la comparación no distinga entre mayúsculas y minúsculas.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.
^/webmail$ coincide sólo con la ruta exacta /webmail. Una solicitud a /webmail/ no coincidiría. Para capturar ambos casos, podría usarse ^/webmail/?$.https://mail.dominio.tld/) suele ser una buena práctica para indicar un directorio, pero su relevancia depende de la configuración del servidor destino.[R]), donde solo se reescribe la ruta manejada por Apache, el uso de la barra es menos crítico pero debe probarse.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.
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:
allow_url_fopen: Desactivado (sólo necesario para aplicaciones antiguas o mal escritas).expose_php: Desactivado (oculta que PHP está instalado).post_max_size: Aumentado a 256 MiB.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).
| Directive | Local Value | Master Value |
|---|---|---|
| post_max_size | 256M | 8M |
| expose_php | Off | On |
| allow_url_fopen | Off | On |
| upload_max_filesize | 256M | 2M |