Overview
A maioria dos sites tem grandes quantidades de conteúdo que permanece inalterado ou raramente é modificado após a publicação. E toda vez que é solicitado do servidor web, modificado ou não, ele é reprocessado e transmitido ao cliente, consumindo desnecessariamente valiosos recursos do sistema e largura de banda da rede. À medida que seu site ou aplicativo ganha em popularidade, mais demanda nós somos colocados em seu servidor para processar conteúdo que é, embora dinamicamente gerado, estático.
Esta não é uma utilização eficiente dos recursos e eventualmente acabará custando muito dinheiro, à medida que você instala mais hardware para acompanhar a carga. Isto é um caching que entra em cena. Não vamos desperdiçar ciclos de CPU ou processamento de RAM acessados anteriormente que dificilmente mudarão dentro de um determinado período de tempo. Em vez disso, vamos servir conteúdo pré-processado, armazenado temporariamente no servidor ou no cache dos navegadores da Web. E somente após o conteúdo ter sido modificado ou após um determinado período de tempo será reprocessado o conteúdo solicitado.
Configure Caching in Apache
Apache vem com três módulos para o conteúdo de cache, um o habilita e os dois restantes determinam onde o cache existe – no disco ou na memória. Determinar qual módulo usar para o cache store depende dos recursos de hardware disponíveis e dos requisitos de desempenho.
Serving from disk is slow but less expensive. Servir a partir da memória é rápido, mas caro – tanto em custo como em consumo de recursos. No entanto, você pode aumentar o desempenho do cache do disco colocando-o no armazenamento SSDFLASH em vez do disco giratório convencional.
- Cache_module está sendo carregado pelo Apache, verificando se a seguinte linha existe no arquivo de configuração do servidor Apache, sem comentários.
LoadModule cache_module modules/mod_cache.so
- Para cache de disco, certifique-se de que o módulo disk_cache_module está sendo carregado pelo Apache. Procure a seguinte linha, uncommented.
LoadModule disk_cache_module modules/mod_disk_cache.so
- Adicionar as seguintes linhas ao ficheiro de configuração do servidor Apache (para global) ou dentro de uma directiva VirtualHost (aplicação localizada).
CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-admin
CacheEnable disk / Unable caching to disk for relative directory “/”.
>
Cacheroot Definir o diretório de armazenamento do cache, onde todo o conteúdo do cache será salvo.
CacheDefaultExpire Definir a data de expiração padrão, em relação à data original do pedido, em segundos.
>
CacheDisable Desabilita o cache para caminhos relativos seguindo a opção. Áreas sensíveis e aquelas que não devem ser colocadas em cache devem ser adicionadas aqui.
Configurando Expiração do Conteúdo
CacheDisable requer uma data de expiração para que funcione. Sem uma data de expiração no seu conteúdo, o cache não pode determinar se ele está empatado ou não.
Utilizar o Mod_Expires do Apache
Este módulo permite que você defina datas de expiração para o seu conteúdo, como um todo ou individualmente com base no tipo ou string correspondente.
- Certifique-se de que o módulo está sendo carregado no Apache. Abra o arquivo de configuração do servidor (httpd.conf no CentOS) e procure por esta linha. Descomente-o, se for comentado com um ‘#’.
LoadModule expires_module modules/mod_expires.so
- Adicione as seguintes linhas à configuração do servidor Apache, uma configuração de host virtual, uma diretiva de diretório, ou .htaccess, dependendo de onde você quer sua política de cache definida.
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day"</IfModule></pre>
ExpiresActive On Vira no mod expires.
ExpiresDefault Definir a data de expiração padrão para todo o conteúdo. Access plus 1 dia define o tempo de expiração para o tempo de acesso do conteúdo + 1 dia, o que significa que ele ficará em cache por 24 horas.
- Se você quiser atribuir diferentes valores de expiração para tipos específicos de conteúdo, você pode usar a opção ExpiresByType, em adição ou sem a opção ExpiresDefault. Aqui estão alguns exemplos:
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day" ExpiresByType image/jpg "access plus 5 days" ExpiresByType image/jpeg "access plus 5 days" ExpiresByType image/gif "access plus 5 days" ExpiresByType image/png "access plus 5 days" ExpiresByType text/css "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresByType image/x-icon "access plus 1 year"</IfModule>
Utilizar Cabeçalhos HTTP na Aplicação Web
Datas de expiração e última modificação podem ser definidas pela aplicação Web usando os parâmetros do Cabeçalho HTTP. Isto dá aos desenvolvedores ou à aplicação o controle de frescor do conteúdo. Como você faz isso depende da sua aplicação.
- HTML
Utilizar a Meta tag e definir a idade do conteúdo. No exemplo abaixo, defina o cache para privado (solicitando apenas cliente) e a idade máxima para 1 hora (3600 segundos).<meta http-equiv="Cache-control" content="private,max-age:3600">
- PHP
Use a função Header() para definir a idade do conteúdo no cabeçalho do documento.header("Cache-Control: private, max-age=3600");
Cache de conteúdo não expirado
Ás vezes você precisa fazer o cache de conteúdo que não tem uma data de expiração definida. Como mencionado anteriormente, as datas de expiração são um requisito para que o mecanismo de cache funcione, por padrão. No entanto, podemos instruir o Apache a anexar uma data de expiração padrão a conteúdos que não tenham uma data de expiração definida, e a fazer o cache. O CacheIgnoreNoLastMod permite-nos fazer isto.
- Adicionar a opção CacheIgnoreNoLastMod com um valor de On ao local onde você ativou o cache – o arquivo de configuração do servidor do Apache ou um arquivo de configuração dos Hosts Virtuais.
CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod On
Prevenir Navegadores do Conteúdo do Cache
O problema com as configurações de cache acima é que o conteúdo da sua aplicação está em cache em duas localizações: no cliente e no servidor. Se você atualizar seu conteúdo e quiser que o usuário o veja imediatamente, ele pode não conseguir se sua versão em cache local não tiver expirado. Você pode encurtar o tempo de expiração, mas então você pode derrotar completamente o propósito do cache.
Tenha o controle total do cache, ao invés disso, habilitando-o apenas no servidor. Forçar o navegador web a obter o conteúdo do servidor para cada requisição, mas servir conteúdo pré-processado Java ou PHP, por exemplo, a menos que o conteúdo tenha sido modificado. Isso garante que o usuário sempre veja a versão mais recente, enquanto não desperdiça ciclos de CPU ou reprocessamento da RAM desnecessariamente.
- Adicionar a opção CacheIgnoreCacheControl à localização tenha o cache ativado – o arquivo de configuração do servidor Apache ou a configuração de um host virtual – com um valor de On . Isto faz com que o Apache ignore as solicitações de atualização de conteúdo do navegador. Todo o conteúdo será servido a partir do cache do servidor, onde possível, até que ele expire.
CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod OnCacheIgnoreCacheControl On
- Salve suas alterações.
- Reinicie o Apache para aplicar suas alterações.
WordPress e Outras Frameworks de Aplicações
Frameworks, como o WordPress’ e similares ao CodeIgniter, roteiam todo o conteúdo através do Index.php. Dependendo de como você tenha escrito suas regras mod_rewrite, seu conteúdo em cache será exibido incorretamente. Você pode achar que o conteúdo de uma página solicitada, categoria, etc, aparece no lugar do que foi realmente solicitado.
Para combater isso, precisamos garantir que o cache do Apache considere os parâmetros anexados ao final do index.php quando o conteúdo é colocado em cache e puxado. Modifique a regra Rewrite para index.php, como visto no exemplo abaixo.
# WordPress Permalink rewritesRewriteBase /RewriteRule ^index.php$ – RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php/