2 votos

Almacenamiento en caché de 404 - ¿NGINX o Varnished?

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! :)

1voto

Kvisle Puntos 2798

Varnish almacena en caché los 404 de forma predeterminada, por lo que no es necesaria ninguna configuración (excepto la configuración inicial básica de Varnish), a menos que el backend proporcione una respuesta que Varnish considere no almacenable en caché.

Si ese es el caso, puede hacer los cambios necesarios en la respuesta utilizando VCL, y forzar que se almacene en caché.

No he dado ningún ejemplo, porque en realidad no hay ninguno que dar.

0voto

Eric Bailey Puntos 55

Si quieres hacerlo a través de nginx, se puede hacer así:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X