Como configurar o cache de conteúdo do Apache no Ubuntu 14.04

O que é cache?

Caching é um método para melhorar o desempenho do servidor, permitindo que o conteúdo comumente solicitado seja armazenado temporariamente de uma forma que permita um acesso mais rápido. Isto acelera o processamento e a entrega, cortando algumas operações de recursos intensivas.

Ao criar regras de cache eficazes, o conteúdo que é adequado para o cache será armazenado para melhorar os tempos de resposta, conservar recursos e minimizar a carga. O Apache fornece uma variedade de caches adequados para agilizar diferentes tipos de operações. Neste guia, estaremos discutindo como configurar o Apache 2.4 no Ubuntu 14.04 usando seus vários módulos de cache.

Para aprender mais sobre o desenvolvimento de estratégias gerais de cache, veja este artigo.

Uma Introdução ao Cache no Apache

O Apache pode armazenar conteúdo em cache com vários níveis de sofisticação e escalabilidade. O projeto divide estes em três grupos de acordo com o método no qual o conteúdo é armazenado em cache. A decomposição geral é:

  • Cache de Arquivos: A estratégia mais básica de cache, isto simplesmente abre arquivos ou descritores de arquivos quando o servidor inicia e os mantém disponíveis para acelerar o acesso.
  • Cache de valor chave: Usado principalmente para SSL e cache de autenticação, o cache de valor chave usa um modelo de objeto compartilhado que pode armazenar itens que são caros para calcular repetidamente.
  • Cache HTTP padrão: O mecanismo de cache mais flexível e geralmente útil, este sistema de três estados pode armazenar respostas e validá-las quando elas expiram. Isto pode ser configurado para desempenho ou flexibilidade dependendo de suas necessidades específicas.

Uma rápida olhada nas descrições acima pode revelar que os métodos acima têm alguma sobreposição, mas também que pode ser útil usar mais de uma estratégia ao mesmo tempo. Por exemplo, usar um key-value store para suas sessões SSL e habilitar um cache HTTP padrão para respostas pode permitir que você tire uma carga significativa de suas fontes de dados e acelerar muitas operações de entrega de conteúdo para seus clientes.

Agora que você tenha um amplo entendimento de cada um dos mecanismos de cache do Apache, vamos olhar para esses sistemas com mais detalhes.

Caching de Arquivo

Visão Geral

  • Módulos primários envolvidos: mod_file_cache
  • Casos de uso principal: armazenando o conteúdo dos arquivos ou descritores de arquivos quando o servidor inicia. Estas são representações estáticas que não podem ser alteradas de forma confiável até que o servidor seja reiniciado.
  • Características: simples, melhora o desempenho de sistemas de arquivos lentos
  • Drawbacks: recurso experimental, não responde a atualizações no sistema de arquivos, deve ser usado com parcimônia para se encaixar dentro das limitações do sistema operacional, só pode ser usado em arquivos estáticos

Os Detalhes

O módulo mod_file_cache é usado principalmente para acelerar o acesso a arquivos em servidores com sistemas de arquivos lentos. Ele fornece uma escolha de duas directivas de configuração, ambas com o objectivo de acelerar o processo de servir ficheiros estáticos executando algum do trabalho quando o servidor é iniciado e não quando os ficheiros são solicitados.

A directiva CacheFile é usada para especificar o caminho para ficheiros no disco para os quais você gostaria de acelerar o acesso. Quando o Apache é iniciado, o Apache abrirá os arquivos estáticos que foram especificados e armazenará em cache o manipulador de arquivos, evitando a necessidade de abrir o arquivo quando ele for solicitado. O número de ficheiros que podem ser abertos desta forma está sujeito às limitações definidas pelo seu sistema operativo.

