Apache (httpd / apache2) Cheatsheet Completo
Cobre tanto o padrão Debian/Ubuntu (
apache2) quanto RHEL/Oracle Linux/CentOS (httpd), apontando as diferenças onde existem.
Sumário
Instalação e Serviço
Debian/Ubuntu
apt update
apt install apache2 -y
RHEL/Oracle Linux/CentOS
dnf install httpd -y
# versões antigas:
yum install httpd -y
Gerenciamento do serviço (systemd)
# Debian/Ubuntu — serviço chama-se apache2
systemctl start apache2
systemctl stop apache2
systemctl restart apache2
systemctl reload apache2 # reload gracioso (sem dropar conexões)
systemctl status apache2
systemctl enable --now apache2
# RHEL/Oracle Linux — serviço chama-se httpd
systemctl start httpd
systemctl stop httpd
systemctl restart httpd
systemctl reload httpd
systemctl status httpd
systemctl enable --now httpd
Testar e validar configuração
# Debian/Ubuntu
apache2ctl configtest
apache2ctl -t
apache2ctl -S # lista VirtualHosts e como foram resolvidos
apache2ctl -M # lista módulos carregados
apache2 -v # versão
# RHEL/Oracle Linux
httpd -t
apachectl configtest
apachectl -S
apachectl -M
httpd -v
Estrutura de Arquivos
Debian/Ubuntu
/etc/apache2/
├── apache2.conf # config principal
├── ports.conf # portas que o Apache escuta (Listen)
├── conf-available/ # snippets de config disponíveis
├── conf-enabled/ # symlinks ativos de conf-available
├── mods-available/ # módulos disponíveis
├── mods-enabled/ # symlinks de módulos ativos
├── sites-available/ # vhosts disponíveis
└── sites-enabled/ # symlinks de vhosts ativos
/var/log/apache2/
├── access.log
└── error.log
/var/www/html/ # webroot padrão
RHEL/Oracle Linux
/etc/httpd/
├── conf/
│ └── httpd.conf # config principal
├── conf.d/ # *.conf incluídos automaticamente (vhosts geralmente aqui)
└── conf.modules.d/ # carregamento de módulos (*.conf com LoadModule)
/var/log/httpd/
├── access_log
└── error_log
/var/www/html/ # webroot padrão
Habilitar/desabilitar site (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
No RHEL/Oracle Linux não existe
a2ensite/a2enmod— basta colocar/remover o.confemconf.d/e os módulos já vêm carregados por padrão emconf.modules.d/.
Módulos
Módulos essenciais mais usados
Habilitar módulos
# Debian/Ubuntu
a2enmod rewrite ssl proxy proxy_http proxy_wstunnel headers deflate expires
systemctl restart apache2
# RHEL/Oracle Linux — editar/criar arquivo em conf.modules.d/ ou
# garantir que a linha LoadModule não está comentada
grep -r "LoadModule rewrite_module" /etc/httpd/conf.modules.d/
systemctl restart httpd
Listar módulos carregados
apache2ctl -M # Debian
httpd -M # RHEL
Sintaxe Básica de Configuração
# Debian: /etc/apache2/apache2.conf
# RHEL: /etc/httpd/conf/httpd.conf
ServerRoot "/etc/apache2" # ou /etc/httpd no 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 configuração: Server config (global) → VirtualHost → Directory/Location/Files → .htaccess (se permitido). Diretivas mais específicas sobrescrevem as gerais, respeitando 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últiplos domínios (name-based virtual hosting)
<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 default (catch-all)
<VirtualHost _default_:80>
DocumentRoot /var/www/html
# responde para qualquer Host não mapeado explicitamente
</VirtualHost>
IP-based VirtualHost
<VirtualHost 10.0.0.10:80>
ServerName site-a.exemplo.com.br
DocumentRoot /var/www/site-a
</VirtualHost>
Diretório e Controle de Acesso
Directory vs Location vs Files
# Directory: aplica a um caminho no filesystem
<Directory /var/www/html/admin>
Require all denied
</Directory>
# Location: aplica a um caminho na URL (não no filesystem)
<Location /admin>
Require ip 192.168.0.0/24
</Location>
# Files / FilesMatch: aplica a arquivos específicos
<FilesMatch "\.(env|git|htaccess)$">
Require all denied
</FilesMatch>
Controle de acesso por IP
<Directory /var/www/html/admin>
Require ip 192.168.0.0/24
Require ip 10.0.0.5
</Directory>
Combinando condições (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 o que .htaccess pode sobrescrever)
<Directory /var/www/html>
AllowOverride All # permite tudo via .htaccess (custo de performance)
AllowOverride None # ignora .htaccess (recomendado por performance/segurança)
AllowOverride AuthConfig # só permite diretivas de autenticação
</Directory>
.htaccess
Só funciona se
AllowOverridepermitir noDirectorypai. Tem custo de performance (Apache lê o arquivo a cada requisição) — preferir configuração direta no VirtualHost quando possível.
# Exemplo de .htaccess típico (WordPress-style)
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
# Bloquear acesso a arquivos sensíveis
<FilesMatch "\.(env|git|sql)$">
Require all denied
</FilesMatch>
# Forçar HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Proxy Reverso
Configuração básica (requer 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 caminhos do proxy
ProxyPass /static/ !
ProxyPass / http://127.0.0.1:8080/
Timeouts
ProxyTimeout 60
Timeout 60
Buffers / upload grande
LimitRequestBody 52428800 # ~50MB em bytes (0 = ilimitado)
Atenção com trailing slash no ProxyPass (mesma lógica do nginx)
# COM barra: remove o prefixo /api/ antes de enviar ao backend
ProxyPass /api/ http://backend:3000/
# /api/users -> http://backend:3000/users
# SEM barra: mantém o prefixo completo
ProxyPass /api http://backend:3000
# /api/users -> http://backend:3000/api/users
Load Balancing
Balanceador básico (requer 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>
Estratégias de balanceamento (lbmethod)
ProxySet lbmethod=byrequests # round-robin por número de requisições (padrão)
ProxySet lbmethod=bytraffic # balanceia por tráfego (bytes)
ProxySet lbmethod=bybusyness # menos requisições pendentes
Pesos e health check
<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>
Sticky session
<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>
Painel de gerenciamento do balanceador
<Location /balancer-manager>
SetHandler balancer-manager
Require ip 127.0.0.1
</Location>
SSL/TLS e Certbot
Bloco SSL básico (requer 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 — emissão e renovação
# Instalação
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 automaticamente)
certbot --apache -d exemplo.com.br -d www.exemplo.com.br
# Emitir só o certificado (sem tocar na config)
certbot certonly --apache -d exemplo.com.br
# Wildcard (requer plugin DNS, ex: Cloudflare)
certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d "*.exemplo.com.br" -d "exemplo.com.br"
# Renovação manual / teste
certbot renew --dry-run
certbot renew --deploy-hook "systemctl reload apache2"
# Listar certificados
certbot certificates
# Deletar certificado
certbot delete --cert-name exemplo.com.br
Gerar dhparam
openssl dhparam -out /etc/apache2/dhparam.pem 2048
SSLOpenSSLConfCmd DHParameters "/etc/apache2/dhparam.pem"
Headers HTTP
# Requer 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'"
# Remover/ofuscar header que expõe versão
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 ProdeServerSignature Offvão no contexto global (apache2.conf/httpd.conf), não dentro deVirtualHost.
Compressão (Gzip/Brotli)
Gzip (requer 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 (requer mod_brotli, Apache 2.4.26+)
<IfModule mod_brotli.c>
AddOutputFilterByType BROTLI_COMPRESS text/html text/css application/json application/javascript
BrotliCompressionQuality 6
</IfModule>
Cache
Cache de assets estáticos (requer 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>
Cache de proxy reverso (requer 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>
Rewrite e Redirecionamentos
Habilitar módulo
a2enmod rewrite # Debian
# RHEL: já vem habilitado por padrão em conf.modules.d/
systemctl restart apache2
Redirecionamentos simples
Redirect 301 /antigo /novo
Redirect 302 /temp /pagina-temporaria
RedirectMatch 301 ^/blog/(.*)$ /artigos/$1
RewriteRule (mais flexível, com regex e condições)
RewriteEngine On
# Forçar HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Forçar non-www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [L,R=301]
# SPA (React/Vue/Angular) — tudo cai no index.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /index.html [L]
# Remover .php da URL
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]
Flags mais usadas
PHP (mod_php vs PHP-FPM)
mod_php (modelo legado, processo Apache executa PHP direto)
# 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 — processo separado, melhor performance/isolamento)
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
# Habilitar módulos necessários
a2enmod proxy_fcgi setenvif
a2enconf php8.3-fpm
systemctl restart apache2
Importante:
mod_phpePHP-FPMnão devem coexistir no mesmo VirtualHost — escolha um modelo. PHP-FPM é preferível em produção por permitir tuning de pool independente do Apache (igual se faz com Nginx).
WebSockets
Requer 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>
Autenticação Básica
# Gerar arquivo de senha (requer apache2-utils / httpd-tools)
htpasswd -c /etc/apache2/.htpasswd usuario1
htpasswd /etc/apache2/.htpasswd usuario2 # adicionar outro sem -c
<Directory /var/www/html/admin>
AuthType Basic
AuthName "Área restrita"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
Combinando IP + autenticação (qualquer um libera)
<Directory /var/www/html/admin>
AuthType Basic
AuthName "Área restrita"
AuthUserFile /etc/apache2/.htpasswd
<RequireAny>
Require valid-user
Require ip 192.168.0.0/24
</RequireAny>
</Directory>
Rate Limiting / Throttling
Apache não tem rate limiting nativo tão direto quanto
limit_reqdo Nginx. As opções principais:
mod_ratelimit (limita banda, não taxa de requisições)
<IfModule mod_ratelimit.c>
<Location /downloads>
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 400 # KB/s
</Location>
</IfModule>
mod_evasive (proteção contra brute-force/DoS)
apt install libapache2-mod-evasive -y # Debian
dnf install mod_evasive -y # RHEL
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 5 # max requisições à mesma página
DOSPageInterval 1 # intervalo em segundos
DOSSiteCount 50 # max requisições ao site todo
DOSSiteInterval 1
DOSBlockingPeriod 600 # tempo de bloqueio em segundos
DOSEmailNotify [email protected]
</IfModule>
mod_security2 (WAF completo, com 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
Logs
Formatos customizados
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" detailed
CustomLog ${APACHE_LOG_DIR}/access.log detailed
Logs condicionais (não logar health checks)
SetEnvIf Request_URI "^/health$" dontlog
CustomLog ${APACHE_LOG_DIR}/access.log combined env=!dontlog
Rotação de logs (logrotate)
cat /etc/logrotate.d/apache2 # Debian
cat /etc/logrotate.d/httpd # RHEL
logrotate -f /etc/logrotate.d/apache2
Comandos úteis de análise
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
# Status codes mais frequentes
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# Requisições mais lentas (com %D no log format)
awk '{print $NF, $7}' access.log | sort -rn | head -20
MPM (Multi-Processing Modules)
O MPM define como o Apache lida com conexões simultâneas — escolha impacta diretamente performance e compatibilidade com PHP.
# Ver MPM ativo
apache2ctl -V | grep -i mpm # Debian
httpd -V | grep -i mpm # RHEL
# Trocar MPM (Debian)
a2dismod mpm_prefork
a2enmod mpm_event
systemctl restart apache2
# Trocar MPM (RHEL — editar conf.modules.d/00-mpm.conf, descomentar a linha desejada)
nano /etc/httpd/conf.modules.d/00-mpm.conf
systemctl restart httpd
Configuração de exemplo (mpm_event)
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
Atenção: se usar
mod_php(em vez de PHP-FPM), você é obrigado a usarmpm_prefork, pois mod_php não é thread-safe.
Tuning de Performance
# Conexões
Timeout 60
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
# Limites de requisição (proteção)
LimitRequestBody 52428800
LimitRequestFields 100
LimitRequestFieldSize 8190
# Desabilitar listagem de diretórios e symlinks desnecessários
<Directory /var/www/html>
Options -Indexes -FollowSymLinks
</Directory>
# Desabilitar .htaccess globalmente quando não usado (ganho de performance real)
<Directory /var/www/html>
AllowOverride None
</Directory>
Calcular MaxRequestWorkers ideal
MaxRequestWorkers ≈ (RAM disponível para Apache) / (memória média por processo/thread)
Verifique a memória real por worker com:
ps -ylC apache2 --sort:rss # Debian
ps -ylC httpd --sort:rss # RHEL
Segurança
# Esconder versão e informações do servidor (contexto global)
ServerTokens Prod
ServerSignature Off
# Desabilitar listagem de diretórios
Options -Indexes
# Bloquear acesso a arquivos sensíveis
<FilesMatch "\.(env|git|htaccess|htpasswd|sql|bak)$">
Require all denied
</FilesMatch>
# Bloquear acesso a diretórios ocultos
<DirectoryMatch "/\.">
Require all denied
</DirectoryMatch>
# Limitar métodos HTTP
<Location />
<LimitExcept GET POST HEAD>
Require all denied
</LimitExcept>
</Location>
# Timeout agressivo contra slow loris
<IfModule mod_reqtimeout.c>
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
fail2ban (complementar, brute-force em auth/admin)
apt install fail2ban -y
# Filtro padrão: /etc/fail2ban/filter.d/apache-auth.conf
SELinux (RHEL/Oracle Linux)
No Debian/Ubuntu normalmente não há SELinux (pode haver AppArmor). No RHEL/Oracle Linux, SELinux costuma ser a causa nº1 de "403 inesperado" ou "502" ao integrar com proxy/backend.
# Verificar status
getenforce
sestatus
# Ver se SELinux está bloqueando o Apache (logs recentes)
ausearch -m avc -ts recent
journalctl -t setroubleshoot
# Permitir que httpd faça conexões de rede (necessário para proxy reverso!)
setsebool -P httpd_can_network_connect 1
# Permitir conexão com banco de dados (ex: PostgreSQL/MySQL remoto)
setsebool -P httpd_can_network_connect_db 1
# Corrigir contexto de arquivos servidos (após mover/criar arquivos manualmente)
restorecon -Rv /var/www/html
# Definir contexto correto para um diretório fora do padrão
semanage fcontext -a -t httpd_sys_content_t "/dados/site(/.*)?"
restorecon -Rv /dados/site
# Permitir escrita (uploads, cache, sessions)
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/uploads(/.*)?"
restorecon -Rv /var/www/html/uploads
Troubleshooting
Erros comuns
Comandos de diagnóstico
# Testar configuração
apache2ctl configtest # Debian
httpd -t # RHEL
# Ver VirtualHosts resolvidos
apache2ctl -S
httpd -S
# Processos
ps aux | grep apache2 # Debian
ps aux | grep httpd # RHEL
# Conexões ativas
ss -tn state established '( dport = :80 or dport = :443 )' | wc -l
# Porta escutando
ss -tlnp | grep -E 'apache2|httpd'
# Testar vhost sem alterar DNS
curl -H "Host: exemplo.com.br" http://127.0.0.1/
# Checar certificado SSL
openssl s_client -connect exemplo.com.br:443 -servername exemplo.com.br
# Status em tempo real (requer mod_status)
curl http://localhost/server-status
mod_status (métricas para monitoramento/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 parseável para scripts/Zabbix
Apache vs Nginx — Equivalências Rápidas
Exemplos Completos
1. Site estático com SSL e cache de assets
<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 reverso para aplicação 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. Load balancer com failover e sticky session
<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 com vhost completo (WinThor-style web frontend, ex.)
<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>
Referência 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
# Comuns aos dois
journalctl -u apache2 -f # ou -u httpd
curl -I https://exemplo.com.br
openssl s_client -connect host:443 -servername host
htpasswd -c /etc/apache2/.htpasswd usuario
Cheatsheet gerado para referência rápida de administração Apache (apache2/httpd) em ambientes de produção Linux, com destaque para as diferenças entre Debian/Ubuntu e RHEL/Oracle Linux.
Continuar a ler
Leia também

iSCSI no TrueNAS: Guia Completo de Configuração e Gerenciamento
13 min de leitura
SegurançaCertificados SSL/TLS: Guia Completo de Geração e Conversão entre Formatos
Este guia técnico cobre a geração de certificados SSL/TLS com Certbot, conversão entre formatos PEM, PFX, DER e as melhores práticas de segurança para proteger chaves privadas e automatizar renovações. Inclui exemplos práticos de configuração para Nginx e Apache.
9 min de leitura
StorCLI - Cheat Sheet Completo
12 min de leitura
Comentários
Ainda sem comentários
Seja o primeiro a compartilhar sua opinião sobre este artigo.

Deixe um comentário