Objetivo del capítulo
En este capítulo instalarás Apache con el gestor de paquetes de tu distribución, aprenderás a controlar el servicio con systemd (iniciar/detener/reiniciar/habilitar al arranque) y validarás que realmente está funcionando mediante comprobaciones prácticas (estado del servicio, prueba HTTP y verificación de puertos). También verás cómo diagnosticar fallos típicos de arranque usando los mensajes de error.
Identificar el nombre del paquete: apache2 vs httpd
El software es el mismo (Apache HTTP Server), pero el nombre del paquete cambia según la familia de la distribución:
| Distribución | Paquete | Servicio (systemd) |
|---|---|---|
| Debian/Ubuntu | apache2 | apache2 |
| RHEL/CentOS/Rocky/Alma/Fedora | httpd | httpd |
Si no estás seguro, puedes buscar el paquete:
# Debian/Ubuntu (APT)
apt-cache search apache2 | head
# RHEL/Fedora (DNF/YUM)
dnf search httpd | headInstalación paso a paso con el gestor de paquetes
Opción A: Debian/Ubuntu (APT)
Actualizar el índice de paquetes:
sudo apt updateInstalar Apache:
Continúa en nuestra aplicación.- Escuche el audio con la pantalla apagada.
- Obtenga un certificado al finalizar.
- ¡Más de 5000 cursos para que explores!
Descargar la aplicación
sudo apt install -y apache2Comprobar versión (opcional):
apache2 -v
Opción B: RHEL/CentOS/Rocky/Alma/Fedora (DNF/YUM)
Instalar Apache:
# Fedora/RHEL 8+ sudo dnf install -y httpd # Sistemas antiguos con yum sudo yum install -y httpdComprobar versión (opcional):
httpd -v
Control del servicio con systemd
Una vez instalado, Apache se gestiona como servicio. Usa el nombre correcto según tu sistema (apache2 o httpd).
Iniciar, detener y reiniciar
# Debian/Ubuntu
sudo systemctl start apache2
sudo systemctl stop apache2
sudo systemctl restart apache2
# RHEL/Fedora
sudo systemctl start httpd
sudo systemctl stop httpd
sudo systemctl restart httpdRecargar configuración sin cortar conexiones (reload)
Cuando cambias configuración, a menudo conviene recargar en lugar de reiniciar (si la configuración es válida):
# Debian/Ubuntu
sudo systemctl reload apache2
# RHEL/Fedora
sudo systemctl reload httpdHabilitar al arranque (enable) y comprobarlo
# Debian/Ubuntu
sudo systemctl enable apache2
sudo systemctl is-enabled apache2
# RHEL/Fedora
sudo systemctl enable httpd
sudo systemctl is-enabled httpdValidaciones prácticas: comprobar que Apache está funcionando
1) Estado del servicio
El primer chequeo es ver si el servicio está active (running) y si hay errores recientes.
# Debian/Ubuntu
systemctl status apache2 --no-pager
# RHEL/Fedora
systemctl status httpd --no-pagerSi está activo, verás algo similar a: Active: active (running). Si falla, verás failed y pistas del motivo.
2) Prueba HTTP con navegador o curl
Desde la misma máquina, prueba el servidor local:
curl -I http://localhost/Deberías obtener un código 200 o, según la configuración por defecto, una respuesta válida (por ejemplo, HTTP/1.1 200 OK). También puedes abrir en un navegador: http://localhost/.
Si quieres probar desde otra máquina, usa la IP o el nombre DNS del servidor:
curl -I http://IP_DEL_SERVIDOR/3) Verificar que los puertos 80/443 están en escucha
Apache debe estar escuchando en el puerto 80 (HTTP) y, si has configurado TLS, en 443 (HTTPS). Compruébalo con ss:
sudo ss -lntp | grep -E ':(80|443)\b'Alternativa con lsof (si está instalado):
sudo lsof -iTCP:80 -sTCP:LISTEN
sudo lsof -iTCP:443 -sTCP:LISTENSi no aparece el puerto 80, el servicio puede no estar iniciado, puede estar fallando al arrancar o estar configurado para escuchar en otro puerto.
Diagnóstico de fallos comunes de arranque
Cuando Apache no inicia, el enfoque práctico es: (1) mirar el estado del servicio, (2) leer logs con journalctl, (3) validar configuración, (4) verificar puertos y permisos.
Ver mensajes de error del servicio (journalctl)
# Debian/Ubuntu
sudo journalctl -u apache2 -xe --no-pager | tail -n 80
# RHEL/Fedora
sudo journalctl -u httpd -xe --no-pager | tail -n 80Busca líneas con AH (códigos de error de Apache) o mensajes como Address already in use, Syntax error, Permission denied.
Fallo 1: Puerto 80/443 ocupado (Address already in use)
Síntomas típicos: el servicio queda en failed y en los logs aparece (98)Address already in use o similar.
Pasos para resolver:
Identificar qué proceso está usando el puerto:
sudo ss -lntp | grep ':80\b' sudo ss -lntp | grep ':443\b'Si el puerto lo ocupa otro servidor web (por ejemplo, Nginx), decide si lo detienes o cambias el puerto de Apache:
# Ejemplo: detener el servicio que ocupa el puerto (ajusta el nombre) sudo systemctl stop nginxSi necesitas cambiar el puerto de Apache, localiza las directivas
Listeny ajusta (por ejemplo a 8080). Luego recarga/reinicia.# Tras el cambio sudo systemctl restart apache2 # o httpd
Fallo 2: Configuración inválida (Syntax error / Invalid command)
Síntomas: el servicio no arranca y los logs indican error de sintaxis, archivo incluido inexistente o directiva desconocida.
Validación recomendada antes de reiniciar:
# Debian/Ubuntu
sudo apache2ctl configtest
# RHEL/Fedora
sudo apachectl configtest
# o
sudo httpd -tResultados típicos:
Syntax OK: la sintaxis es correcta (si aun así falla, revisa puertos, módulos, permisos o SELinux).Si muestra un archivo y línea, ve directamente a esa ruta y corrige la directiva indicada.
Tras corregir, reinicia o recarga:
sudo systemctl reload apache2 # o httpdFallo 3: Permisos (Permission denied) en archivos o directorios
Síntomas: Apache arranca pero no sirve contenido, o directamente falla si no puede leer archivos críticos. En logs puedes ver Permission denied al acceder a un directorio o archivo.
Checklist de acciones:
Verifica permisos y propietario del directorio del sitio y archivos (lectura para el usuario/grupo bajo el que corre Apache).
Revisa rutas configuradas en
DocumentRooty en bloques<Directory>.
Comandos útiles para inspección rápida:
# Ver permisos y propietario
ls -ld /ruta/al/documentroot
ls -l /ruta/al/documentroot | headSi el problema es al arrancar por acceso a un archivo de configuración o certificado, el log suele indicar exactamente qué ruta no puede leer.
Fallo 4: El servicio está activo pero no responde por red
Si systemctl status muestra active (running) pero desde otra máquina no responde:
Confirma que escucha en la IP/puerto esperado:
ss -lntp.Prueba localmente:
curl -I http://localhost/.Si local funciona y remoto no, suele ser firewall o reglas de red. Verifica que el puerto 80/443 esté permitido en el firewall de tu sistema y en el perímetro (si aplica).
Flujo recomendado de verificación rápida (checklist)
1)
systemctl status apache2|httpd2)
journalctl -u apache2|httpd -xe3)
apache2ctl configtestohttpd -t4)
ss -lntp | grep -E ':(80|443)\b'5)
curl -I http://localhost/y luego prueba desde otra máquina