Desenvolvimento

3 jun, 2016

Conteúdo pré-processado para evitar que o Apache faça compressão a cada solicitação

Publicidade

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/