Apuntes redes

No vayas a access.log, donde habitan los monstruos.

Logs y Monitoreo

Ubicación de logs por sistema

Sistema Error Log Access Log
Ubuntu/Debian /var/log/apache2/error.log /var/log/apache2/access.log
CentOS/RHEL /var/log/httpd/error_log /var/log/httpd/access_log
Windows C:\Apache24\logs\error.log C:\Apache24\logs\access.log
macOS /usr/local/var/log/httpd/error_log /usr/local/var/log/httpd/access_log

Configurar logs personalizados

# Formato de log personalizado
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D" combined_with_time

# Log de errores con más detalle
LogLevel warn

# Logs por Virtual Host
<VirtualHost *:80>
    ServerName midominio.com
    DocumentRoot /var/www/midominio.com/public_html

    # Logs específicos del sitio
    ErrorLog /var/log/apache2/midominio.com_error.log
    CustomLog /var/log/apache2/midominio.com_access.log combined_with_time

    # Log de rewrite (para debugging)
    RewriteLog /var/log/apache2/midominio.com_rewrite.log
    RewriteLogLevel 3
</VirtualHost>

Rotación de logs

Ubuntu/Debian (logrotate)

sudo nano /etc/logrotate.d/apache2
/var/log/apache2/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 640 root adm
    sharedscripts
    postrotate
        systemctl reload apache2 > /dev/null 2>&1 || true
    endscript
}

CentOS/RHEL

