#caching #nginx #http-status-code-404 #varnish
#кэширование #nginx #http-status-code-404 #лак
Вопрос:
Я ищу решение для кэширования 404s в долгосрочной перспективе (несколько дней / недель) на веб-сервере. Моя текущая настройка — NGINX с прокси-сервером memcached_pass и PHP-FPM для доставки некэшированных страниц (PHP также записывает содержимое в memcached). Сканерам по всему Интернету, похоже, нравятся мои страницы, и они генерируют несколько тысяч 404 запросов в день. Все они попадают в PHP напрямую, поскольку я не могу кэшировать информацию заголовка ответа 404 вместе с содержимым в memcached, поэтому поиск memcached_pass всегда завершается неудачей.
Как я могу кэшировать все те запросы, которые возвращают 404? Является ли HTTPProxModule для Nginx тем, что я ищу? Или мне лучше выбрать лак?
С моей текущей точки зрения, я не стремлюсь менять всю свою настройку и удалять директиву 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.
Спасибо! 🙂
Ответ №1:
Используйте директиву fastcgi_cache_valid: http://wiki.nginx.org/HttpFcgiModule#fastcgi_cache_valid