DevOps

Laravel и Nginx FastCGI Cache

Задача

Ускорить сайт с помощью кеширования Nginx FastCGI Cache, путем отдачи страницы напрямую из кеша Nginx без обращения к PHP.

В следующем примере покажу как кешировать Laravel с условиями:

  • страница главная,
  • запросы типа GET и никакие другие,
  • только те запросы, в которых нет GET параметров

Измените содержимое ваших конфигов

  • etc\nginx\sites-available\YOUR_DOMAIN_CONFIG:
server {
    ...

    try_files $uri $uri/ /index.php;

    add_header X-Cache $upstream_cache_status;

    location ~ \.php$ {

        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;

        fastcgi_cache MYAPP;
        fastcgi_cache_valid 200 1m;
        fastcgi_cache_bypass $no_cache;
        fastcgi_no_cache $no_cache;
        fastcgi_cache_use_stale updating error timeout invalid_header http_500;
        fastcgi_cache_lock on;
        fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

        include fastcgi_params;
    }

    set $no_cache 0;
    if ($request_method != GET) {
         set $no_cache 1;
    }
    if ($query_string != "") {
         set $no_cache 1;
    }
    if ($request_uri != "/") {
         set $no_cache 1;
    }
}
  • etc\nginx\nginx.conf:
http {
    ...

    fastcgi_cache_path /tmp/nginx_cache levels=1:2 keys_zone=MYAPP:10m inactive=60m max_size=512m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
}

Протестируйте конфигурацию Nginx:

nginx -t

Перезапустите Nginx:

sudo systemctl reload nginx

Откройте страницу вашего сайта в браузере, во вкладке Network проверьте заголовок x-cache. Если страница получена из кэша, то вы увидите значение HIT. (Первый раз будет MISS, т.к. кеш только сгенерировался).

  • miss — отсутствие данных в кэше, 
  • expired — просроченные ответы, 
  • bypass — ответ не был взят из кэша вследствие proxy_cache_bypass и аналогичных директив.

 

Источники:

Leave a reply