Configure uma política de cache da web no Apache permite que navegadores e proxies intermediários, como uma Content Delivery Network (CDN), reutilizem recursos já baixados. Isso reduz requisições de rede desnecessárias, melhora a velocidade de carregamento das páginas e diminui a carga do servidor e o consumo de largura de banda.
Aviso: Este tópico pode conter informações sobre produtos de terceiros. A Alibaba Cloud não faz declarações ou garantias sobre o desempenho ou a confiabilidade de produtos de terceiros. Você é responsável por qualquer impacto potencial decorrente do uso desses produtos.
Escolha um módulo do Apache
|
Módulo do Apache |
Vantagens |
Desvantagens |
Casos de uso |
|
mod_expires |
Sintaxe simples. Define rapidamente tempos de expiração para diferentes tipos de arquivo. |
Funcionalidade limitada. Não permite definir diretivas |
Definir uma duração de cache simples ( |
|
mod_headers |
Oferece controle total sobre os cabeçalhos HTTP, com suporte a todas as diretivas |
Sintaxe mais complexa que a do |
Ambientes de produção que exigem estratégias de cache abrangentes e detalhadas. |
Procedimento
Ative os módulos
Antes de configurar uma política de cache, certifique-se de que os módulos headers e expires estejam ativados no Apache.
Para verificar se os módulos estão carregados, execute o comando
apachectl -Mouhttpd -M. Verifique seheaders_moduleeexpires_moduleaparecem na lista de saída.-
Ative os módulos:
-
Para Debian/Ubuntu:
sudo a2enmod headers expires sudo systemctl restart apache2 Para CentOS/RHEL/Alibaba Cloud Linux: Esses módulos geralmente são compilados ou carregados por padrão. Se estiverem ausentes, verifique os arquivos de configuração no diretório
/etc/httpd/conf.modules.d/. Certifique-se de que as linhasLoadModulenão estejam comentadas.
-
Escolha o local do arquivo de configuração
Armazene as configurações de cache em um único arquivo ou no bloco VirtualHost do seu site.
Recomendado: Crie um novo arquivo, como
cache.conf, no diretório/etc/httpd/conf.d/para CentOS/RHEL ou no diretório/etc/apache2/conf-available/para Debian/Ubuntu.Não recomendado: Evite configurar arquivos
.htaccess. Como o Apache precisa ler e analisar o.htaccessa cada requisição, isso gera sobrecarga de desempenho desnecessária.
Exemplos de configuração
Defina um tempo de expiração de cache padrão global
mod_expires
<IfModule mod_expires.c>
# Enable the mod_expires feature
ExpiresActive On
# Set the default cache time for all resources to 1 day
ExpiresDefault "access plus 1 day"
</IfModule>
mod_headers
<IfModule mod_headers.c>
# Set the Cache-Control header. The cache time is 1 day
Header set Cache-Control "max-age=86400, public"
</IfModule>
Defina políticas de cache por tipo de arquivo
mod_expires
<IfModule mod_expires.c>
# Enable the mod_expires feature
ExpiresActive On
# Set the default cache time to 1 day
ExpiresDefault "access plus 1 day"
# Cache image resources for 1 month
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
# Cache CSS and JS files for 1 week
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>
mod_headers
<IfModule mod_headers.c>
# Cache image resources for 1 month
<FilesMatch "\.(jpg|jpeg|png|gif|svg)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
# Cache CSS and JS files for 1 week
<FilesMatch "\.(css|js)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
</IfModule>
Desative o cache para tipos específicos de recursos
mod_expires
<IfModule mod_expires.c>
# Enable the mod_expires feature
ExpiresActive On
# Do not cache HTML files
ExpiresByType text/html "access plus 0 seconds"
</IfModule>
mod_headers
<IfModule mod_headers.c>
# Disable caching for HTML files
<FilesMatch "\.html$">
Header set Cache-Control "no-store, no-cache, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "0"
</FilesMatch>
</IfModule>
Defina uma política de cache personalizada
Personalize uma política usando as seguintes regras de sintaxe do mod_expires e do mod_headers:
mod_expires
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "base_time plus time_unit"
ExpiresByType mime_type "base_time plus time_unit"
</IfModule>
ExpiresActive On: Ativa o módulo
mod_expires.ExpiresDefault: Define o tempo de cache padrão para todos os recursos sem tipo definido.
ExpiresByType: Define o tempo de cache para um tipo específico de Multipurpose Internet Mail Extensions (MIME).
mime_type: Descreve o formato de um arquivo. Inclui um tipo principal e um subtipo, separados por uma barra, como
image/jpegoutext/html.base_time: Tempo base para o cache. Geralmente é
access(quando o usuário acessa o arquivo) oumodification(quando o arquivo foi modificado pela última vez).-
time_unit: Unidade de tempo, como:
secondsminuteshoursdaysweeksmonthsyears
mod_headers
<IfModule mod_headers.c>
Header set|append|unset header_name "value"
</IfModule>
Header set: Define o valor do campo de cabeçalho HTTP especificado.
Header append: Adiciona conteúdo ao valor existente.
Header unset: Exclua o campo de cabeçalho HTTP especificado.
header_name: Nome do campo de cabeçalho HTTP a ser operado, como
Cache-ControlouExpires.value: Valor a ser definido.
Validar e aplicar a configuração
Após modifique a configuração, verifique a sintaxe e recarregue o serviço de forma segura para evitar interrupções.
-
Verifique a sintaxe da configuração. Antes de aplicar alterações, execute um comando de verificação de sintaxe para garantir que não haja erros.
CentOS/RHEL/Alibaba Cloud Linux:
sudo httpd -tDebian/Ubuntu:
sudo apache2ctl -t
Se a saída for
Syntax OK, prossiga. -
Aplique a configuração (recomenda-se o recarregamento seguro).
Use o comando
reloadpara aplicar a nova configuração sem encerrar as conexões existentes.CentOS/RHEL/Alibaba Cloud Linux:
sudo systemctl reload httpdDebian/Ubuntu:
sudo systemctl reload apache2
O módulo mod_expires
O módulo mod_expires define o campo Expires no cabeçalho de resposta HTTP para controlar por quanto tempo os navegadores armazenam recursos em cache. Configure corretamente o mod_expires pode melhorar o desempenho do seu site.
Descrição
A sintaxe básica do mod_expires é a seguinte:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "base_time plus time_unit"
ExpiresByType mime_type "base_time plus time_unit"
</IfModule>
ExpiresActive On: Ativa o módulo
mod_expires.ExpiresDefault: Define o tempo de cache padrão para todos os recursos sem tipo específico definido.
ExpiresByType: Define o tempo de cache para um tipo específico de Multipurpose Internet Mail Extensions (MIME).
mime_type: Tipo MIME, como
image/jpeg,image/gif,text/cssoutext/html.base_time: Tempo base para o cache. Geralmente é
access(quando o usuário acessa o arquivo) oumodification(quando o arquivo foi modificado pela última vez).-
time_unit: Unidade de tempo, como:
secondsminuteshoursdaysweeksmonthsyears
Exemplos de configuração
-
Antes de usar o
mod_expires, certifique-se de que o módulo esteja ativado no Apache. Verifique e ative o módulo com os seguintes comandos:# Check if mod_expires is enabled apachectl -M | grep expires # If not enabled, enable the module sudo a2enmod expires sudo systemctl restart apache2 # Restart the Apache service -
Defina um tempo de expiração de cache padrão global.
<IfModule mod_expires.c> # Enable the mod_expires feature ExpiresActive On # Set the default cache time for all resources to 1 week ExpiresDefault "access plus 1 week" </IfModule> -
Defina o tempo de expiração do cache por tipo MIME.
<IfModule mod_expires.c> # Enable the mod_expires feature ExpiresActive On # Set the default cache time to 1 day ExpiresDefault "access plus 1 day" # Cache image resources for 1 month ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" # Cache CSS and JS files for 1 week ExpiresByType text/css "access plus 1 week" ExpiresByType application/javascript "access plus 1 week" </IfModule> -
Desative o cache para tipos específicos de recursos.
<IfModule mod_expires.c> # Enable the mod_expires feature ExpiresActive On # Do not cache HTML files ExpiresByType text/html "access plus 0 seconds" </IfModule> -
Após modifique a configuração, reinicie o serviço Apache para que as alterações entrem em vigor. Use os seguintes comandos para reiniciar o serviço Apache:
# Reload the Apache configuration (recommended) sudo systemctl reload apache2 # Or restart the Apache service sudo systemctl restart apache2Para sistemas que não usam
systemctl:# Reload the Apache configuration (recommended) sudo service apache2 reload # Or restart the Apache service sudo service apache2 restart
Prioridade: ExpiresByType tem precedência sobre ExpiresDefault. Se um recurso corresponder a uma regra ExpiresByType, a regra ExpiresDefault será ignorada.
O módulo mod_headers
O módulo mod_headers no Apache permite definir, modifique ou exclua cabeçalhos de requisição e resposta HTTP. Combine o mod_headers com políticas de cache do Apache, como Cache-Control e Expires, para crie políticas de cache flexíveis. Para obter mais informações, consulte o site oficial do Apache.
Descrição
A sintaxe básica do mod_headers é a seguinte:
<IfModule mod_headers.c>
Header set|append|unset header_name "value"
</IfModule>
Header set: Define o valor do campo de cabeçalho HTTP especificado.
Header append: Adiciona conteúdo ao valor existente.
Header unset: Exclua o campo de cabeçalho HTTP especificado.
header_name: Nome do campo de cabeçalho HTTP a ser operado, como
Cache-ControlouExpires.value: Valor a ser definido.
A diretiva <FilesMatch> corresponde a nomes de arquivos ou caminhos usando expressões regulares. Isso permite aplicar regras de configuração específicas aos arquivos correspondentes. Por exemplo:
Definir um longo tempo de cache para arquivos de imagem, como
.jpgou.png.Impedir o acesso a arquivos sensíveis, como
.htaccessou arquivos.log.Adicionar cabeçalhos HTTP específicos para recursos estáticos, como arquivos CSS e JS.
A sintaxe básica do <FilesMatch> é a seguinte:
<FilesMatch "regular_expression"> </FilesMatch>
-
regular_expression: Expressão regular usada para corresponder a nomes de arquivos ou caminhos. Os padrões de correspondência comuns incluem:
\.(extension)$: Corresponde a arquivos com uma extensão específica. Por exemplo,\.(jpg|jpeg|png)$corresponde a todos os arquivos.jpg,.jpege.png.^/path/: Corresponde a arquivos dentro de um caminho específico..*: Corresponde a qualquer nome de arquivo.
Exemplos de configuração
-
Antes de usar o
mod_headers, certifique-se de que o módulo esteja ativado no Apache. Verifique e ative o módulo com os seguintes comandos:# Check if mod_headers is enabled apachectl -M | grep headers # If not enabled, enable the module sudo a2enmod headers sudo systemctl restart apache2 # Restart the Apache service -
Defina um tempo de expiração de cache padrão global.
<IfModule mod_headers.c> # Set the Cache-Control header. The cache time is 1 day Header set Cache-Control "max-age=86400, public" </IfModule> -
Defina o tempo de expiração do cache por tipo de arquivo.
<IfModule mod_headers.c> # Cache image resources for 1 month <FilesMatch "\.(jpg|jpeg|png|gif|svg)$"> Header set Cache-Control "max-age=2592000, public" </FilesMatch> # Cache CSS and JS files for 1 week <FilesMatch "\.(css|js)$"> Header set Cache-Control "max-age=604800, public" </FilesMatch> </IfModule> -
Desative o cache para tipos específicos de recursos.
<IfModule mod_headers.c> # Disable caching for HTML files <FilesMatch "\.html$"> Header set Cache-Control "no-store, no-cache, must-revalidate" Header set Pragma "no-cache" Header set Expires "0" </FilesMatch> </IfModule> -
Após modifique a configuração, reinicie o serviço Apache para que as alterações entrem em vigor. Use o seguinte comando para reiniciar o serviço Apache:
# Reload Apache configuration (recommended). sudo systemctl reload apache2 # Or restart the Apache service. sudo systemctl restart apache2Para sistemas que não usam
systemctl:# Reload Apache configuration (recommended). sudo service apache2 reload # Or restart the Apache service. sudo service apache2 restart
Referência: Como funciona o cache da web
Compreender o cache da web ajuda a configure corretamente o Apache. O cache da web divide-se em dois tipos principais: cache forte e cache negociado.
Cache forte: Quando um navegador solicita um recurso, ele verifica primeiro seu cache local. Se o cache não estiver expirado (determinado pela diretiva
max-ageemCache-Controlou pelo cabeçalhoExpires), o navegador carrega o recurso do cache local sem entrar em contato com o servidor. O código de status HTTP é tipicamente200 (from disk cache)ou200 (from memory cache). Este é o método de cache mais eficiente.-
Cache negociado: Quando um cache forte é inválido (expirado) ou não está definido, o navegador envia uma requisição condicional ao servidor para verificar se sua versão em cache ainda é válida. Esse processo envolve as seguintes etapas:
O navegador envia a requisição com identificadores de cache em seus cabeçalhos, como
If-None-Match(com o valorETagda resposta anterior) ouIf-Modified-Since(com a dataLast-Modifiedda resposta anterior).O servidor compara esses identificadores com a versão atual do recurso.
Se o recurso não tiver sido alterado, o servidor retorna um código de status HTTP
304 Not Modifiedcom um corpo de resposta vazio. O navegador continua então a usar sua cópia local obsoleta.Se o recurso tiver sido atualizado, o servidor retorna um código de status HTTP
200 OKjunto com o novo conteúdo do recurso.
Ao configure o Apache, controle os seguintes cabeçalhos de resposta HTTP essenciais para sua política de cache: