Pular para o conteúdo
NyverraNyverra
Artigos
⌘K
InícioArtigosSite institucional
🇧🇷

Nyverra

Canal editorial

Artigos sobre tecnologia, operações e parceiros — infraestrutura, monitoramento e ambientes críticos.

Explorar

  • Início
  • Artigos
  • Categorias
  • Tags
  • Autores
  • Sobre
  • Contato
  • RSS
  • Site institucional

© 2026 Nyverra. Todos os direitos reservados.

blog.nyverra.com

  1. Sumário
  2. Instalação e Serviço
  3. Estrutura de Arquivos
  4. Módulos
  5. Sintaxe Básica de Configuração
  6. VirtualHosts
  7. Diretório e Controle de Acesso
  8. .htaccess
  9. Proxy Reverso
  10. Load Balancing
  11. SSL/TLS e Certbot
  12. Headers HTTP
  13. Compressão (Gzip/Brotli)
  14. Cache
  15. Rewrite e Redirecionamentos
  16. PHP (mod_php vs PHP-FPM)
  17. WebSockets
  18. Autenticação Básica
  19. Rate Limiting / Throttling
  20. Logs
  21. MPM (Multi-Processing Modules)
  22. Tuning de Performance
  23. Segurança
  24. SELinux (RHEL/Oracle Linux)
  25. Troubleshooting
  26. Apache vs Nginx — Equivalências Rápidas
  27. Exemplos Completos
  28. Referência Rápida de Comandos

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

  1. Instalação e Serviço

  2. Estrutura de Arquivos

  3. Módulos

  4. Sintaxe Básica de Configuração

  5. VirtualHosts

  6. Diretório e Controle de Acesso

  7. .htaccess

  8. Proxy Reverso

  9. Load Balancing

  10. SSL/TLS e Certbot

  11. Headers HTTP

  12. Compressão (Gzip/Brotli)

  13. Cache

  14. Rewrite e Redirecionamentos

  15. PHP (mod_php vs PHP-FPM)

  16. WebSockets

  17. Autenticação Básica

  18. Rate Limiting / Throttling

  19. Logs

  20. MPM (Multi-Processing Modules)

  21. Tuning de Performance

  22. Segurança

  23. SELinux (RHEL/Oracle Linux)

  24. Troubleshooting

  25. Apache vs Nginx — Equivalências Rápidas

  26. Exemplos Completos

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 .conf em conf.d/ e os módulos já vêm carregados por padrão em conf.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 AllowOverride permitir no Directory pai. 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 Prod e ServerSignature Off vão no contexto global (apache2.conf/httpd.conf), não dentro de VirtualHost.

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_php e PHP-FPM nã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_req do 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 usar mpm_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.

Compartilhar

Continuar a ler

Leia também

  • iSCSI no TrueNAS: Guia Completo de Configuração e Gerenciamento

    iSCSI no TrueNAS: Guia Completo de Configuração e Gerenciamento

    25 de agosto de 202613 min de leitura
  • Certificados SSL/TLS: Guia Completo de Geração e Conversão entre Formatos
    Segurança

    Certificados 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.

    14 de agosto de 20269 min de leitura
  • StorCLI - Cheat Sheet Completo

    StorCLI - Cheat Sheet Completo

    11 de agosto de 202612 min de leitura

Comentários

Ainda sem comentários

Seja o primeiro a compartilhar sua opinião sobre este artigo.

Deixe um comentário

Newsletter

Receba novos artigos

Inscreva-se para receber publicações do blog Nyverra no seu e-mail. Enviaremos um link de confirmação.

​
  1. Início
  2. Artigos
  3. Apache (httpd / apache2) Cheatsheet

Apache (httpd / apache2) Cheatsheet

AAdministrador Nyverra
24 de junho de 202614 min de leitura