Configure o cache Nginx FastCGI para acelerar seu WordPress

Configure o cache Nginx FastCGI para reduzir o tempo de resposta do servidor WordPress

Este tutorial mostrará como configurar o cache Nginx FastCGI para reduzir o tempo de resposta do servidor para seu site WordPress.

O que é Nginx FastCGI Cache?

Se você seguiu meus tutoriais anteriores sobre a instalação da pilha LEMP em várias distribuições Linux, o Nginx está configurado para passar a solicitação PHP para PHP-FPM porque o próprio Nginx não é capaz de processar o código PHP. Deixe-me explicar como funciona um site de pilha LEMP.

  1. Os navegadores da Web enviam solicitações HTTP ao Nginx, que tenta buscar a página do sistema de arquivos.
  2. Se o Nginx encontrar códigos PHP na página, ele passa a solicitação ao PHP-FPM para processar os códigos PHP.
  3. Se necessário, o PHP-FPM consultará o banco de dados MySQL / MariaDB para obter o que precisa.
  4. PHP-FPM gera uma página HTML estática, que é devolvida ao Nginx.
  5. Finalmente, o Nginx envia a página HTML estática para o navegador da web.

Nginx é super rápido quando se trata de servir páginas HTML estáticas. No entanto, o PHP é conhecido por ser lento, embora a versão mais recente do PHP8 seja muito mais rápida do que as versões anteriores. E o banco de dados MySQL / MariaDB é outro gargalo de desempenho dos sites da pilha LEMP .

Em vez de passar a solicitação de página dinâmica para PHP-FPM e deixá-lo gerar a página HTML todas as vezes, o Nginx pode armazenar em cache a página HTML gerada para que na próxima vez ele possa enviar páginas em cache para navegadores da web, eliminando solicitações de PHP e banco de dados.

  • Isso pode melhorar muito o tempo de resposta do servidor e reduzir a carga no PHP-FPM e no servidor de banco de dados.
  • Também permite que o Nginx sirva páginas da web a partir do cache quando o PHP-FPM upstream ou o servidor de banco de dados estiver inativo (MySQL / MariaDB é geralmente o primeiro processo a ser encerrado quando o servidor Linux fica sem memória).

FastCGI é o protocolo entre Nginx e PHP-FPM, portanto, o cache é chamado de cache FastCGI.

Como configurar o cache Nginx FastCGI

Etapa 1: edite o arquivo de configuração principal do Nginx

Edite o arquivo de configuração principal do Nginx.

sudo nano /etc/nginx/nginx.conf

No contexto http , adicione as 2 linhas a seguir:

fastcgi_cache_path / usr / share / nginx / fastcgi_cache níveis = 1: 2 keys_zone = phpcache: 100m max_size = 10g inativo = 60m use_temp_path = off;
fastcgi_cache_key "$ scheme $ request_method $ host $ request_uri";

A primeira diretiva fastcgi_cache_path cria um cache FastCGI. Esta diretiva está disponível apenas no httpcontexto de um arquivo de configuração Nginx.

  • O primeiro argumento especifica a localização do cache no sistema de arquivos ( /usr/share/nginx/fastcgi_cache/).
  • O parâmetro de níveis configura uma hierarquia de diretório de dois níveis em /usr/share/nginx/fastcig_cache/. Ter um grande número de arquivos em um único diretório pode retardar o acesso aos arquivos, portanto, recomendo um diretório de dois níveis para a maioria das implantações. Se o parâmetro de níveis não for incluído, o Nginx colocará todos os arquivos no mesmo diretório. O primeiro diretório usa um caractere em seu nome. O subdiretório usa dois caracteres em seu nome.
  • O terceiro argumento especifica o nome da zona de memória compartilhada (phpcache) e seu tamanho (100M). Esta zona de memória é para armazenar chaves de cache e metadados, como tempos de uso. Ter uma cópia das chaves na memória permite que o Nginx determine rapidamente se uma solicitação é um HIT ou MISS sem ter que ir para o disco, agilizando muito a verificação. Uma zona de 1 MB pode armazenar dados de cerca de 8.000 chaves, portanto, a zona de 100 MB pode armazenar dados de cerca de 800.000 chaves.
  • max_size define o limite superior do tamanho do cache (10 GB neste exemplo). Se não for especificado, o cache pode usar todo o espaço em disco restante. Uma vez que o cache atinge seu tamanho máximo, o gerenciador de cache Nginx irá remover os arquivos menos usados ??recentemente do cache.
  • Os dados que não foram acessados ??durante o período de tempo inativo (60 minutos) serão eliminados do cache pelo gerenciador de cache, independentemente de terem expirado ou não. O valor padrão é 10 minutos. Você também pode usar valores como 12h(12 horas) e 7d(7 dias).
  • O Nginx primeiro grava os arquivos destinados ao cache em uma área de armazenamento temporário ( /var/lib/nginx/fastcgi/). use_temp_path=offdiz ao Nginx para gravá-los diretamente no diretório de cache final para evitar a cópia desnecessária de dados entre os sistemas de arquivos.

