Dia 14 - Troubleshooting de Apache: Servicio caido por conflicto de puerto
Problema / Desafio
El sistema de monitoreo reporta que Apache no esta disponible en uno de los app servers de Stratos DC. Se necesita:
- Identificar cual de los 3 app servers tiene el problema
- Diagnosticar y corregir la causa
- Asegurar que Apache este corriendo en el puerto 8082 en todos los app servers
No se requiere que Apache sirva paginas, solo que el servicio este activo.
Conceptos clave
Diagnostico desde el jump host
Cuando hay multiples servidores, el primer paso es identificar cual tiene el problema. Desde el jump host se puede hacer curl a cada server para verificar rapidamente:
Jump Host
├── curl stapp01:8082 → ❌ Connection refused
├── curl stapp02:8082 → ✅ Responde
└── curl stapp03:8082 → ✅ Responde
Connection refused significa que nada esta escuchando en ese puerto (o el proceso que escucha no es HTTP). Es diferente de No route to host (firewall) o timeout (servidor inalcanzable).
Mensajes de error de curl y su significado
| Error | Significado | Causa probable |
|---|---|---|
Connection refused |
El puerto esta cerrado o el servicio no esta corriendo | Servicio caido o puerto incorrecto |
No route to host |
Firewall bloquea el trafico | Regla de iptables/firewalld |
Timeout / sin respuesta |
El servidor no responde | Servidor apagado, red caida, o DROP en firewall |
Could not resolve host |
DNS no encuentra el hostname | Nombre incorrecto o DNS caido |
Patron recurrente: sendmail ocupando el puerto
Este es un patron que se repite en entornos de laboratorio y produccion: sendmail (u otro servicio) se configura para escuchar en el mismo puerto que necesita Apache. Los sintomas son:
- Apache no puede iniciar (puerto ocupado)
- O Apache nunca fue iniciado y sendmail tomo el puerto
La solucion es siempre la misma: detener el proceso intruso, liberar el puerto e iniciar Apache.
Pasos
- Desde el jump host, hacer
curla los 3 app servers para identificar el servidor con problemas - Conectarse al servidor afectado via SSH
- Usar
netstatpara ver que proceso ocupa el puerto 8082 - Detener y deshabilitar el proceso intruso (sendmail)
- Iniciar y habilitar Apache (httpd)
- Verificar que Apache escucha en el puerto 8082
- Validar desde el jump host con
curl
Comandos / Codigo
1. Identificar el servidor con problemas
Desde el jump host, verificar cada app server:
curl stapp01.stratos.xfusioncorp.com:8082 >/dev/null
curl stapp02.stratos.xfusioncorp.com:8082 >/dev/null
curl stapp03.stratos.xfusioncorp.com:8082 >/dev/null
# stapp01 — FALLO
curl: (7) Failed to connect to stapp01.stratos.xfusioncorp.com port 8082: Connection refused
# stapp02 — OK
% Total % Received % Xferd Average Speed Time Time Time Current
100 2650k 100 2650k 0 0 107M 0 --:--:-- --:--:-- --:--:-- 112M
# stapp03 — OK
% Total % Received % Xferd Average Speed Time Time Time Current
100 2650k 100 2650k 0 0 136M 0 --:--:-- --:--:-- --:--:-- 136M
El servidor stapp01 es el que tiene el problema.
Tip: para verificar multiples servers de forma rapida:
for host in stapp01 stapp02 stapp03; do
echo -n "$host: "
curl -s -o /dev/null -w "%{http_code}" $host.stratos.xfusioncorp.com:8082 2>/dev/null || echo "FAILED"
done
2. Conectarse al servidor y diagnosticar
Verificar que proceso esta en el puerto 8082:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 519/sshd
tcp 0 0 127.0.0.1:8082 0.0.0.0:* LISTEN 772/sendmail: accep
tcp6 0 0 :::22 :::* LISTEN 519/sshd
Dos problemas identificados:
- sendmail (PID 772) esta ocupando el puerto 8082
- Escucha en
127.0.0.1:8082(solo localhost), por eso el jump host recibeConnection refuseden vez de una respuesta SMTP - Apache (httpd) no esta corriendo — no aparece en la lista
3. Verificar el estado de Apache
Apache esta instalado pero no esta corriendo. Probablemente no pudo iniciar porque sendmail ya tenia el puerto 8082 ocupado.
4. Detener sendmail y liberar el puerto
# Detener sendmail
sudo systemctl stop sendmail.service
# Deshabilitar para que no inicie al arrancar
sudo systemctl disable sendmail.service
Verificar que el puerto quedo libre:
No deberia mostrar nada.
5. Iniciar Apache
# Iniciar el servicio
sudo systemctl start httpd.service
# Habilitar inicio automatico al boot
sudo systemctl enable httpd.service
6. Verificar que Apache escucha en el puerto 8082
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 519/sshd
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN 1154/httpd
Ahora httpd esta escuchando en 0.0.0.0:8082 — accesible desde cualquier interfaz de red.
Notar la diferencia con sendmail:
- sendmail: 127.0.0.1:8082 → solo localhost
- httpd: 0.0.0.0:8082 → todas las interfaces
7. Validar desde el jump host
% Total % Received % Xferd Average Speed Time Time Time Current
100 4897 100 4897 0 0 281k 0 --:--:-- --:--:-- --:--:-- 281k
Apache responde correctamente desde el jump host.
Verificacion final de los 3 servers
for host in stapp01 stapp02 stapp03; do
echo -n "$host: "
curl -s -o /dev/null -w "%{http_code}" $host.stratos.xfusioncorp.com:8082
echo
done
Los 3 app servers responden correctamente en el puerto 8082.
Resumen del flujo
1. curl desde jump host a los 3 servers → stapp01 falla (Connection refused)
2. SSH a stapp01 → netstat muestra sendmail en 127.0.0.1:8082
3. systemctl stop/disable sendmail → libera el puerto
4. systemctl start/enable httpd → Apache arranca en 0.0.0.0:8082
5. curl desde jump host → stapp01 responde 200
Diferencia entre systemctl stop y systemctl disable
| Comando | Efecto | Persistencia |
|---|---|---|
stop |
Detiene el servicio ahora | Temporal — se reinicia en el proximo boot |
disable |
Remueve del inicio automatico | Permanente — no arranca al boot |
stop + disable |
Detiene ahora y no arranca al boot | Ambos efectos combinados |
start |
Inicia el servicio ahora | Temporal |
enable |
Agrega al inicio automatico | Permanente |
start + enable |
Inicia ahora y arranca al boot | Ambos efectos combinados |
Siempre usar ambos comandos juntos para evitar que el problema reaparezca despues de un reboot.
Troubleshooting
| Problema | Solucion |
|---|---|
Connection refused en un app server |
Verificar con netstat -tunlp que proceso escucha en el puerto. Si no hay ninguno, el servicio no esta corriendo |
| sendmail ocupa el puerto de Apache | systemctl stop sendmail && systemctl disable sendmail |
Apache no inicia: Address already in use |
Otro proceso ocupa el puerto. Identificar con netstat -tunlp \| grep 8082 y detenerlo |
| Apache inicia pero no responde externamente | Verificar que escucha en 0.0.0.0 y no en 127.0.0.1. Revisar Listen en httpd.conf |
| Despues de reboot sendmail vuelve a aparecer | Falta systemctl disable sendmail. Verificar con systemctl is-enabled sendmail |
httpd.conf no tiene el puerto correcto |
Buscar con grep -i Listen /etc/httpd/conf/httpd.conf y corregir |