A directiva MMapFile também abre ficheiros quando o Apache é iniciado pela primeira vez. No entanto, MMapFile coloca em cache o conteúdo do ficheiro na memória em vez de apenas o manipulador de ficheiros. Isto permite um desempenho mais rápido para essas páginas, mas tem algumas limitações sérias. Ele não mantém nenhum registro da quantidade de memória que usou, então é possível ficar sem memória. Note também que os processos infantis irão copiar qualquer uma das memórias alocadas, o que pode resultar num esgotamento de recursos mais rápido do que você inicialmente pode prever. Somente use esta diretiva com moderação.

Estas diretivas são avaliadas somente quando o Apache é iniciado. Isto significa que você não pode confiar no Apache para pegar as alterações feitas após ele ter iniciado. Use-as apenas em arquivos estáticos que não serão alterados durante o tempo de vida da sessão Apache. Dependendo de como os arquivos são modificados, o servidor pode ser notificado das alterações, mas este comportamento não é esperado e nem sempre funcionará corretamente. Se alterações devem ser feitas em arquivos passados para estas diretivas, reinicie o Apache após as alterações terem sido feitas.

Como habilitar o cache de arquivos

O cache de arquivos é fornecido pelo módulo mod_file_cache. Para usar esta funcionalidade, você precisará habilitar o módulo.

Ao executar o Ubuntu 14.04, o módulo será instalado, mas desabilitado quando você instalar o Apache. Você pode habilitar o módulo digitando:

  • sudo a2enmod file_cache

Depois disso, você deve editar o arquivo de configuração principal para configurar as diretivas de cache do seu arquivo. Abra o arquivo digitando:

  • sudo nano /etc/apache2/apache2.conf

Para configurar o cache do file handle, use a diretiva CacheFile. Esta diretiva leva uma lista de caminhos de arquivos, separados por espaços, assim:

/etc/apache2/apache2.conf
CacheFile /var/www/html/index.html /var/www/html/somefile.index

Quando o servidor for reiniciado, o Apache abrirá os arquivos listados e armazenará seus file handles no cache para um acesso mais rápido.

Se, ao invés disso, você desejar mapear alguns arquivos diretamente na memória, você pode usar a diretiva MMapFile. A sua sintaxe é basicamente a mesma da última directiva, na medida em que simplesmente toma uma lista de caminhos de ficheiros:

/etc/apache2/apache2.conf
MMapFile /var/www/html/index.html /var/www/html/somefile.index

Na prática, não haveria razão para configurar ambos CacheFile e MMapFile para o mesmo conjunto de ficheiros, mas poderia usar ambos em conjuntos diferentes de ficheiros.

Quando terminar, pode guardar e fechar os ficheiros. Verifique a sintaxe do ficheiro de configuração digitando:

  • sudo apachectl configtest

Se a última linha indicar Syntax OK, pode reiniciar com segurança a sua instância Apache:

  • sudo service apache2 restart

O Apache reiniciará, caching o conteúdo do ficheiro ou manipuladores dependendo das directivas que utilizou.

Key-Value Caching

General Overview

  • Módulos primários envolvidos: mod_socache_dbm, mod_socache_dc, mod_socache_memcache, mod_socache_shmcb
  • Módulos de suporte envolvidos: mod_authn_socache, mod_ssl
  • Principais casos de uso: armazenamento de sessões SSL ou detalhes de autenticação, grampeamento SSL
  • Características: cache de objetos compartilhados para armazenar recursos complexos, pode auxiliar no cache de sessões SSL e grampeamento, backends flexíveis
  • Drawbacks: não tem mecanismos de validação, precisa configurar software separado para backends mais performantes/flexíveis, alguns bugs no código

The Details

Key-value caching é mais complexo que o caching de arquivos e tem benefícios mais focados. Também conhecido como cache de objetos compartilhados, o cache de valor chave do Apache é usado principalmente para evitar a repetição de operações caras envolvidas na configuração do acesso de um cliente ao conteúdo, em oposição ao conteúdo em si. Especificamente, ele pode ser usado para armazenar detalhes de autenticação, sessões SSL e para fornecer grampeamento SSL.

Nota

