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.
- Os navegadores da Web enviam solicitações HTTP ao Nginx, que tenta buscar a página do sistema de arquivos.
- Se o Nginx encontrar códigos PHP na página, ele passa a solicitação ao PHP-FPM para processar os códigos PHP.
- Se necessário, o PHP-FPM consultará o banco de dados MySQL / MariaDB para obter o que precisa.
- PHP-FPM gera uma página HTML estática, que é devolvida ao Nginx.
- 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 http
contexto 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) e7d
(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=off
diz 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_key
define 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.

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;
- A
fastcgi_cache
diretiva ativa o cache, usando a zona de memória criada anteriormente pelafastcgi_cache_path
diretiva. - O
fastcgi_cache_valid
define 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 como12h
(12 horas) e7d
(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_stale
diretório. fastcgi_cache_min_uses
define 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_lock
habilitado, 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. Semfastcgi_cache_lock
habilitado, 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
Dê uma olhada no cabeçalho X-FastCGI-Cache. HIT
indica 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 server
contexto, 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/24
rede à 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 helper
e marque a Enable Purge
caixa. 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