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 для получения дополнительных статей, которые скоро появятся!
Get new posts in your inbox
No spam. Unsubscribe anytime.