sudo nano /etc/logrotate.d/httpd
/var/log/httpd/*log {
    daily
    rotate 52
    missingok
    notifempty
    sharedscripts
    compress
    delaycompress
    postrotate
        systemctl reload httpd > /dev/null 2>&1 || true
    endscript
}

Monitoreo en tiempo real

# Ver logs en tiempo real
tail -f /var/log/apache2/access.log
tail -f /var/log/httpd/error_log

# Filtrar por IP específica
tail -f /var/log/apache2/access.log | grep "192.168.1.100"

# Ver errores críticos
tail -f /var/log/apache2/error.log | grep "critical\|alert\|emergency"

# Estadísticas básicas
# Contar requests por IP
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -10

# Ver códigos de estado más comunes
awk '{print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -nr

Herramientas de análisis

# Instalación de herramientas útiles
sudo apt install goaccess awstats -y  # Ubuntu/Debian
sudo dnf install goaccess awstats -y  # CentOS/RHEL

# Análisis con GoAccess
goaccess /var/log/apache2/access.log --log-format=COMBINED

# Generar reporte HTML
goaccess /var/log/apache2/access.log --log-format=COMBINED --output=report.html

Solución de Problemas: Comandos de diagnóstico

# Verificar configuración
sudo apache2ctl configtest  # Ubuntu/Debian
sudo httpd -t               # CentOS/RHEL

# Ver información del servidor
apache2ctl -V  # Ubuntu/Debian
httpd -V       # CentOS/RHEL

# Ver módulos cargados
apache2ctl -M  # Ubuntu/Debian
httpd -M       # CentOS/RHEL

# Ver Virtual Hosts configurados
apache2ctl -S  # Ubuntu/Debian
httpd -S       # CentOS/RHEL

# Verificar puertos en uso
sudo netstat -tlnp | grep apache
sudo ss -tlnp | grep apache

Problemas comunes y soluciones

1. Apache no inicia

Síntomas:

  • Error al ejecutar systemctl start apache2/httpd
  • "Job failed" en el log del sistema

Diagnóstico:

# Ver logs de sistema
sudo journalctl -xe -u apache2
sudo journalctl -xe -u httpd

# Ver logs de Apache
sudo tail -f /var/log/apache2/error.log
sudo tail -f /var/log/httpd/error_log

# Verificar configuración
sudo apache2ctl configtest

Soluciones comunes:

# Error de configuración
sudo apache2ctl configtest
# Corregir errores mostrados en la salida

# Puerto ya en uso
sudo netstat -tlnp | grep :80
# Matar proceso que usa el puerto o cambiar puerto de Apache

# Permisos incorrectos
sudo chown -R www-data:www-data /var/www  # Ubuntu/Debian
sudo chown -R apache:apache /var/www      # CentOS/RHEL

2. Error 403 Forbidden

Causas comunes:

  • Permisos de archivo incorrectos
  • Configuración de Directory restrictiva
  • Archivo index faltante

Soluciones:

# Verificar permisos
ls -la /var/www/html/

# Corregir permisos
sudo chmod 755 /var/www/html
sudo chmod 644 /var/www/html/index.html

# Verificar configuración Directory
sudo nano /etc/apache2/sites-available/000-default.conf
<Directory /var/www/html>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

3. Error 500 Internal Server Error

Diagnóstico:

# Ver logs de error
sudo tail -f /var/log/apache2/error.log

# Verificar .htaccess
# Renombrar temporalmente .htaccess para probar
mv .htaccess .htaccess.bak

Soluciones comunes:

# Error en .htaccess - verificar sintaxis
# Ejemplo de .htaccess problemático:
RewriteEngine On
RewriteRule ^(.*)$ index.php [L]  # Falta QSA si necesitas query string

# Corrección:
RewriteEngine On
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

4. Módulos no cargan

Diagnóstico:

# Ver módulos disponibles
ls /etc/apache2/mods-available/  # Ubuntu/Debian
ls /etc/httpd/modules/           # CentOS/RHEL

# Ver módulos cargados
apache2ctl -M

Soluciones:

# Ubuntu/Debian
sudo a2enmod rewrite
sudo systemctl restart apache2

# CentOS/RHEL - editar configuración
sudo nano /etc/httpd/conf.modules.d/00-base.conf
# Descomentar: LoadModule rewrite_module modules/mod_rewrite.so
sudo systemctl restart httpd

5. Virtual Host no funciona

Diagnóstico:

# Ver Virtual Hosts configurados
apache2ctl -S

# Verificar DNS/hosts
nslookup midominio.com
cat /etc/hosts

Soluciones:

# Verificar ServerName en Virtual Host
ServerName midominio.com
ServerAlias www.midominio.com

# Habilitar sitio (Ubuntu/Debian)
sudo a2ensite midominio.com.conf
sudo systemctl restart apache2

# Verificar archivo hosts para desarrollo
echo "127.0.0.1 midominio.com" | sudo tee -a /etc/hosts

6. Problemas de rendimiento

Diagnóstico:

# Monitorear procesos
htop
ps aux | grep apache

# Ver conexiones activas
netstat -an | grep :80 | wc -l

# Verificar uso de memoria
free -h

Soluciones:

# Ajustar MPM según carga
<IfModule mpm_prefork_module>
    StartServers 5
    MinSpareServers 5
    MaxSpareServers 10
    MaxRequestWorkers 150
    MaxConnectionsPerChild 0
</IfModule>

# Habilitar compresión
LoadModule deflate_module modules/mod_deflate.so

# Configurar caché
LoadModule expires_module modules/mod_expires.so

7. Problemas SSL

Diagnóstico:

# Verificar certificado
openssl x509 -in /path/to/certificate.crt -text -noout

# Verificar configuración SSL
openssl s_client -connect midominio.com:443

# Verificar módulo SSL
apache2ctl -M | grep ssl

Soluciones:

# Habilitar módulo SSL
sudo a2enmod ssl

# Verificar configuración SSL
sudo apache2ctl configtest

# Regenerar certificado si es necesario
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/apache-selfsigned.key \
    -out /etc/ssl/certs/apache-selfsigned.crt

Herramientas de debugging

Habilitar logging detallado

# En httpd.conf o apache2.conf
LogLevel debug

# Para módulo específico
LogLevel rewrite:trace3
LogLevel ssl:debug

Usar curl para testing

# Test básico
curl -I http://midominio.com

# Test con headers detallados
curl -v http://midominio.com

# Test SSL
curl -k -v https://midominio.com

# Test con user agent específico
curl -H "User-Agent: Mozilla/5.0" http://midominio.com

Verificar configuración paso a paso

# 1. Verificar sintaxis
sudo apache2ctl configtest

# 2. Verificar que Apache esté corriendo
sudo systemctl status apache2

# 3. Verificar puertos
sudo netstat -tlnp | grep apache

# 4. Verificar Virtual Hosts
sudo apache2ctl -S

# 5. Verificar módulos
sudo apache2ctl -M

# 6. Test desde navegador
curl http://localhost

Scripts útiles para mantenimiento

Script de backup de configuración

#!/bin/bash
# backup_apache_config.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/apache_config_$DATE"

mkdir -p $BACKUP_DIR

# Ubuntu/Debian
cp -r /etc/apache2/ $BACKUP_DIR/

# CentOS/RHEL
# cp -r /etc/httpd/ $BACKUP_DIR/

tar -czf "/backup/apache_config_$DATE.tar.gz" $BACKUP_DIR/
rm -rf $BACKUP_DIR

echo "Backup completado: /backup/apache_config_$DATE.tar.gz"

Script de monitoreo básico

#!/bin/bash
# monitor_apache.sh

# Verificar si Apache está corriendo
if ! systemctl is-active --quiet apache2; then
    echo "$(date): Apache no está corriendo, intentando reiniciar..."
    systemctl start apache2

    if systemctl is-active --quiet apache2; then
        echo "$(date): Apache reiniciado exitosamente"
    else
        echo "$(date): Error: No se pudo iniciar Apache"
        exit 1
    fi
fi

# Verificar uso de memoria
MEMORY_USAGE=$(ps aux | grep apache2 | awk '{sum+=$4}; END {print sum}')
if (( $(echo "$MEMORY_USAGE > 80" | bc -l) )); then
    echo "$(date): Advertencia: Uso de memoria alto: $MEMORY_USAGE%"
fi

# Verificar espacio en disco
DISK_USAGE=$(df /var/log | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 90 ]; then
    echo "$(date): Advertencia: Espacio en disco bajo: $DISK_USAGE%"
fi

echo "$(date): Monitoreo completado - Apache OK"

Mejores Prácticas

Seguridad

Mantener Apache actualizado

sudo apt update && sudo apt upgrade apache2
sudo dnf update httpd

Usar principio de menor privilegio

  • Ejecutar Apache con usuario no-root
  • Configurar permisos mínimos necesarios

Configurar firewall

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw deny 22/tcp  # SSH solo desde IPs específicas

Usar HTTPS siempre que sea posible

  • Implementar HSTS
  • Configurar redirecciones HTTP a HTTPS

Rendimiento

Elegir MPM apropiado

  • Prefork: aplicaciones no thread-safe
  • Worker/Event: mejor rendimiento

Habilitar compresión

  • mod_deflate para contenido de texto
  • Configurar tipos MIME apropiados

Configurar caché

  • mod_expires para contenido estático
  • mod_cache para caché del servidor

Optimizar logs

  • Usar formato de log eficiente
  • Implementar rotación de logs

Mantenimiento

  1. Backups regulares

    • Configuración de Apache
    • Contenido web
    • Certificados SSL
  2. Monitoreo

    • Logs de error y acceso
    • Uso de recursos
    • Disponibilidad del servicio
  3. Documentación

    • Cambios en configuración
    • Procedimientos de recuperación
    • Contactos de soporte

Conclusión

Apache HTTP Server es una herramienta poderosa y flexible que puede adaptarse a una amplia variedad de necesidades. Esta guía ha cubierto desde la instalación básica hasta configuraciones avanzadas, teniendo en cuenta las diferencias entre sistemas operativos.

Puntos clave a recordar:

  1. Cada sistema operativo tiene sus particularidades - estructura de archivos, comandos y usuarios diferentes
  2. La seguridad debe ser una prioridad desde la instalación inicial
  3. La configuración debe ajustarse según las necesidades específicas del proyecto
  4. El monitoreo y mantenimiento regular son esenciales para un servidor en producción
  5. Los logs son fundamentales para diagnosticar problemas y optimizar rendimiento

Con esta base sólida, estarás preparado para desplegar y mantener servidores Apache en cualquier entorno, desde desarrollo local hasta producción empresarial.

Para obtener más información, consulta la documentación oficial de Apache en httpd.apache.org y las comunidades específicas de cada sistema operativo.

TOP