---
title: 'Настройка FastCGI Microcache в Nginx PHP-FPM | Zomro'
description: 'Преимущество FastCGI MicroCache в том, что при запросе от сервера, ответ кешируется для пользователя, и уже доступен в выделенной области на диске и в RAM.'
image: 'https://dx86q6oq7ry0e.cloudfront.net/uploads/media/blog/a48@server-panel.net/2022/07/01/1658069962_1.png'
---

![opened image]()

  * [Zomro](https://zomro.com/rus/)
  * [FAQ](https://zomro.com/rus/blog/faq/)
  * Настройка FastCGI Microcache в Nginx PHP-FPM 



# Настройка FastCGI Microcache в Nginx PHP-FPM

13-07-2022

Преимущество FastCGI MicroCache в том, что при запросе от сервера, ответ кешируется для пользователя, и уже доступен в выделенной области на диске и в RAM.  
  
Это большое преимущество, так как снимает нагрузку с сервера при большом количестве запросов к одной странице.  
  
Это касается тех страниц, которые не изменяются, или изменяются редко.   
  
  
Предположим большое количество пользователей одновременно просматривают главную страницу. Ответ от сервера для всех пользователей будет составлять около 2 сек до первого байта. Это связано с тем что серверу необходимо обработать данный запрос и только после - выдать его.   
  
Чтобы уменьшить ответ до первого байта, используем FastCGI Microcache.  
  
В начале, мой конфиг сайта выглядит примерно так:  

    
    
    
                        server {
                            listen      xx.xx.xx.xx:443 ssl http2;
                            server_name site.com www.site.com;
                            root        /home/admin/web/site.com/public_html;
                            index       index.php index.html index.htm;
    
                            ssl_certificate      /home/admin/conf/web/ssl.site.com.pem;
                            ssl_certificate_key  /home/admin/conf/web/ssl.site.com.key;
    
                            location / {
                            
                                try_files $uri $uri/ /index.php?$query_string;
    
    
                            }

  
А серверный конфиг **/etc/nginx/nginx.conf** так:
    
    
    
                        # Server globals
                        user                    nginx;
                        worker_processes        auto;
                        worker_rlimit_nofile    65535;
    
    
                        # Worker config
                        events {
                                worker_connections  1024;
                                use                 epoll;
                                multi_accept        on;
                        }
    
    
                        http {
    
    
    
    
                            # Compression
                            gzip                on;
                            gzip_vary           on;
                            gzip_comp_level     5;
                            ....
                            ....
                         
                        }
    
    

  
Для начала необходимо определить место и задать параметры хранения кэшированных запросов.   
  
В серверный конфиг (в моем случае**/etc/nginx/nginx.conf**) в блок **http** добавляем следующую конструкцию:
    
    
    fastcgi_cache_path /tmp/nginx_microcache levels=1:2 keys_zone=microcache:10m max_size=500m inactive=1h;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";

  
![Настройка FastCGI Microcache в Nginx PHP-FPM - 1](https://dx86q6oq7ry0e.cloudfront.net/uploads/media/blog/a48@server-panel.net/2022/07/01/1658069962_1.png)  
  
Где:  
  
**fastcgi_cache_path** — определяет расположение кеша на сервере. Даная директория будет очищаться при каждом перезапуске севера. То что будет хранится в данной папке, так же будет занимать место в ОЗУ.   
  
**levels=1:2** — устанавливает двухуровневую иерархию каталогов в папке **/tmp/nginx_microcache**  
  
**keys_zone** — задать имя зоны (Вы можете указать свои предпочтения)  
  
**keys_zone=microcache:10m** \- 10m — размер зоны (таких зоно может быть множество для каждого сайта в отдельности если это необходимо).   
  
**max_size=500m** \- размер пространства которое будет занимать кеш. (Выделяется область в ОЗУ. Главное не перестараться.) Его размер должен быть меньше, чем системная оперативная память + подкачка. Иначе возможна ошибка «Не удается выделить память».  
  
  
**inactive** — задает время, по истечении которого кеш который находиться в /**tmp/nginx_microcache** и в ОЗУ, к которым не обращались, в течение того времени которое указано (1 час), удаляются из кеша. (По умолчанию **inactive=10m**)  
  
  
Далее необходимо задать ключи которые будут указывать какие запросы необходимо кешировать. Это задает директива **fastcgi_cache_key**.  
  
**fastcgi_cache_key** — определяет какие будут кешироваться запросы.  
  
  
Переменные, используемые в **factcgi_cache_key**  
  
**$scheme** – схема запроса HTTPS или HTTP  
**$request_method** — указывает методы запроса, такие как GET или POST.  
**$host** – Имя сервера, соответствующего запроса  
**$request_uri** — Полный URI запроса  
  
Теперь что бы подключить выбранную область к нашему сайту, необходимо в его конфиг в моем случае (**/home/admin/conf/web/xxxxx.xxx.nginx.ssl.conf**) в блок location / добавить следующую конструкцию:
    
    
    location / {
    
    #MicroCache
                        
                        fastcgi_cache microcache;
                        fastcgi_cache_lock on;
                        fastcgi_cache_valid 200 10s;
                        fastcgi_cache_use_stale updating;
                        
                        # Security Header
                        
                        add_header X-FastCGI-Cache $upstream_cache_status;  #Показывает статус кеша в блоке Header
    
    
                        #Задаем условия, при которых ответ не будет браться из кэша.
                        
                        fastcgi_cache_bypass $no_cache; #Определяем переменную $no_cache
                        fastcgi_no_cache $no_cache;     #Определяем переменную $no_cache
    
                            set $no_cache 0;                                             # исключить из кэширования
                            if ($request_method = POST) { set $no_cache 1; }
                            if ($request_method !~ ^(GET|HEAD)$) { set $no_cache "1"; }
    
    
                            if ($query_string != "") { set $no_cache 1; }
                            if ($request_uri ~* "/admin") { set $no_cache 1; }        # исключить из кэширования /admin
    
            }
    }

  
![Настройка FastCGI Microcache в Nginx PHP-FPM - 2](https://dx86q6oq7ry0e.cloudfront.net/uploads/media/blog/a48@server-panel.net/2022/07/01/1658070120_3.png)  
Директивой **fastcgi_cache** \- задаем то же имя зоны которое определено в серверном конфиге. В моем случае **microcache**. (Для каждого отдельного сайта можно задавать свои зоны)  
**fastcgi_cache_valid** \- определяет время кэширования в зависимости от кода состояния HTTP (200, 301, 302). В приведенном выше примере ответы с кодом состояния 200 будут кэшироваться на 10 секунд. Вы также можете использовать период времени, например 12h(12 часов) и 7d(7 дней).   
Для динамического контента, такого как, админка любой CMS, этого делать крайне не желательно.   
В блоке # Security Header определены заголовки **add_header X-FastCGI-Cache $upstream_cache_status;** которые показывают статус запроса, закеширована страница или нет. **MISS, BYPASS, EXPIRED, и HIT** \- чаще всего встречающиеся заголовки.   
Значение **HIT** можно наблюдать, когда страница получена из кэша. Если в заголовке EXPIRED - то это говорит о том что кеш для данного запроса или страницы устарел, то-есть выделенное время которое описано в директиве fastcgi_cache_valid в моем случае 10 секунд - вышло.   
Статус **BYPASS** \- можем наблюдать когда запрос/страница не кешируется. Правила того что не будет попадать в кеш описаны в блоке #Задаем условия, при которых ответ не будет браться из кэша. В моем случае (любая CMS) и все страницы /admin в админ панели не будут кешироваться. Это важно, так как здесь контент постоянно изменяется.   
Статус **MISS** означает что страница не кешируется. 
    
    
    
    					[root@a48zomro ~]# curl -I https://site.com/
                        HTTP/1.1 200 OK
                        Server: nginx
                        Date: Sun, 29 May 2022 11:13:13 GMT
                        ....
                        ....
                        X-FastCGI-Cache: MISS
    
                        
                        [root@a48zomro ~]# curl -I https://site.com/
                        HTTP/1.1 200 OK
                        Server: nginx
                        Date: Sun, 29 May 2022 11:13:23 GMT
                        ....
                        ....
                        X-FastCGI-Cache: HIT
    
                        [root@a48zomro ~]# curl -I https://site.com/admin/
                        HTTP/1.1 302 Found
                        Server: nginx
                        Date: Sun, 29 May 2022 11:13:32 GMT
                        ....
                        ....
                        X-FastCGI-Cache: BYPASS
    
                        [root@a48zomro ~]# curl -I https://site.com/
                        HTTP/1.1 200 OK
                        Server: nginx
                        Date: Sun, 29 May 2022 11:13:39 GMT
                        ....
                        ....
                        X-FastCGI-Cache: EXPIRED
    

  
При данной настройке, наш сайт будет кешироваться и ответ до первого байта может достигать до 2 мс  
  
До оптимизации:  
  
![Настройка FastCGI Microcache в Nginx PHP-FPM - 3](https://dx86q6oq7ry0e.cloudfront.net/uploads/media/blog/a48@server-panel.net/2022/07/01/1658070313_4.png)  
После оптимизации:  
  
![Настройка FastCGI Microcache в Nginx PHP-FPM - 4](https://dx86q6oq7ry0e.cloudfront.net/uploads/media/blog/a48@server-panel.net/2022/07/01/1658070387_5.png)

Похожие статьи

[Подключение через mstsc.exe с параметром /admin: что нужно знать](https://zomro.com/rus/blog/faq/469-connecting-via-mstscexe-with-the-admin-parameter-what-you-need-to-know) [Подключение к VPS серверу по SSH ключу](https://zomro.com/rus/blog/faq/235-podkljuchenie-k-serveru-cherez-ssh-po-kljuchu-s-nestandartnym-portom) [Сброс пароля на дистрибутиве Ubuntu/Debian с помощью GRUB](https://zomro.com/rus/blog/faq/158-sbros-parolja-na-distributive-ubuntu-debian-s-pomoschju-grub) [20 команд для новичков, которые стоило выучить ещё вчера (Часть 1)](https://zomro.com/rus/blog/faq/515-20-commands-for-beginners-that-you-should-have-learned-yesterday) [Как просматривать журналы посещения сервера Centos 7](https://zomro.com/rus/blog/faq/350-how-to-view-centos-7-server-logs)

[ Premium Cloud VPS от €7.95/мес ](/rus/vps)