Atualmente, há alguns problemas com cada provedor de cache de objetos compartilhados. As referências aos problemas serão descritas abaixo. Leve-as em consideração ao avaliar se deve habilitar este recurso.

O cache real é realizado através do uso de um dos módulos do provedor de cache de objetos compartilhados. Estes são:

  • mod_socache_dbm: Este backend usa o simples motor de banco de dados dbm, que é um armazenamento de valores chave baseado em arquivo que faz uso de hashing e baldes de tamanho fixo. Este provedor sofre de alguns vazamentos de memória, então para a maioria dos casos é recomendado o uso de mod_socache_shmcb em seu lugar.
  • mod_socache_dc: Este provedor usa o software de cache de sessão de distcache. Este projecto não foi actualizado desde 2004 e nem sequer está embalado para algumas distribuições, por isso use com uma dose saudável de precaução.
  • mod_socache_memcache: Isto usa o cache de objectos de memória distribuída memcache para armazenar itens. Esta é a melhor opção para uma cache distribuída entre vários servidores. Atualmente, ela não expira corretamente as entradas, mas um patch foi enviado para o tronco do controle de versão do Apache que corrige o problema.
  • mod_socache_shmcb: Atualmente, esta é a melhor opção para o cache de valores chave. Este caches para um buffer cíclico em memória compartilhada, que irá remover entradas à medida que ele se torna cheio. Atualmente ele bloqueia entradas acima de 11k em tamanho.

> Durante os módulos do provedor acima, módulos adicionais serão necessários, dependendo dos objetos que estão sendo armazenados em cache. Por exemplo, para fazer cache de sessões SSL ou para configurar grampeamento SSL, mod_ssl deve estar habilitado, o que fornecerá as diretivas SSLSessionCache e SSLStaplingCache respectivamente. Da mesma forma, para configurar o cache de autenticação, o módulo mod_authn_socache deve estar habilitado para que a diretiva AuthnCacheSOCache possa ser configurada.

Como habilitar o cache de valor chave

Com os bugs e os caveats acima em mente, se você ainda deseja configurar este tipo de cache no Apache, siga abaixo.

O método usado para configurar o cache de valor chave dependerá para o que ele será usado e qual provedor você está usando. Vamos rever o básico do cache de autenticação e do cache de sessão SSL abaixo.

Atualmente, há um bug com cache de autenticação que impede a passagem de argumentos para o provedor do cache. Portanto, qualquer provedor que não forneça configurações padrão para voltar atrás terá problemas.

Cache de autenticação

Cache de autenticação é útil se você estiver usando um método de autenticação caro, como LDAP ou autenticação de banco de dados. Estes tipos de operações podem ter um impacto significativo no desempenho se o backend tiver de ser atingido sempre que uma requisição de autenticação é feita.

A configuração do cache envolve a modificação da configuração de autenticação existente (não iremos cobrir como configurar a autenticação neste guia). As modificações em si serão muito parecidas independentemente do método de autenticação backend. Usaremos mod_socache_shmcb para nossa demonstração.

Primeiro, ative o módulo authn_socache e o módulo mod_socache_shmcb provedor digitando:

  • sudo a2enmod authn_socache
  • sudo a2enmod socache_shmcb

Abra seu arquivo principal de configuração do Apache para que você possa especificar este backend de cache compartilhado para uso com autenticação:

  • sudo nano /etc/apache2/apache2.conf

No interior, na direção do topo do arquivo, adicione a diretiva AuthnCacheSOCache. Especifique que shmcb deve ser usado como o provedor. Se o bug discutido anteriormente impedindo a passagem da opção for corrigido quando você ler isto, você pode especificar uma localização e tamanho para o cache. O número está em bytes, então o exemplo comentado resultará em um cache de 512 kilobytes:

/etc/apache2/apache2.conf
AuthnCacheSOCache shmcb# If the bug preventing passed arguments to the provider gets fixed,# you can customize the location and size like this#AuthnCacheSOCache shmcb:${APACHE_RUN_DIR}/auth_cache(512000)

