Logo
Загрузка ... Запускаем сайт.

Отправить заявку

Тюнинг WordPress на Nginx + PHP-FPM 8.3: Оптимизация сервера

67
Тюнинг WordPress на Nginx + PHP-FPM 8.3: Оптимизация сервера

С 2026 года я полностью перевел все свои проекты на WordPress на технологический стек PHP FastCGI (Nginx + PHP-FPM) версии 8.3.6 (native) и начал использовать Redis. Результат превзошел все ожидания: сайты буквально «летают». Однако просто развернуть этот стек недостаточно, чтобы выжать из сервера максимум производительности, нужна правильная конфигурация. В этой статье мы подробно разберем, какие именно закулисные настройки необходимо выставить на сервере сразу после запуска сайта, чтобы заставить эту связку работать на пределе возможностей. А так же предоставлю свой промт, который можно использовать в Cursor AI или Claude Code.

Самое важное

  • Nginx FastCGI/page cache для гостей.
  • PHP OPcache.
  • Правильно ограниченный PHP-FPM, чтобы не съесть всю RAM.
  • Redis object cache.
  • Настроенная MariaDB/MySQL.
  • CDN/Cloudflare для статики и защиты от всплесков.
  • Мониторинг и лимиты, чтобы сервер деградировал мягко, а не падал.

Nginx

Базовые настройки:

worker_processes auto;
worker_rlimit_nofile 65535;
events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

В http:

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 20;
client_body_timeout 30;
client_header_timeout 30;
send_timeout 30;
client_max_body_size 64m;
gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript application/xml image/svg+xml;

Для PHP:

fastcgi_connect_timeout 10s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;
fastcgi_buffer_size 32k;
fastcgi_buffers 16 16k;
fastcgi_busy_buffers_size 64k;
fastcgi_temp_file_write_size 256k;

FastCGI Cache Для WordPress

Это один из самых сильных бустов. Для гостей страницы должны отдаваться из Nginx, не заходя в PHP. Примерно:

fastcgi_cache_path /var/cache/nginx/wordpress
    levels=1:2
    keys_zone=WORDPRESS:256m
    inactive=60m
    max_size=5g;

Кэшировать можно:

fastcgi_cache WORDPRESS; fastcgi_cache_valid 200 301 302 10m; fastcgi_cache_valid 404 1m; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; fastcgi_cache_lock on;

Не кэшировать:

set $skip_cache 0;

if ($request_method = POST) {
    set $skip_cache 1;
}

if ($query_string != "") {
    set $skip_cache 1;
}

if ($request_uri ~* "/wp-admin/|/wp-login.php|/cart|/checkout|/my-account") {
    set $skip_cache 1;
}

if ($http_cookie ~* "wordpress_logged_in|comment_author|woocommerce_items_in_cart|wp-postpass") {
    set $skip_cache 1;
}

OPcache

opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=384
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=10000
opcache.revalidate_freq=0
opcache.validate_timestamps=0
opcache.save_comments=1
opcache.fast_shutdown=1
opcache.huge_code_pages=1

PHP-FPM

Для сервера 8 GB RAM я бы начал так:

pm = dynamic
pm.max_children = 25
pm.start_servers = 6
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.max_requests = 500
request_terminate_timeout = 120s

pm.max_children нельзя ставить “побольше”. Его считают по памяти:

pm.max_children = доступная RAM под PHP / средний размер одного PHP-процесса

Для WordPress один PHP-FPM процесс часто ест 80-180 MB. Если выделить PHP примерно 3 GB, то:

3000 MB / 120 MB ≈ 25 процессов

Если БД на этом же сервере, я бы не ставил выше 25-30 без замеров. Если база отдельно, можно пробовать 35-45.

PHP.ini

Рекомендуемые стартовые значения:

memory_limit = 256M
max_execution_time = 60
max_input_time = 60
post_max_size = 64M
upload_max_filesize = 64M
max_input_vars = 3000
realpath_cache_size = 4096K
realpath_cache_ttl = 600
expose_php = Off

Для админки и тяжёлых импортов иногда нужен memory_limit = 512M, но для фронта лучше не разгонять память без необходимости.

Redis Object Cache

Поставить Redis и WordPress-плагин типа Redis Object Cache.

Redis config стартово:

maxmemory 512mb
maxmemory-policy allkeys-lru

В wp-config.php можно добавить:

define('WP_CACHE_KEY_SALT', 'site-domain:');
define('WP_REDIS_MAXTTL', 86400);

MariaDB/MySQL

Если база на этом же сервере, стартово:

innodb_buffer_pool_size = 3G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

max_connections = 100
table_open_cache = 4000
thread_cache_size = 64
tmp_table_size = 128M
max_heap_table_size = 128M

slow_query_log = 1
long_query_time = 1

Поделиться:
girl

Комментарии (0)

🟣 Ожидание (бот отвечает) 🟢 Онлайн (оператор подключён)