A segunda diretiva fastcgi_cache_keydefine a chave para pesquisa de cache. O Nginx aplicará uma função hash MD5sum na chave de cache e usa o resultado do hash como o nome dos arquivos de cache. Após inserir as duas diretivas no contexto http , salve e feche o arquivo.

Nginx
Nginx

Etapa 2: Editar Bloco de Servidor Nginx

Em seguida, abra o arquivo de configuração do bloco do servidor.

sudo nano /etc/nginx/conf.d/seu-dominio.conf

Role para baixo até a seção  local ~ \ .php $ . Adicione as seguintes linhas nesta seção.

fastcgi_cache phpcache;
fastcgi_cache_valid 200 301 302 60m;
fastcgi_cache_use_stale erro tempo limite atualizando invalid_header http_500 http_503;
fastcgi_cache_min_uses 1;
fastcgi_cache_lock on;
add_header X-FastCGI-Cache $ upstream_cache_status;
  • fastcgi_cachediretiva ativa o cache, usando a zona de memória criada anteriormente pela fastcgi_cache_pathdiretiva.
  • fastcgi_cache_validdefine o tempo de cache dependendo do código de status HTTP. No exemplo acima, as respostas com o código de status 200, 301, 302 serão armazenadas em cache por 60 minutos. Você também pode usar períodos de tempo como 12h(12 horas) e 7d(7 dias).
  • O Nginx pode entregar conteúdo obsoleto de seu cache quando não consegue obter conteúdo atualizado do servidor PHP-FPM upstream. Por exemplo, quando o servidor de banco de dados MySQL / MariaDB está inativo. Em vez de retransmitir o erro aos clientes, o Nginx pode entregar a versão desatualizada do arquivo de seu cache. Para habilitar essa funcionalidade, adicionamos o fastcgi_cache_use_stalediretório.
  • fastcgi_cache_min_usesdefine o número de vezes que um item deve ser solicitado pelos clientes antes que o Nginx o armazene em cache. O valor padrão é 1.
  • Com fastcgi_cache_lockhabilitado, se vários clientes solicitarem um arquivo que não é atual no cache, apenas o primeiro desses pedidos é permitido através do servidor PHP-FPM upstream. As solicitações restantes aguardam que essa solicitação seja satisfeita e, em seguida, extraem o arquivo do cache. Sem fastcgi_cache_lockhabilitado, todas as solicitações vão direto para o servidor PHP-FPM upstream.
  • A terceira linha adiciona o cabeçalho X-FastCGI-Cache na resposta HTTP. Ele pode ser usado para validar se a solicitação foi atendida do cache FastCGI ou não.

Agora salve e feche o arquivo de configuração do bloco do servidor. Em seguida, teste sua configuração Nginx.

sudo nginx -t

Se o teste for bem-sucedido, recarregue o Nginx.

sudo service nginx reload

ou

sudo systemctl reload nginx

O gerenciador de cache agora é iniciado e o diretório de cache ( /usr/share/nginx/fastcgi_cache) será criado automaticamente.

Testando Cache Nginx FastCGI

Recarregue a página inicial do seu site algumas vezes. Em seguida, use curl para buscar o cabeçalho de resposta http.

curl -I http://www.seu-dominio.com

fast cgi nginx

Dê uma olhada no cabeçalho X-FastCGI-Cache. HITindica que a resposta foi servida a partir do cache.

Coisas que não devem ser armazenadas em cache