Salve e feche o arquivo quando você terminar.

Next, abra sua página de configuração de host virtual que tenha a autenticação configurada. Vamos assumir que você está usando a configuração da máquina virtual 000-default.conf, mas você deve modificá-la para refletir seu ambiente:

  • sudo nano /etc/apache2/sites-enabled/000-default.conf

No local onde você configurou a autenticação, modifique o bloco para adicionar o cache. Especificamente, você precisa adicionar o AuthnCacheProvideFor para dizer quais fontes de autenticação ao cache, adicionar um timeout de cache com AuthnCacheTimeout, e adicionar socache à lista AuthBasicProvider à frente do seu método convencional de autenticação. Os resultados serão algo como isto:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> . . . <Directory /var/www/html/private> AuthType Basic AuthName "Restricted Files" AuthBasicProvider socache file AuthUserFile /etc/apache2/.htpasswd AuthnCacheProvideFor file AuthnCacheTimeout 300 Require valid-user </Directory></VirtualHost>

O exemplo acima é para autenticação de arquivo, que provavelmente não se beneficiará muito do cache. No entanto, a implantação deve ser muito semelhante quando se utiliza outros métodos de autenticação. A única diferença substancial seria onde a especificação “file” está no exemplo acima, o outro método de autenticação seria usado no lugar.

Salvar e fechar o arquivo. Reinicie o Apache para implementar suas alterações de cache:

  • sudo service apache2 restart

Caching de SessãoSSL

O aperto de mão que deve ser feito para estabelecer uma conexão SSL carrega uma sobrecarga significativa. Como tal, o cache dos dados da sessão para evitar esta etapa de inicialização para pedidos futuros pode potencialmente contornar esta penalidade. O cache de objetos compartilhados é um lugar perfeito para isto.

Se você já tiver SSL configurado para o seu servidor Apache, mod_ssl será habilitado. No Ubuntu, isto significa que um ficheiro ssl.conf foi movido para o directório /etc/apache2/mods-enabled. Isto na verdade já configura o cache. Dentro, você verá algumas linhas como esta:

/etc/apache2/mods-enabled/ssl.conf
. . .SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)SSLSessionCacheTimeout 300. . .

Isto na verdade é o suficiente para configurar o cache de sessão. Para testar isso, você pode usar o cliente de conexão do OpenSSL. Type:

  • openssl s_client -connect 127.0.0.1:443 -reconnect -no_ticket | grep Session-ID

Se o ID da sessão for o mesmo em todos os resultados, o cache da sua sessão está funcionando corretamente. Pressione CTRL-C para sair de volta ao terminal.

Cache HTTP padrão

General Overview

  • Módulos primários envolvidos: mod_cache
  • Módulos de suporte envolvidos: mod_cache_disk, mod_cache_socache
  • Casos de uso principal: Conteúdo geral de cache
  • Características: Pode interpretar corretamente cabeçalhos de cache HTTP, pode revalidar entradas antigas, pode ser implantado para máxima velocidade ou flexibilidade dependendo de suas necessidades
  • Drawbacks: Pode vazar dados sensíveis se configurado incorretamente, deve usar módulos adicionais para definir corretamente a política de cache

Os Detalhes

O protocolo HTTP encoraja e fornece os mecanismos para respostas de cache ao longo de todo o caminho de entrega de conteúdo. Qualquer computador que toca o conteúdo pode potencialmente fazer cache de cada item por um certo tempo, dependendo das políticas de cache estabelecidas na origem do conteúdo e das próprias regras de cache do computador.

O mecanismo de cache HTTP do Apache faz cache das respostas de acordo com as políticas de cache HTTP que ele vê. Este é um sistema de cache de propósito geral que adere às mesmas regras que qualquer servidor intermediário que tenha uma mão na entrega. Isto torna este sistema muito flexível e poderoso e permite alavancar os cabeçalhos que você já deveria estar definindo no seu conteúdo (vamos cobrir como fazer isso abaixo).

