Na verdade, você forneceu apenas um pequeno trecho de sua configuração do Nginx, mas parece que você está misturando as opções de cache do Nginx. A opção proxy_no_cache mostrada é para a funcionalidade de proxy da Web do Nginx (encaminhando uma solicitação para outro servidor da Web).
Em relação aos arquivos estáticos hospedados localmente (por exemplo, imagens, css, js ...), permita que o Nginx envie o cabeçalho de cache adequado usando a opção expira .
Em relação a um aplicativo PHP, você pode usar o cache FastCGI do Nginx. Como você talvez saiba, o Nginx encaminhará solicitações para um daemon PHP, como o PHP-FPM. Toda a mágica do PHP ocorre neste daemon do PHP-FPM e o Nginx só receberá a resposta final para enviá-lo de volta ao cliente.
O aplicativo PHP agora pode decidir incluir cabeçalhos de cache nesta resposta. Se o armazenamento em cache for permitido (por exemplo, uma página pública), o PHP pode retornar um cabeçalho Cache-Control para permitir o armazenamento em cache.
<?php
...
header('Cache-Control: public, max-age=3600');
...
?>
Se o armazenamento em cache não for permitido, o PHP poderá retornar um cabeçalho Cache-Control diferente para negar o armazenamento em cache:
<?php
...
header('Cache-Control: private, no-store, max-age=0');
...
?>
Se o seu aplicativo PHP puder enviar o cabeçalho de cache apropriado, você poderá usar o cache Nginx FastCGI usando a seguinte configuração:
fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=phpfpm:64m inactive=24h max_size=512M;
server {
listen 80;
server_name www.mysite.com;
root /var/www/xyz;
index index.php index.html;
# check for static files and deliver, for everything else use /index.php
location / {
try_files $uri $uri/ /index.php;
}
# set caching header for static files
location ~* \.(jpg|jpeg|gif|png|css|js|ico|svg|ttf)$ {
access_log off;
log_not_found off;
expires 30d;
}
# set caching header for asset files, don't exec index.php just show 404
location ^~ /assets/ {
try_files $uri =404;
access_log off;
log_not_found off;
expires 30d;
}
# PHP handler, allow FastCGI caching
location ~ \.php$ {
access_log /var/log/nginx/access.log combined;
include fastcgi_params;
fastcgi_keep_conn on;
fastcgi_pass unix:/run/php/php5.6-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_cache phpfpm;
fastcgi_cache_use_stale updating error timeout invalid_header http_500;
}
}
Se o seu aplicativo PHP não conseguir enviar cabeçalhos de cache apropriados, você poderá forçar o armazenamento em cache ou substituir os cabeçalhos incorretos do cache. Cuidado, isso pode resultar na publicação de dados privados para o público!
Conclusão
Deve ser sempre o aplicativo da web (aqui um aplicativo PHP) definindo qual página deve ser armazenada em cache e quais não. Usar um servidor da Web (Nginx, Apache ou qualquer outro) para tomar essa decisão é como controlar um carro de fora usando barreiras de travamento. Funciona, mas usar o volante é mais inteligente.