Назад | Перейти на главную страницу

Кеширование 404-х - NGINX или Varnished?

Я ищу решение для долгосрочного кеширования 404 (несколько дней / недель) на веб-сервере. Моя текущая установка - NGINX с прокси memcached_pass и PHP-FPM для доставки некэшированных страниц (PHP также записывает содержимое в memcached). Похоже, сканерам во всем Интернете нравятся мои страницы, и они генерируют несколько тысяч запросов 404 в день. Все они попадают в PHP напрямую, поскольку я не могу кэшировать информацию заголовка ответа 404 вместе с содержимым в memcached, поэтому поиск memcached_pass всегда терпит неудачу.

Как я могу кэшировать все те запросы, которые возвращают 404? Является ли HTTPProxModule для Nginx тем, что я ищу? Или мне лучше выбрать лак?

С моей нынешней точки зрения, я не хочу менять свое весь setup и удалите директиву memcached_pass из nginx. Пока это довольно удобно, потому что php решает, можно (нужно) кэшировать запрос в memcached или нет. При необходимости также довольно легко очистить кеш.

Мой текущий файл конфигурации 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;
    }


}

Отлично подойдет пример конфигурации для Nginx или Varnish.

Спасибо! :)

Varnish кэширует 404 по умолчанию, поэтому никакая конфигурация (за исключением начальной, базовой конфигурации Varnish) не требуется - если только серверная часть не предоставляет ответ, Varnish считает не кэшируемым.

Если это так, вы можете внести необходимые изменения в ответ с помощью VCL и принудительно кэшировать его.

Я не привел никаких примеров, потому что на самом деле их нет.

Если вы хотите сделать это через nginx, это можно сделать следующим образом:

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