O cache HTTP do Apache também é conhecido como um cache de “três estados”. Isto porque o conteúdo que ele tem armazenado pode estar em um dos três estados. Ele pode ser fresco, o que significa que é permitido ser servido aos clientes sem qualquer outra verificação, pode ser “stale”, o que significa que a TTL do conteúdo expirou, ou pode ser inexistente se o conteúdo não for encontrado na cache.

Se o conteúdo se tornar “stale”, no próximo pedido, a cache pode revalidá-lo, verificando o conteúdo na origem. Se não tiver mudado, pode redefinir a data de frescor e servir o conteúdo atual. Caso contrário, ele vai buscar o conteúdo alterado e armazena isso pelo tempo permitido pela sua política de cache.

Visão geral do módulo

A lógica de cache HTTP está disponível através do módulo mod_cache. O caching real é feito com um dos provedores de caching. Normalmente, o cache é armazenado no disco usando o módulo mod_cache_disk, mas o cache de objetos compartilhados também está disponível através do módulo mod_cache_socache.

O módulo mod_cache_disk caches no disco, então pode ser útil se você estiver proxyando conteúdo de um local remoto, gerando-o a partir de um processo dinâmico, ou apenas tentando acelerar as coisas através do cache em um disco mais rápido do que o seu conteúdo normalmente reside. Este é o provedor mais bem testado e provavelmente deve ser a sua primeira escolha na maioria dos casos. A cache não é limpa automaticamente, portanto uma ferramenta chamada htcacheclean deve ser executada ocasionalmente para emagrecer a cache. Isto pode ser executado manualmente, configurado como um regular cron job, ou executado como um daemon.

O módulo mod_cache_socache caches para um dos provedores de objetos compartilhados (os mesmos discutidos na última seção). Isto pode potencialmente ter melhor desempenho do que mod_cache_disk (dependendo de qual provedor de cache compartilhado é selecionado). Entretanto, é muito mais novo e depende dos provedores de objetos compartilhados, que têm os bugs discutidos anteriormente. É recomendado um teste abrangente antes de implementar a opção mod_cache_socache.

HTTP Cache Placement

O cache HTTP do Apache pode ser implementado em duas configurações diferentes, dependendo das suas necessidades.

Se o CacheQuickHandler estiver definido para “on”, o cache será verificado muito cedo no processo de tratamento de pedidos. Se o conteúdo for encontrado, ele será servido diretamente sem qualquer outro tratamento. Isto significa que é incrivelmente rápido, mas também significa que não permite processos como autenticação de conteúdo. Se houver conteúdo no seu cache que normalmente requer autenticação ou controle de acesso, ele será acessível a qualquer pessoa sem autenticação se o CacheQuickHandler estiver definido como “ligado”.

Basicamente, isto emula uma cache separada em frente ao seu servidor web. Se o seu servidor web precisar fazer qualquer tipo de verificação condicional, autenticação ou autorização, isso não acontecerá. O Apache não irá nem mesmo avaliar diretivas dentro de <Location> ou <Directory> blocos. Note que CacheQuickHandler está definido para “on” por padrão!

Se o CacheQuickHandler estiver definido para “off”, a cache será verificada significativamente mais tarde na sequência de processamento de requisição. Pense nesta configuração como colocando a cache entre a sua lógica de processamento Apache e o seu conteúdo real. Isso permitirá que as diretivas de processamento convencionais sejam executadas antes de recuperar o conteúdo do cache. Definindo isto como “off”, você terá que habilitar um pouco mais de velocidade para a capacidade de processar pedidos mais profundamente.

Como configurar o cache HTTP padrão

Para habilitar o cache, você precisará habilitar o módulo mod_cache assim como um de seus provedores de cache. Como dissemos acima, mod_cache_disk está bem testado, por isso vamos contar com isso.

Ativar os Módulos

Em um sistema Ubuntu, você pode ativar esses módulos digitando:

  • sudo a2enmod cache
  • sudo a2enmod cache_disk

