Conteúdo pré-processado para evitar que o Apache faça compressão a cada solicitação
No Apache, você mesmo pode pré-comprimir o conteúdo, e deixar o Apache servir o conteúdo comprimido em vez de ter que comprimir em tempo real o tempo todo.
Toda vez que você pedir um arquivo CSS, JavaScript, HTML …, o servidor web provavelmente irá buscar o arquivo do disco, aplicar a mesma técnica de compressão utilizada para os 10 pedidos anteriores, e apresentar o arquivo compactado.
Parece bobagem ter que compactar novamente todos os arquivos antes de servi-lo para seus visitantes. Mesmo que os algoritmos gzip/deflate sejam muito eficientes, eles ainda desperdiçam uma enorme quantidade de ciclos de CPU em servidores ocupados.
No Apache, há uma solução alternativa que você pode usar para pré-comprimir o conteúdo você mesmo, e deixar o Apache servir o conteúdo comprimido em vez de ter que comprimir em tempo real o tempo todo.
Aqui está um pequeno truque para conseguir isso.
<IfModule mod_headers.c>
# Serve gzip compressed CSS files if they exist
# and the client accepts gzip.
RewriteCond "%{HTTP:Accept-encoding}" "gzip"
RewriteCond "%{REQUEST_FILENAME}\.gz" -s
RewriteRule "^(.*)\.css" "$1\.css\.gz" [QSA]
# Serve gzip compressed JS files if they exist
# and the client accepts gzip.
RewriteCond "%{HTTP:Accept-encoding}" "gzip"
RewriteCond "%{REQUEST_FILENAME}\.gz" -s
RewriteRule "^(.*)\.js" "$1\.js\.gz" [QSA]
# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1]
<FilesMatch "(\.js\.gz|\.css\.gz)$">
# Serve correct encoding type.
Header append Content-Encoding gzip
# Force proxies to cache gzipped &
# non-gzipped css/js files separately.
Header append Vary Accept-Encoding
</FilesMatch>
</IfModule>
Esse exemplo, na verdade, vem direto do manual.
Se você é o proprietário de um site, pode adicionar o seguinte em seus passos de deploy/build para pegar um arquivo CSS, criar uma versão compactada e mantê-lo ao lado do original.
(Note como eu não estou usando gzip $filename, já que ele iria comprimir o arquivo, mas remover a versão original no processo – mantendo apenas o arquivo compactado)
$ gzip < style.css > style.css.gz
Isso leva o arquivo style.css como entrada e saída para style.css.gz, mantendo o arquivo original no disco.
O resultado será que você tem os dois arquivos em seu servidor, lado a lado, e o Apache servirá a versão compactada sempre que possível.
$ ls -l style.css style.css.gz
Eu não fiz o benchmark para saber se isso vale a pena, mas parece que pode ajudar em servidores ocupados.
***
Mattias Geniar faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://ma.ttias.be/pre-compress-content-apache-avoid-compressing-every-request/








