Apache (httpd / apache2) Cheatsheet Completo
Cubre tanto el estándar Debian/Ubuntu (
apache2) como RHEL/Oracle Linux/CentOS (httpd), señalando las diferencias donde existen.
Sumario
Instalación y Servicio
Debian/Ubuntu
apt update
apt install apache2 -y
RHEL/Oracle Linux/CentOS
dnf install httpd -y
# versiones antiguas:
yum install httpd -y
Gestión del servicio (systemd)
# Debian/Ubuntu — el servicio se llama apache2
systemctl start apache2
systemctl stop apache2
systemctl restart apache2
systemctl reload apache2 # recarga elegante (sin cortar conexiones)
systemctl status apache2
systemctl enable --now apache2
# RHEL/Oracle Linux — el servicio se llama httpd
systemctl start httpd
systemctl stop httpd
systemctl restart httpd
systemctl reload httpd
systemctl status httpd
systemctl enable --now httpd
Probar y validar configuración
# Debian/Ubuntu
apache2ctl configtest
apache2ctl -t
apache2ctl -S # lista VirtualHosts y cómo fueron resueltos
apache2ctl -M # lista módulos cargados
apache2 -v # versión
# RHEL/Oracle Linux
httpd -t
apachectl configtest
apachectl -S
apachectl -M
httpd -v
Estructura de Archivos
Debian/Ubuntu
/etc/apache2/
├── apache2.conf # config principal
├── ports.conf # puertos que escucha Apache (Listen)
├── conf-available/ # fragmentos de config disponibles
├── conf-enabled/ # symlinks activos de conf-available
├── mods-available/ # módulos disponibles
├── mods-enabled/ # symlinks de módulos activos
├── sites-available/ # vhosts disponibles
└── sites-enabled/ # symlinks de vhosts activos
/var/log/apache2/
├── access.log
└── error.log
/var/www/html/ # webroot por defecto
RHEL/Oracle Linux
/etc/httpd/
├── conf/
│ └── httpd.conf # config principal
├── conf.d/ # *.conf incluidos automáticamente (vhosts generalmente aquí)
└── conf.modules.d/ # carga de módulos (*.conf con LoadModule)
/var/log/httpd/
├── access_log
└── error_log
/var/www/html/ # webroot por defecto
Habilitar/Deshabilitar sitio (Debian — usa scripts auxiliares)
a2ensite meusite.conf
a2dissite meusite.conf
a2enmod rewrite
a2dismod rewrite
a2enconf nome-do-conf
a2disconf nome-do-conf
systemctl reload apache2
En RHEL/Oracle Linux no existe
a2ensite/a2enmod— basta colocar/quitar el.confenconf.d/y los módulos ya vienen cargados por defecto enconf.modules.d/.
Módulos
Módulos esenciales más utilizados
Habilitar módulos
# Debian/Ubuntu
a2enmod rewrite ssl proxy proxy_http proxy_wstunnel headers deflate expires
systemctl restart apache2
# RHEL/Oracle Linux — editar/crear archivo en conf.modules.d/ o
# asegurar que la línea LoadModule no está comentada
grep -r "LoadModule rewrite_module" /etc/httpd/conf.modules.d/
systemctl restart httpd
Listar módulos cargados
apache2ctl -M # Debian
httpd -M # RHEL
Sintaxis Básica de Configuración
# Debian: /etc/apache2/apache2.conf
# RHEL: /etc/httpd/conf/httpd.conf
ServerRoot "/etc/apache2" # o /etc/httpd en RHEL
Listen 80
User www-data # Debian (RHEL: User apache)
Group www-data # Debian (RHEL: Group apache)
ServerAdmin [email protected]
ServerName exemplo.com.br
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
IncludeOptional conf-enabled/*.conf # Debian
IncludeOptional sites-enabled/*.conf # Debian
# RHEL usa: IncludeOptional conf.d/*.conf
Contextos de configuración: Server config (global) → VirtualHost → Directory/Location/Files → .htaccess (si está permitido). Las directivas más específicas sobrescriben las generales, respetando AllowOverride.
VirtualHosts
HTTP básico
<VirtualHost *:80>
ServerName exemplo.com.br
ServerAlias www.exemplo.com.br
DocumentRoot /var/www/exemplo.com.br
<Directory /var/www/exemplo.com.br>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/exemplo_error.log
CustomLog ${APACHE_LOG_DIR}/exemplo_access.log combined
</VirtualHost>
Múltiples dominios (alojamiento virtual basado en nombres)
<VirtualHost *:80>
ServerName app1.exemplo.com.br
DocumentRoot /var/www/app1
</VirtualHost>
<VirtualHost *:80>
ServerName app2.exemplo.com.br
DocumentRoot /var/www/app2
</VirtualHost>
VirtualHost predeterminado (catch-all)
<VirtualHost _default_:80>
DocumentRoot /var/www/html
# responde para cualquier Host no mapeado explícitamente
</VirtualHost>
VirtualHost basado en IP
<VirtualHost 10.0.0.10:80>
ServerName site-a.exemplo.com.br
DocumentRoot /var/www/site-a
</VirtualHost>
Directorio y Control de Acceso
Directory vs Location vs Files
# Directory: se aplica a una ruta en el sistema de archivos
<Directory /var/www/html/admin>
Require all denied
</Directory>
# Location: se aplica a una ruta en la URL (no en el sistema de archivos)
<Location /admin>
Require ip 192.168.0.0/24
</Location>
# Files / FilesMatch: se aplica a archivos específicos
<FilesMatch "\.(env|git|htaccess)$">
Require all denied
</FilesMatch>
Control de acceso por IP
<Directory /var/www/html/admin>
Require ip 192.168.0.0/24
Require ip 10.0.0.5
</Directory>
Combinando condiciones (Apache 2.4+)
<RequireAny>
Require ip 192.168.0.0/24
Require user admin
</RequireAny>
<RequireAll>
Require ip 10.0.0.0/8
Require not ip 10.0.0.50
</RequireAll>
AllowOverride (controla lo que .htaccess puede sobrescribir)
<Directory /var/www/html>
AllowOverride All # permite todo via .htaccess (costo de rendimiento)
AllowOverride None # ignora .htaccess (recomendado por rendimiento/seguridad)
AllowOverride AuthConfig # solo permite directivas de autenticación
</Directory>
.htaccess
Solo funciona si
AllowOverridelo permite en elDirectorypadre. Tiene costo de rendimiento (Apache lee el archivo en cada solicitud) — preferir configuración directa en el VirtualHost cuando sea posible.
# Ejemplo de .htaccess típico (WordPress-style)
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
# Bloquear acceso a archivos sensibles
<FilesMatch "\.(env|git|sql)$">
Require all denied
</FilesMatch>
# Forzar HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Proxy Inverso
Configuración básica (requiere mod_proxy + mod_proxy_http)
<VirtualHost *:80>
ServerName api.exemplo.com.br
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
RequestHeader set X-Forwarded-Proto "http"
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}e
</VirtualHost>
Excluir rutas del proxy
ProxyPass /static/ !
ProxyPass / http://127.0.0.1:8080/
Tiempos de espera
ProxyTimeout 60
Timeout 60
Búferes / carga grande
LimitRequestBody 52428800 # ~50MB en bytes (0 = ilimitado)
Atención con la barra final en ProxyPass (misma lógica que nginx)
# CON barra: elimina el prefijo /api/ antes de enviar al backend
ProxyPass /api/ http://backend:3000/
# /api/users -> http://backend:3000/users
# SIN barra: mantiene el prefijo completo
ProxyPass /api http://backend:3000
# /api/users -> http://backend:3000/api/users
Equilibrio de Carga
Balanceador básico (requiere mod_proxy_balancer + mod_lbmethod_byrequests)
<Proxy "balancer://backend_app">
BalancerMember http://10.0.0.10:8080
BalancerMember http://10.0.0.11:8080
BalancerMember http://10.0.0.12:8080 status=+H # +H = hot standby (backup)
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ServerName app.exemplo.com.br
ProxyPass / balancer://backend_app/
ProxyPassReverse / balancer://backend_app/
</VirtualHost>
Estrategias de equilibrio (lbmethod)
ProxySet lbmethod=byrequests # round-robin por número de solicitudes (predeterminado)
ProxySet lbmethod=bytraffic # equilibra por tráfico (bytes)
ProxySet lbmethod=bybusyness # menos solicitudes pendientes
Pesos y verificación de salud
<Proxy "balancer://backend_app">
BalancerMember http://10.0.0.10:8080 loadfactor=3
BalancerMember http://10.0.0.11:8080 loadfactor=1
BalancerMember http://10.0.0.12:8080 retry=30 timeout=5
</Proxy>
Sesión persistente
<Proxy "balancer://backend_app">
BalancerMember http://10.0.0.10:8080 route=node1
BalancerMember http://10.0.0.11:8080 route=node2
ProxySet stickysession=ROUTEID
</Proxy>
Panel de administración del balanceador
<Location /balancer-manager>
SetHandler balancer-manager
Require ip 127.0.0.1
</Location>
SSL/TLS y Certbot
Bloque SSL básico (requiere mod_ssl)
<VirtualHost *:443>
ServerName exemplo.com.br
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/exemplo.com.br/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/exemplo.com.br/privkey.pem
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite HIGH:!aNULL:!MD5
SSLHonorCipherOrder on
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
# OCSP stapling
SSLUseStapling on
SSLStaplingCache shmcb:/var/run/ocsp(128000)
</VirtualHost>
# Redirect HTTP -> HTTPS
<VirtualHost *:80>
ServerName exemplo.com.br
Redirect permanent / https://exemplo.com.br/
</VirtualHost>
Habilitar módulo SSL
# Debian/Ubuntu
a2enmod ssl
a2ensite default-ssl
systemctl restart apache2
# RHEL/Oracle Linux
dnf install mod_ssl -y
systemctl restart httpd
Certbot — emisión y renovación
# Instalación
apt install certbot python3-certbot-apache -y # Debian/Ubuntu
dnf install certbot python3-certbot-apache -y # RHEL/Oracle Linux
# Emitir certificado (modo apache, edita config automáticamente)
certbot --apache -d exemplo.com.br -d www.exemplo.com.br
# Emitir solo el certificado (sin tocar la config)
certbot certonly --apache -d exemplo.com.br
# Wildcard (requiere plugin DNS, ej: Cloudflare)
certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d "*.exemplo.com.br" -d "exemplo.com.br"
# Renovación manual / prueba
certbot renew --dry-run
certbot renew --deploy-hook "systemctl reload apache2"
# Listar certificados
certbot certificates
# Eliminar certificado
certbot delete --cert-name exemplo.com.br
Generar dhparam
openssl dhparam -out /etc/apache2/dhparam.pem 2048
SSLOpenSSLConfCmd DHParameters "/etc/apache2/dhparam.pem"
Cabeceras HTTP
# Requiere mod_headers (a2enmod headers)
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set Content-Security-Policy "default-src 'self'"
# Eliminar/ofuscar header que expone la versión
ServerTokens Prod
ServerSignature Off
# CORS básico
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header always set Access-Control-Allow-Headers "Authorization, Content-Type"
ServerTokens ProdyServerSignature Offvan en el contexto global (apache2.conf/httpd.conf), no dentro deVirtualHost.
Compresión (Gzip/Brotli)
Gzip (requiere mod_deflate)
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE image/svg+xml
DeflateCompressionLevel 6
<IfModule mod_filter.c>
FilterDeclare COMPRESS
FilterProvider COMPRESS DEFLATE resp=Content-Type $text/html
</IfModule>
</IfModule>
Brotli (requiere mod_brotli, Apache 2.4.26+)
<IfModule mod_brotli.c>
AddOutputFilterByType BROTLI_COMPRESS text/html text/css application/json application/javascript
BrotliCompressionQuality 6
</IfModule>
Caché
Caché de recursos estáticos (requiere mod_expires)
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType text/css "access plus 7 days"
ExpiresByType application/javascript "access plus 7 days"
</IfModule>
<IfModule mod_headers.c>
<FilesMatch "\.(jpg|jpeg|png|gif|css|js|woff2?)$">
Header set Cache-Control "public, immutable"
</FilesMatch>
</IfModule>
Caché de proxy inverso (requiere mod_cache + mod_cache_disk)
<IfModule mod_cache.c>
CacheRoot /var/cache/apache2/mod_cache_disk
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
CacheMaxFileSize 10000000
CacheIgnoreCacheControl On
CacheDefaultExpire 600
</IfModule>
Reescritura y Redireccionamientos
Habilitar módulo
a2enmod rewrite # Debian
# RHEL: ya viene habilitado por defecto en conf.modules.d/
systemctl restart apache2
Redireccionamientos simples
Redirect 301 /antigo /novo
Redirect 302 /temp /pagina-temporaria
RedirectMatch 301 ^/blog/(.*)$ /artigos/$1
RewriteRule (más flexible, con regex y condiciones)
RewriteEngine On
# Forzar HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Forzar non-www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [L,R=301]
# SPA (React/Vue/Angular) — todo cae en el index.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /index.html [L]
# Eliminar .php de la URL
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]
Indicadores más utilizados
PHP (mod_php vs PHP-FPM)
mod_php (modelo heredado, el proceso Apache ejecuta PHP directamente)
# Debian/Ubuntu
apt install libapache2-mod-php8.3 php8.3 -y
a2enmod php8.3
systemctl restart apache2
# RHEL/Oracle Linux
dnf install php php-cli -y
systemctl restart httpd
PHP-FPM (recomendado — proceso separado, mejor rendimiento/aislamiento)
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
# Habilitar módulos necesarios
a2enmod proxy_fcgi setenvif
a2enconf php8.3-fpm
systemctl restart apache2
Importante:
mod_phpyPHP-FPMno deben coexistir en el mismo VirtualHost — elija un modelo. PHP-FPM es preferible en producción por permitir ajuste de pool independiente de Apache (igual que se hace con Nginx).
WebSockets
Requiere mod_proxy_wstunnel
a2enmod proxy proxy_wstunnel
systemctl restart apache2
<VirtualHost *:443>
ServerName ws.exemplo.com.br
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://127.0.0.1:8080/$1" [P,L]
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
Autenticación Básica
# Generar archivo de contraseñas (requiere apache2-utils / httpd-tools)
htpasswd -c /etc/apache2/.htpasswd usuario1
htpasswd /etc/apache2/.htpasswd usuario2 # agregar otro sin -c
<Directory /var/www/html/admin>
AuthType Basic
AuthName "Área restringida"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
Combinando IP + autenticación (cualquiera libera)
<Directory /var/www/html/admin>
AuthType Basic
AuthName "Área restringida"
AuthUserFile /etc/apache2/.htpasswd
<RequireAny>
Require valid-user
Require ip 192.168.0.0/24
</RequireAny>
</Directory>
Limitación de Velocidad / Regulación
Apache no tiene limitación de velocidad nativa tan directa como
limit_reqde Nginx. Las opciones principales:
mod_ratelimit (limita ancho de banda, no la tasa de solicitudes)
<IfModule mod_ratelimit.c>
<Location /downloads>
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 400 # KB/s
</Location>
</IfModule>
mod_evasive (protección contra fuerza bruta/DoS)
apt install libapache2-mod-evasive -y # Debian
dnf install mod_evasive -y # RHEL
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 5 # max solicitudes a la misma página
DOSPageInterval 1 # intervalo en segundos
DOSSiteCount 50 # max solicitudes al sitio completo
DOSSiteInterval 1
DOSBlockingPeriod 600 # tiempo de bloqueo en segundos
DOSEmailNotify [email protected]
</IfModule>
mod_security2 (WAF completo, con OWASP CRS)
apt install libapache2-mod-security2 -y
cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf
systemctl restart apache2
Registros
Formatos personalizados
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" detailed
CustomLog ${APACHE_LOG_DIR}/access.log detailed
Registros condicionales (no registrar comprobaciones de salud)
SetEnvIf Request_URI "^/health$" dontlog
CustomLog ${APACHE_LOG_DIR}/access.log combined env=!dontlog
Rotación de registros (logrotate)
cat /etc/logrotate.d/apache2 # Debian
cat /etc/logrotate.d/httpd # RHEL
logrotate -f /etc/logrotate.d/apache2
Comandos útiles de análisis
tail -f /var/log/apache2/access.log
tail -f /var/log/apache2/error.log
# Top IPs
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
# Códigos de estado más frecuentes
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# Solicitudes más lentas (con %D en el formato de log)
awk '{print $NF, $7}' access.log | sort -rn | head -20
MPM (Módulos de Multiprocesamiento)
El MPM define cómo Apache maneja las conexiones simultáneas — la elección impacta directamente el rendimiento y la compatibilidad con PHP.
# Ver MPM activo
apache2ctl -V | grep -i mpm # Debian
httpd -V | grep -i mpm # RHEL
# Cambiar MPM (Debian)
a2dismod mpm_prefork
a2enmod mpm_event
systemctl restart apache2
# Cambiar MPM (RHEL — editar conf.modules.d/00-mpm.conf, descomentar la línea deseada)
nano /etc/httpd/conf.modules.d/00-mpm.conf
systemctl restart httpd
Configuración de ejemplo (mpm_event)
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
Atención: si usa
mod_php(en lugar de PHP-FPM), está obligado a usarmpm_prefork, porque mod_php no es seguro para subprocesos.
Ajuste de Rendimiento
# Conexiones
Timeout 60
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
# Límites de solicitud (protección)
LimitRequestBody 52428800
LimitRequestFields 100
LimitRequestFieldSize 8190
# Deshabilitar listado de directorios y symlinks innecesarios
<Directory /var/www/html>
Options -Indexes -FollowSymLinks
</Directory>
# Deshabilitar .htaccess globalmente cuando no se usa (ganancia real de rendimiento)
<Directory /var/www/html>
AllowOverride None
</Directory>
Calcular MaxRequestWorkers ideal
MaxRequestWorkers ≈ (RAM disponible para Apache) / (memoria promedio por proceso/thread)
Verifique la memoria real por worker con:
ps -ylC apache2 --sort:rss # Debian
ps -ylC httpd --sort:rss # RHEL
Seguridad
# Ocultar versión e información del servidor (contexto global)
ServerTokens Prod
ServerSignature Off
# Deshabilitar listado de directorios
Options -Indexes
# Bloquear acceso a archivos sensibles
<FilesMatch "\.(env|git|htaccess|htpasswd|sql|bak)$">
Require all denied
</FilesMatch>
# Bloquear acceso a directorios ocultos
<DirectoryMatch "/\.">
Require all denied
</DirectoryMatch>
# Limitar métodos HTTP
<Location />
<LimitExcept GET POST HEAD>
Require all denied
</LimitExcept>
</Location>
# Timeout agresivo contra slow loris
<IfModule mod_reqtimeout.c>
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
fail2ban (complementario, fuerza bruta en auth/admin)
apt install fail2ban -y
# Filtro predeterminado: /etc/fail2ban/filter.d/apache-auth.conf
SELinux (RHEL/Oracle Linux)
En Debian/Ubuntu normalmente no hay SELinux (puede haber AppArmor). En RHEL/Oracle Linux, SELinux suele ser la causa nº1 de "403 inesperado" o "502" al integrar con proxy/backend.
# Verificar estado
getenforce
sestatus
# Ver si SELinux está bloqueando Apache (registros recientes)
ausearch -m avc -ts recent
journalctl -t setroubleshoot
# Permitir que httpd realice conexiones de red (¡necesario para proxy inverso!)
setsebool -P httpd_can_network_connect 1
# Permitir conexión con base de datos (ej: PostgreSQL/MySQL remoto)
setsebool -P httpd_can_network_connect_db 1
# Corregir contexto de archivos servidos (después de mover/crear archivos manualmente)
restorecon -Rv /var/www/html
# Definir contexto correcto para un directorio fuera del estándar
semanage fcontext -a -t httpd_sys_content_t "/dados/site(/.*)?"
restorecon -Rv /dados/site
# Permitir escritura (cargas, caché, sesiones)
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/uploads(/.*)?"
restorecon -Rv /var/www/html/uploads
Solución de Problemas
Errores comunes
Comandos de diagnóstico
# Probar configuración
apache2ctl configtest # Debian
httpd -t # RHEL
# Ver VirtualHosts resueltos
apache2ctl -S
httpd -S
# Procesos
ps aux | grep apache2 # Debian
ps aux | grep httpd # RHEL
# Conexiones activas
ss -tn state established '( dport = :80 or dport = :443 )' | wc -l
# Puerto escuchando
ss -tlnp | grep -E 'apache2|httpd'
# Probar vhost sin alterar DNS
curl -H "Host: exemplo.com.br" http://127.0.0.1/
# Verificar certificado SSL
openssl s_client -connect exemplo.com.br:443 -servername exemplo.com.br
# Estado en tiempo real (requiere mod_status)
curl http://localhost/server-status
mod_status (métricas para monitoreo/Zabbix)
<Location /server-status>
SetHandler server-status
Require ip 127.0.0.1
</Location>
ExtendedStatus On
curl http://127.0.0.1/server-status?auto # formato parseable para scripts/Zabbix
Apache vs Nginx — Equivalencias Rápidas
Ejemplos Completos
1. Sitio estático con SSL y caché de recursos
<VirtualHost *:80>
ServerName site.com.br
ServerAlias www.site.com.br
Redirect permanent / https://site.com.br/
</VirtualHost>
<VirtualHost *:443>
ServerName site.com.br
DocumentRoot /var/www/site.com.br
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/site.com.br/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/site.com.br/privkey.pem
<Directory /var/www/site.com.br>
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<FilesMatch "\.(jpg|jpeg|png|gif|css|js|woff2?)$">
Header set Cache-Control "public, immutable"
</FilesMatch>
ExpiresActive On
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType text/css "access plus 7 days"
ErrorLog ${APACHE_LOG_DIR}/site_error.log
CustomLog ${APACHE_LOG_DIR}/site_access.log combined
</VirtualHost>
2. Proxy inverso para aplicación Java/Spring Boot
<VirtualHost *:443>
ServerName api.empresa.com.br
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/api.empresa.com.br/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/api.empresa.com.br/privkey.pem
LimitRequestBody 20971520
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Real-IP %{REMOTE_ADDR}e
ProxyTimeout 60
<Location /actuator/health>
Require ip 127.0.0.1
</Location>
</VirtualHost>
3. Equilibrador de carga con conmutación por error y sesión persistente
<Proxy "balancer://cluster_app">
BalancerMember http://10.0.1.10:8080 route=node1 loadfactor=2
BalancerMember http://10.0.1.11:8080 route=node2 loadfactor=2
BalancerMember http://10.0.1.12:8080 route=node3 status=+H
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID
</Proxy>
<VirtualHost *:443>
ServerName app.empresa.com.br
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/app.empresa.com.br/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/app.empresa.com.br/privkey.pem
ProxyPass / balancer://cluster_app/
ProxyPassReverse / balancer://cluster_app/
<Location /balancer-manager>
SetHandler balancer-manager
Require ip 127.0.0.1
</Location>
</VirtualHost>
4. PHP-FPM con vhost completo (frontend web estilo WinThor, ej.)
<VirtualHost *:443>
ServerName erp.empresa.com.br
DocumentRoot /var/www/erp
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/erp.empresa.com.br/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/erp.empresa.com.br/privkey.pem
<Directory /var/www/erp>
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/erp_error.log
CustomLog ${APACHE_LOG_DIR}/erp_access.log combined
</VirtualHost>
Referencia Rápida de Comandos
# Debian/Ubuntu
apache2ctl configtest
apache2ctl -S
apache2ctl -M
systemctl reload apache2
a2ensite meusite.conf && a2dissite outrosite.conf
a2enmod rewrite ssl proxy proxy_http headers
# RHEL/Oracle Linux
httpd -t
httpd -S
httpd -M
systemctl reload httpd
# Comunes a ambos
journalctl -u apache2 -f # o -u httpd
curl -I https://exemplo.com.br
openssl s_client -connect host:443 -servername host
htpasswd -c /etc/apache2/.htpasswd usuario
Cheatsheet generada para referencia rápida de administración de Apache (apache2/httpd) en entornos de producción Linux, con énfasis en las diferencias entre Debian/Ubuntu y RHEL/Oracle Linux.
Seguir leyendo
Lea también
TutoriaisManual LSI / Broadcom MegaRAID — MegaCli y StorCLI
Con esta guía, su equipo gana autonomía para diagnosticar rebuilds, resolver foreign configurations, gestionar BBU y CacheCade — con escenarios reales de producción documentados.
20 min de leitura
Nginx Cheatsheet
Guía de bolsillo con ejemplos listos para configurar Nginx en producción: desde instalación y virtual hosts hasta ajuste de rendimiento y resolución de problemas.
12 min de leitura
KubernetesCurso Kubernetes 27 — SLO/SLI, on-call y postmortem sin culpa
Qué prometer, cómo medir y qué hacer cuando el error se dispara: SLI, SLO, presupuesto de error, alertas que despiertan a alguien y postmortem sin caza de brujas.
5 min de leitura
Comentarios
Aún sin comentarios
Sea el primero en compartir su opinión sobre este artículo.

Deje un comentario