Isso ativará a funcionalidade de cache na próxima vez que o servidor for reiniciado.

Você também precisará instalar o pacote apache2-utils, que contém o utilitário htcacheclean usado para descompactar o cache quando necessário. Você pode instalar isso digitando:

  • sudo apt-get update
  • sudo apt-get install apache2-utils

Modificar a Configuração Global

A maior parte da configuração para o cache ocorrerá dentro de definições de hosts virtuais individuais ou blocos de localização. No entanto, habilitar mod_cache_disk também habilita uma configuração global que pode ser usada para especificar alguns atributos gerais. Abra esse arquivo agora para dar uma olhada:

  • sudo nano /etc/apache2/mods-enabled/cache_disk.conf

Com os comentários removidos, o arquivo deve ficar assim:

/etc/apache2/mods-enabled/cache_disk.conf
<IfModule mod_cache_disk.c> CacheRoot /var/cache/apache2/mod_cache_disk CacheDirLevels 2 CacheDirLength 1</IfModule>

O wrapper IfModule diz ao Apache para só se preocupar com essas diretivas se o módulo mod_cache_disk estiver habilitado. A diretiva CacheRoot especifica a localização no disco onde o cache será mantido. As diretivas CacheDirLevels e CacheDirLength contribuem para definir como a estrutura do diretório de cache será construída.

Um md5 hash da URL a ser servida será criado como a chave usada para armazenar os dados. Os dados serão organizados em diretórios derivados dos caracteres iniciais de cada hash. CacheDirLevels especifica o número de subdiretórios a serem criados e CacheDirLength especifica quantos caracteres usar como o nome de cada diretório. Então um hash de b1946ac92492d2347c6235b4d2611184 com os valores padrão mostrados acima seria arquivado em uma estrutura de diretórios de b/1/946ac92492d2347c6235b4d2611184. Normalmente, você não precisará modificar estes valores, mas é bom saber para que são usados.

Nota

Se você escolher modificar o valorCacheRoot, você terá que abrir o arquivo/etc/default/apache2e modificar o valor doHTCACHECLEAN_PATHpara corresponder à sua seleção. Isto é usado para limpar a cache em intervalos regulares, por isso deve ter a localização correcta da cache.

Alguns outros valores que podes definir neste ficheiro são CacheMaxFileSize e CacheMinFileSize que definem os intervalos de tamanhos de ficheiro em bytes que o Apache irá submeter à cache, assim como CacheReadSize e CacheReadTime, o que te permite esperar e bufferizar o conteúdo antes de enviar para o cliente. Isto pode ser útil se o conteúdo residir em outro lugar que não este servidor.

Modificar o servidor virtual

A maior parte da configuração para cache ocorrerá em um nível mais granular, seja na definição do host virtual ou em um bloco de localização específica.

Abrir um dos seus arquivos de host virtual para acompanhar. Vamos assumir que você está usando o arquivo padrão neste guia:

  • sudo nano /etc/apache2/sites-enabled

No bloco de host virtual, fora de qualquer bloco de localização, podemos começar a configurar algumas das propriedades de cache. Neste guia, vamos assumir que queremos desligar o arquivo CacheQuickHandler para que mais processamento seja feito. Isto permite-nos configurar regras de cache mais completas.

Também vamos aproveitar esta oportunidade para configurar o cache locking. Este é um sistema de bloqueio de ficheiros que o Apache irá utilizar quando estiver a verificar com a origem do conteúdo para ver se o conteúdo ainda é válido. Durante o tempo em que esta consulta estiver sendo satisfeita, se pedidos adicionais para o mesmo conteúdo entrarem, isso resultaria em pedidos adicionais para o recurso backend, o que poderia causar picos de carga.