Sessão de login, cookie do usuário, solicitação POST, string de consulta, back-end do WordPress, mapa do site, feeds e autor de comentário não devem ser armazenados em cache. Para desabilitar o cache dos itens acima, edite o arquivo de configuração do bloco de servidor. Cole o código a seguir no servercontexto, acima da location ~ \.php$linha.

defina $ skip_cache 0;

# Solicitações POST e urls com uma string de consulta devem sempre ir para PHP
if ($ request_method = POST) {
    definir $ skip_cache 1;
}
if ($ query_string! = "") {
    definir $ skip_cache 1;
}

# Não armazene em cache uris contendo os seguintes segmentos
if ($ request_uri ~ * "/wp-admin/|/xmlrpc.php|wp-.*.php|^/feed/*|/tag/.*/feed/*|index.php|/.*sitemap. * \. (xml | xsl) ") {
    definir $ skip_cache 1;
}

# Não use o cache para usuários conectados ou comentadores recentes
if ($ http_cookie ~ * "comment_author | wordpress_ [a-f0-9] + | wp-postpass | wordpress_no_cache | wordpress_logged_in") {
    definir $ skip_cache 1;
}

Às vezes, quero testar o tempo de resposta do upstream (PHP-FPM e MariaDB), então também adiciono as seguintes linhas para dizer ao Nginx para ignorar o cache FastCGI para meus próprios endereços IP.

if ($ remote_addr ~ * " 12.34.56.78 | 12.34.56.79 ") {
     definir $ skip_cache 1;
}

O símbolo de til ( ~) informa ao Nginx que o que se segue é uma expressão regular (regex). O símbolo de estrela *torna a regex insensível a maiúsculas e minúsculas. A barra vertical |serve para alternância de vários valores. Se o valor da variável $ remote_addr corresponder a qualquer endereço IP na regex, defina o valor de $ skip_cache como 1.

Você também pode pular o cache de uma rede local como a seguir, o que adicionará a 10.10.10.0/24rede à lista de pular.

if ($ remote_addr ~ * " 12.34.56.78 | 12.34.56.79 | 10.10.10 .. *) {
    definir $ skip_cache 1; 
}

Observe que se você estiver usando o plug-in de mapa do site XML do Google em seu site WordPress, provavelmente poderá ver as seguintes regras de reescrita em sua configuração Nginx.

rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/index.php?xml_sitemap=params=$2" last;
rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml\.gz$ "/index.php?xml_sitemap=params=$2;zip=true" last;
rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html$ "/index.php?xml_sitemap=params=$2;html=true" last;
rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html.gz$ "/index.php?xml_sitemap=params=$2;html=true;zip=true" last;

Essas regras de reescrita devem ser colocadas abaixo das regras de ignorar cache. Se as regras de reescrita estiverem acima das regras de ignorar cache, o mapa do site sempre será armazenado em cache. Da mesma forma, se você usar o plug-in Yoast SEO para gerar o mapa do site, também será necessário mover as regras de reescrita do Yoast abaixo das regras de ignorar cache.

Agora na  location ~ \.php$seção, cole as seguintes diretivas.

fastcgi_cache_bypass $ skip_cache;
fastcgi_no_cache $ skip_cache;

A primeira diretiva diz ao Nginx para enviar uma solicitação ao servidor PHP-FPM upstream, em vez de tentar encontrar arquivos no cache. A segunda diretiva diz ao Nginx para não armazenar a resposta em cache. Salve o arquivo e recarregue o Nginx.

sudo systemctl reload nginx

ou

sudo service nginx reload

Como limpar automaticamente o cache com WordPress

Primeiro, você precisa instalar e ativar o plugin Nginx Helper em seu site WordPress. Em seguida, vá para WordPress Settings-> Nginx helpere marque a Enable Purgecaixa. As condições de eliminação padrão são adequadas para a maioria dos blogs do WordPress. Você também pode habilitar o registro para verificar se a limpeza está funcionando corretamente.

Saiba mais em https://www.linuxbabe.com

Escrito por Portalpower

É pai de família, full stack na vida, gamer, apaixonado por tecnologia, gosta de silêncio e brownie com café ou Coca-Cola.

Deixe um comentário

O seu endereço de e-mail não será publicado.