Nginx · 3 min read · Jan 22, 2026

Почему вам всегда следует использовать Nginx с микрокешированием

Почему вам всегда следует использовать Nginx с микрокешированием

Все знают, как сложно выжать максимум из вашего веб-сервера(ов). В моей повседневной работе как инженера по хостингу это означает, что я довольно часто получаю один и тот же вопрос: “Вау, классный сайт, но может ли он справиться с большим трафиком?”.

“Нормальная” ситуация

“Нормальный” сайт, работающий под Apache с mod_php, должен быть в состоянии обрабатывать 20 запросов в секунду без проблем, но что если вы получаете, скажем, 50 запросов в секунду (что не странно для некоторых сайтов, таких как сайты политических партий и т.д.)? Ответ, на мой взгляд, в том, чтобы отказаться от Apache, потому что в текущем виде Apache просто уже не справляется.

ДА! Nginx!

На помощь приходит Nginx! Итак, вы настраиваете свой сайт на Nginx и проводите быструю нагрузочную проверку (например, 1000 запросов с 200 одновременно подключенными пользователями) и видите, что вы не получаете много больше, чем с Apache, но как? Все очень просто, это связано с тем, что у Nginx нет встроенного модуля php, поэтому вам нужен процессор fastcgi для обработки php-страниц (я рекомендую использовать php-fpm, так как он лучше, чем spawn-cgi). Так что что же мне теперь использовать, спрашиваете вы? Используйте микрокеширование!

Что такое микрокеширование?

Что такое микрокеширование? Теория заключается в том, что вы кэшируете свои файлы и т.д. на короткий промежуток времени (например, на 1 секунду). Это означает, что когда пользователь запрашивает страницу, она кэшируется, так что следующий запрос на любую другую страницу будет поступать из кэша, и при 100 пользователях, запрашивающих в течение 5 секунд, только 1 из 20 пользователей должен будет собрать полную страницу (и с Nginx и хорошо структурированным сайтом это не проблема).

Я не верю в это!

Вы лучше поверьте! Позвольте мне привести вам пример, возьмите этот сайт, на котором вы находитесь прямо сейчас. Допустим, у нас есть нагрузочная проверка на 1000 запросов с 200 одновременно подключенными пользователями. Если вы запустите этот сайт под Apache, вы получите от 10 до 40 запросов в секунду, максимум! И ваш веб-сервер будет под серьезной нагрузкой, и вам придется расширять вашу среду. Под Nginx с php-fpm без микрокеширования это то же самое (возможно, немного больше запросов, но на вашем сервере будет много процессов php-fpm, работающих для обработки запросов). С микрокешированием вы получаете целых 300-450 запросов в секунду!

Ладно, дайте мне это!

Микрокеширование на самом деле легко настроить, ниже приведен пример конфигурации, которую вы можете использовать для любого сайта, созданного с PHP (в данном случае она специфична для Wordpress). Посмотрите:

#
# ваш сайт
#
server {
    listen       80;
    server_name  <ваши имена хостов>;
    access_log  <ваш журнал доступа>  main;
    error_log <ваш журнал ошибок>;
    root   <ваша корневая папка>;
    location / {
        index  index.php index.html index.htm;
    }
    if (!-e $request_filename) {
        rewrite ^(.+)$ /index.php?q=$1 last;
    }
    location ~ \.php$ {
        # Настройка значений по умолчанию
        set $no_cache "";
        # Если не GET/HEAD, не кэшировать и пометить пользователя как некэшируемого на 1 секунду через cookie
        if ($request_method !~ ^(GET|HEAD)$) {
            set $no_cache "1";
        }
        # Удалить cookie без кэша, если это необходимо
        # (по какой-то причине, add_header не срабатывает, если включен в предыдущий if-блок)
        if ($no_cache = "1") {
            add_header Set-Cookie "_mcnc=1; Max-Age=2; Path=/";
            add_header X-Microcachable "0";
        }
        # Обойти кэш, если установлено cookie без кэша
        if ($http_cookie ~* "_mcnc") {
                    set $no_cache "1";
        }
        # Обойти кэш, если установлен флаг
        fastcgi_no_cache $no_cache;
        fastcgi_cache_bypass $no_cache;
        fastcgi_cache microcache;
        fastcgi_cache_key $server_name|$request_uri;
        fastcgi_cache_valid 404 30m;
        fastcgi_cache_valid 200 10s;
        fastcgi_max_temp_file_size 1M;
        fastcgi_cache_use_stale updating;
        fastcgi_pass localhost:9000;
        fastcgi_pass_header Set-Cookie;
        fastcgi_pass_header Cookie;
        fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param  PATH_INFO          $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;
        #fastcgi_intercept_errors on;
        include fastcgi_params;
    }
}

Вам также следует добавить формат кэша и зону кэша в ваш nginx.conf, добавьте эти строки в ваш http {} блок:

fastcgi_cache_path /var/cache/nginx2 levels=1:2 keys_zone=microcache:5m max_size=1000m;
log_format cache '$remote_addr - $remote_user [$time_local] "$request" '
'$status $upstream_cache_status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

Попробуйте это!

Я призываю всех попробовать это самостоятельно и увидеть улучшение производительности! Я знаю, что это большой переход от Apache к Nginx (в плане конфигурации), но вы быстро в этом разберетесь!

Посмотрите на http://livebyt.es для получения дополнительных статей, которые скоро появятся!

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.