Configurar um bloqueio de cache para um recurso durante a validação diz ao Apache que o recurso está sendo atualizado no momento. Durante este tempo, o recurso obsoleto pode ser servido com um cabeçalho de aviso indicando o seu estado. Configuraremos isto com um diretório de cache lock na pasta /tmp. Vamos permitir um máximo de 5 segundos para que um bloqueio seja considerado válido. Estes exemplos são retirados directamente da documentação do Apache, por isso devem funcionar bem para os nossos propósitos.

Diremos também ao Apache para ignorar os cabeçalhos Set-Cookie e não os guardar na cache. Ao fazer isso, evitaremos que o Apache vaze acidentalmente cookies específicos do usuário para outras partes. O cabeçalho Set-Cookie será removido antes dos cabeçalhos serem armazenados em cache.

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie</VirtualHost>

Ainda precisamos realmente habilitar o cache para este host virtual. Nós podemos fazer isso com a diretiva CacheEnable. Se isto for definido em um bloco de host virtual, precisaríamos fornecer o método de cache (disk ou socache), bem como os URIs solicitados que devem ser armazenados em cache. Por exemplo, para armazenar em cache todas as respostas, isto poderia ser definido para CacheEnable disk /, mas se você só quisesse armazenar em cache as respostas sob a diretiva /public URI, você poderia definir isto para CacheEnable disk /public.

Apriprienciaremos uma rota diferente, habilitando nosso cache dentro de um bloco de localização específico. Fazendo isso significa que não temos de fornecer um caminho URI para o comando CacheEnable. Qualquer URI que seja servido a partir desse local será colocado em cache. Também ativaremos a diretiva CacheHeader para que nossos cabeçalhos de resposta indiquem se o cache foi usado para servir o pedido ou não.

Outra diretiva que configuraremos é CacheDefaultExpire para que possamos definir uma expiração (em segundos) se nem os cabeçalhos Expires nem os Last-Modified estiverem definidos no conteúdo. Da mesma forma, vamos definir CacheMaxExpire para limitar a quantidade de tempo que os itens serão salvos. Vamos definir o CacheLastModifiedFactor para que o Apache possa criar uma data de expiração se ele tiver uma data Last-Modified, mas nenhuma data de expiração. O fator é multiplicado pelo tempo desde a modificação para definir uma expiração razoável.

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 </Location></VirtualHost>

Salve e feche seu arquivo quando você tiver configurado tudo o que precisa.

Cheque toda a sua configuração para erros de sintaxe digitando:

  • sudo apachectl configtest

Se nenhum erro for relatado, reinicie seu serviço digitando:

  • sudo service apache2 restart

Configurando Expires e Caching Headers no Conteúdo

Na configuração acima, configuramos o cache HTTP, que se baseia em cabeçalhos HTTP. Entretanto, nenhum dos conteúdos que estamos servindo na verdade tem os cabeçalhos Expires ou Cache-Control necessários para tomar decisões inteligentes de caching. Para definir esses cabeçalhos, precisamos aproveitar mais alguns módulos.

O módulo mod_expires pode definir tanto o cabeçalho Expires quanto a opção max-age no cabeçalho Cache-Control. O módulo mod_headers pode ser usado para adicionar opções mais específicas Cache-Control para afinar ainda mais a política de cache.

Podemos habilitar ambos os módulos digitando:

  • sudo a2enmod expires
  • sudo a2enmod headers

Após habilitar estes módulos, podemos ir direto para modificar nosso arquivo host virtual novamente:

  • sudo nano /etc/apache2/sites-enabled/000-default.conf

O módulo mod_expires fornece apenas três diretivas. O módulo ExpiresActive ativa o processamento de expiração em um determinado contexto, definindo-o como “on”. As outras duas diretivas são muito semelhantes uma à outra. A diretiva ExpiresDefault define o tempo de expiração padrão, e a diretiva ExpiresByType define o tempo de expiração de acordo com o tipo MIME do conteúdo. Ambas irão definir o Expires e o Cache-Control “max-age” para os valores correctos.

Estas duas definições podem ter duas sintaxes diferentes. A primeira é simplesmente “A” ou “M” seguida por um número de segundos. Isto define a expiração em relação à última vez que o conteúdo foi “acessado” ou “modificado”, respectivamente. Por exemplo, ambos expirariam o conteúdo 30 segundos após ter sido acessado.

