Estoy buscando una solución para almacenar en caché los 404 a largo plazo (unos días/semanas) en el servidor web. Mi configuración actual es NGINX con memcached_pass proxy y PHP-FPM para entregar páginas sin caché (PHP también escribe el contenido en memcached). A los rastreadores de toda la web parece que les gustan mis páginas y generan unos cuantos miles de peticiones 404 al día. Todas ellas llegan directamente a PHP ya que no puedo almacenar en caché la información de la cabecera de la respuesta 404 junto con el contenido en memcached, por lo que la búsqueda en memcached_pass siempre falla.
¿Cómo puedo almacenar en caché todas las peticiones que devuelven un 404? ¿Es el HTTPProxModule para Nginx lo que estoy buscando? ¿O prefiero Varnish?
Desde mi punto de vista actual, no tengo muchas ganas de cambiar mi todo configurar y eliminar la directiva memcached_pass de nginx. Es bastante limpio hasta ahora, porque php decide si una solicitud puede (debe) ser almacenada en caché en memcached o no. También es bastante fácil de vaciar la caché cuando sea necesario.
Mi archivo de configuración actual de NGINX:
server {
listen 80;
server_name _;
gzip on;
gzip_http_version 1.0;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_types text/plain text/html text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
location / {
gzip on;
default_type "text/html; charset=utf-8";
charset utf-8;
add_header Content-Encoding gzip;
if ($request_method = GET)
{
expires max;
set $memcached_key $http_host$request_uri;
memcached_pass 127.0.0.1:11211;
error_page 404 = @fallback;
#error_page 502 = @fallback;
break;
}
root /var/www/html/;
index index.php index.html;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
break;
}
}
location @fallback {
internal;
root /var/www/html/;
index index.php index.html;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
break;
}
}
location ~ \.php$ {
root /var/www/html/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
Un ejemplo de configuración ya sea para Nginx o Varnish sería genial.
¡Gracias! :)