Кэширование в NGINX

Как настроить кеширование страниц для ускорения работы сайта

При высокой нагрузке на сайт серверные ресурсы расходуются очень быстро. Кэширование позволяет оптимизировать обработку запросов, ускоряет время отклика и снижает нагрузку на базу данных и PHP. Применяя кэш, приложение генерирует страницу один раз и сохраняет результат в памяти на заданное время (TTL). Пока TTL не истечёт, пользователи будут получать уже готовую версию страницы. Давайте посмотрим, как настроить кэширование в Nginx.

Для включения кэширования в Nginx сначала необходимо определить максимальный размер кеша (общий размер всех страниц в кеше не может превышать это значение). Сделать это можно в конфигурационном файле /etc/nginx/nginx.conf с помощью директивы в секции http:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=all:32m;

Не забываем создать каталог для кеширования, который мы указали выше:

# mkdir /var/cache/nginx

Далее следует изменить настройки сайта, создав еще одну секцию server. Переносим наш основной сервер на другой порт (например, 81), а на стандартном 80 у нас теперь будет работать кэширующий хост, который либо будет отдавать данные из кэша, либо перенаправлять запросы на основной хост. Это может выглядеть примерно так:

server {
        listen 80;
 
        location / {
                proxy_pass http://127.0.0.1:81/;
                proxy_cache all;
                proxy_cache_valid any 1h; # Кешируем на 1 час 
        }
}

Для основного сервера:

server {
        listen 81;
 
        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }
 
        location = /favicon.ico { access_log off; log_not_found off; }
        location = /robots.txt  { access_log off; log_not_found off; }
 
#        access_log off;
        access_log /var/log/nginx/letsclearitup.access.log;
        error_log  /var/log/nginx/letsclearitup.error.log error;
 
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include fastcgi_params;
                fastcgi_index index.php;
                fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
                fastcgi_pass unix:/run/php/letsclearitup.sock;
                fastcgi_hide_header X-Powered-By;
        }
 
        location /status {
                fastcgi_pass unix:/run/php/letsclearitup.sock;
                include fastcgi.conf;
                allow 127.0.0.1;
                deny all;
        }
}

Если у пользователя установлены какие-либо Cookies, кэширование можно отключить:

server {
        listen 80;
 
        location / {
                if ($http_cookie ~* ".+" ) {
                        set $do_not_cache 1;
                }
                proxy_pass http://127.0.0.1:81/;
                proxy_cache all;
                proxy_cache_valid any 1h; # Кешируем на 1 час 
        }
}

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

server {
        listen 80;
 
        location / {
                if ($http_cookie ~* ".+" ) {
                        set $do_not_cache 1;
                }
                proxy_pass http://127.0.0.1:81/;
                proxy_cache all;
                proxy_cache_valid 404 502 503 1m;
                proxy_cache_valid any 1h; # Кешируем на 1 час 
        }
}

У Nginx есть возможность кеширования ответов от fastcgi. Чтобы использовать данную возможность, в секции http файла /etc/nginx/nginx.conf добавляем:

fastcgi_cache_path /var/cache/fpm levels=1:2 keys_zone=fcgi:100m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Создаем каталог:

# mkdir /var/cache/fpm

После чего в настройках сайта (в секции server для основного хоста) добавим такие строки:

server {
        listen 81;
...
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include fastcgi_params;
                fastcgi_index index.php;
                fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
                fastcgi_pass unix:/run/php/letsclearitup.sock;
                fastcgi_hide_header X-Powered-By;
                fastcgi_cache fcgi;
                fastcgi_cache_valid 200 60m; # кешировать ответы с кодом 200 на 1 час 
        }
...
}

Примечание

На VPS и выделенных серверах вы можете полностью управлять конфигурацией NGINX, включая гибкую настройку кэширования.

Нужна помощь?Наши инженеры бесплатно помогут с любым вопросом за считанные минутыНаписать нам