Caching 404s - NGINX ou Varnished?

2

Estou procurando uma solução para armazenar em cache os 404s em longo prazo (alguns dias / semanas) no servidor da web. Minha configuração atual é NGINX com proxy memcached_pass e PHP-FPM para entregar páginas não armazenadas em cache (o PHP também grava o conteúdo no memcached). Os rastreadores em toda a web parecem gostar de minhas páginas e geram alguns milhares de solicitações por dia. Todos eles atingem o PHP diretamente, já que não posso armazenar em cache 404 informações de cabeçalho de resposta junto com o conteúdo no memcached, portanto, a pesquisa memcached_pass sempre falha.

Como posso armazenar em cache todas as solicitações que retornam um 404? O HTTPProxModule for Nginx é o que eu estou procurando? Ou eu deveria preferir ir para verniz?

Do meu ponto de vista atual, não estou interessado em mudar minha configuração inteira e descartar a diretiva memcached_pass do nginx. É bastante interessante até agora, porque o php decide se um pedido pode (deve) ser armazenado em cache no memcached ou não. Também é muito fácil liberar o cache quando necessário.

Meu arquivo de configuração atual do 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;
    }


}

Um exemplo de configuração para Nginx ou Varnish seria ótimo.

Obrigado! :)

    
por Steffen 15.10.2011 / 02:18

2 respostas

1

O Varnish armazena em cache os 404's por padrão, portanto nenhuma configuração (exceto a inicial, configuração básica do Varnish) é necessária - a menos que o backend forneça uma resposta que o Vernnish considera não-editável.

Se for esse o caso, você pode fazer as alterações necessárias na resposta usando o VCL e forçá-lo a ser armazenado em cache.

Eu não forneci nenhum exemplo, porque não há nenhum a ser dado - na verdade.

    
por 15.10.2011 / 22:04
0

Se você quiser fazer isso via nginx, pode ser feito assim:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

link

    
por 13.02.2015 / 20:51