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\.gzquot; "-" [T=text/css,E=no-gzip:1] RewriteRule "\.js\.gzquot; "-" [T=text/javascript,E=no-gzip:1] <FilesMatch "(\.js\.gz|\.css\.gz)quot;> # 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/