nginx: Usando fastcgi_cache com reescritas try_files

PHP-FPM e try_rewrite

Freqüentemente, com aplicativos baseados em PHP, você reescreve URLs inexistentes (no sistema de arquivos, pelo menos) em um script que executa o roteamento index.php.

Ao usar PHP-FPM, isso geralmente se parece com (exemplo incompleto):

location / {
try_files $uri $uri
/ /index.php;
}
location
~ [^/].php(/|$) {
fastcgi_pass
127.0.0.1:9000;
fastcgi_index index
.php;
...
}

Cache de resposta

fastcgi_cacheé uma ótima maneira de acelerar as páginas armazenáveis ​​em cache, especialmente se você usar um pequeno tmpfsvolume para armazenamento.

A maioria das referências online mostram aproximadamente como configurar o cache:

# In an http{} block
# Cache HTTP 200s from PHP-FPM for 1 hour, 60mb cache in /var/cache/nginx/fastcgi_cache.
fastcgi_cache_valid
200 1h;
fastcgi_cache_path
/var/cache/nginx/fastcgi_cache levels=1:2 keys_zone=DEFAULT:10m max_size=60m;
fastcgi_cache_key
"$scheme$request_method$host$request_uri";
fastcgi_cache DEFAULT
;

mas não como incluir / excluir do armazenamento em cache dependendo do URI.

Então …

Inclusão e exclusão de cache

Se quiséssemos armazenar em cache /routeX(que seria servido por index.phpmeio de nossa try_filesdiretiva), passaríamos um mapa para fastcgi_cache_bypass:

# Still in the http{} block
# 0 is cacheable, otherwise bypass fastcgi_cache entirely
map $request_uri $no_cache
{
default 1;
~/routeX 0;
}
fastcgi_cache_bypass $no_cache
;

A chave aqui é usar $ request_uri como a variável mapeada ao invés de $ uri . O último foi alterado para index.phppor try_files, o que significaria que o cache sempre seria ignorado!

Para uma depuração mais fácil, experimente add_header X-Cache $upstream_cache_statusno seu FastCGI location.

Referências