ExpiresDefault A30ExpireByType text/html A30

A outra sintaxe permite uma configuração mais verbosa. Ela permite que você use outras unidades além dos segundos que são mais fáceis de calcular para os humanos. Também usa a palavra completa “acesso” ou “modificação”. Toda a configuração de expiração deve ser mantida entre aspas, como esta:

ExpiresDefault "modification plus 2 weeks 3 days 1 hour"ExpiresByType text/html "modification plus 2 weeks 3 days 1 hour"

Para os nossos propósitos, vamos apenas definir uma expiração padrão. Começaremos por defini-la em 5 minutos para que se cometermos um erro enquanto nos familiarizamos, ela não será armazenada nos computadores dos nossos clientes por um tempo extremamente longo. Quando estivermos mais confiantes na nossa capacidade de seleccionar políticas apropriadas para o nosso conteúdo, podemos ajustar isto para algo mais agressivo:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 ExpiresActive on ExpiresDefault "access plus 5 minutes" </Location></VirtualHost>

Isto irá definir o nosso cabeçalho Expires para cinco minutos no futuro e definir Cache-Control max-age=300. Para refinar ainda mais a nossa política de cache, podemos usar a diretiva Header. Podemos usar a opção merge para adicionar opções adicionais Cache-Control. Você pode chamar isso várias vezes e adicionar as políticas adicionais que você quiser. Confira este guia para ter uma idéia sobre as políticas de cache que você gostaria de definir para o seu conteúdo. Para o nosso exemplo, vamos apenas definir “público” para que outros caches possam ter a certeza que têm permissão de armazenar cópias.

Para definir ETags para conteúdo estático no nosso site (para usar para validação), podemos usar a diretiva FileETag. Isto irá funcionar para conteúdo estático. Para conteúdo gerado dinamicamente, sua aplicação será responsável por gerar corretamente ETags.

Usamos a diretiva para definir os atributos que o Apache irá usar para calcular o Etag. Isto pode ser INode, MTime, Size, ou All dependendo se queremos modificar o ETag sempre que o ficheiro inode mudar, o seu tempo de modificação, as suas alterações de tamanho, ou todas as anteriores. Você pode fornecer mais de um valor, e você pode modificar a configuração herdada em contextos infantis, precedendo as novas configurações com um + ou -. Para os nossos propósitos, vamos apenas usar “todas” para que todas as alterações sejam registradas:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 ExpiresActive on ExpiresDefault "access plus 5 minutes" Header merge Cache-Control public FileETag All </Location></VirtualHost>

Isto irá adicionar “public” (separado por uma vírgula) a qualquer valor Cache-Control que já tenha e irá incluir um ETag para o nosso conteúdo estático.

Quando você terminar, salve e feche o arquivo. Verifique a sintaxe das suas alterações digitando:

  • sudo apachectl configtest

Se não foram encontrados erros, reinicie seu serviço para implementar suas políticas de cache:

  • sudo service apache2 restart

Conclusion

Configurar o cache com o Apache pode parecer um trabalho assustador devido a quantas opções existem. Felizmente, é fácil começar simples e depois crescer à medida que se requer mais complexidade. A maioria dos administradores não irá requerer cada um dos tipos de cache.

Quando configurar o cache, tenha em mente os problemas específicos que você está tentando resolver para evitar se perder nas diferentes escolhas de implementação. A maioria dos usuários irá se beneficiar de pelo menos configurar os cabeçalhos. Se você estiver fazendo proxy ou gerando conteúdo, a configuração de um cache HTTP pode ser útil. O cache de objetos compartilhado é útil para tarefas específicas como armazenamento de sessões SSL ou detalhes de autenticação, se você estiver usando um provedor backend. O cache de arquivos provavelmente pode ser limitado àqueles com sistemas lentos.

Leave a Reply