Возможно ли «выжать» из сайта на WordPress высокую производительность? Наш ответ — да! В этой статье мы покажем, как добиться устойчивой работы сайта на WordPress при высоких нагрузках, доходящих до 10,000 соединений в секунду, что равно 800 миллионам посещений в сутки.
Прежде всего, нам нужен собственный виртуальный сервер (VPS). Для тестов использовался VPS, арендованный у DigitalOcean за 20 USD в месяц со следующими параметрами: 2GB памяти, 2 процессора, 40GB дискового пространства на SSD. В качестве операционной системы была выбрана CentOS Linux release 7.3.
Дальнейший текст можно рассматривать почти как пошаговую инструкцию для опытных администраторов. Будут приведены только те параметры, которые отличаются от стандартных и увеличивают производительность сервера. Итак, вперед!
# Автоматически установить число рабочих процессов, равное числу процессоров
worker_processes auto;# В секции events# epoll — эффективный метод обработки соединенийuse epoll;# Рабочему процессу принимать сразу все новые соединения (иначе только одно за другим)
multi_accept on;# В секции http# Выключаем логи
error_log /var/log/nginx/error.log crit;# только сообщения о критических ошибках
access_log off;
log_not_found off;# Отключаем возможность указания порта при редиректе
port_in_redirect off;# Разрешить больше запросов для keep-alive соединения
keepalive_requests 100;# Уменьшаем буферы до разумных пределов# Это позволяет экономить память при большом числе запросов
client_body_buffer_size 10K;
client_header_buffer_size 4k;# на WordPress 2k может не хватать
client_max_body_size 50m;
large_client_header_buffers 24k;# Уменьшаем таймауты
client_body_timeout 10;
client_header_timeout 10;
send_timeout 2;# Разрешаем сброс соединений по таймауту
reset_timedout_connection on;# Ускорение работы tcp
tcp_nodelay on;
tcp_nopush on;# Разрешение использование системной функции Linux - sendfile() для ускорения файловых операций
sendfile on;# Включаем сжатие данных
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 1100;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
gzip_disable msie6;
gzip_vary on;# Включаем кэширование открытых файлов
open_file_cache max=10000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;# Устанавливаем Таймаут php
fastcgi_read_timeout 300;# Подключаем php-fpm по сокету - работает быстрее, чем по tcp
upstream php-fpm {# Это должно соответствовать директиве "listen" в пуле php-fpm
server unix:/run/php-fpm/www.sock;}# Включаем дополнительные файлы конфигураций
include /etc/nginx/conf.d/*.conf;
Создаем файл /etc/nginx/conf.d/servers.conf и записываем туда секции server для сайтов. Пример:
max_connections =64
key_buffer_size =32M# innodb_buffer_pool_chunk_size по умолчанию 128M
innodb_buffer_pool_chunk_size=128M# Когда innodb_buffer_pool_size меньше чем 1024M,# innodb_buffer_pool_instances будет установлен MySQL в 1
innodb_buffer_pool_instances =1# innodb_buffer_pool_size должен быть равен ил быть кратен# innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances
innodb_buffer_pool_size =512M
innodb_flush_method = O_DIRECT
innodb_log_file_size =512M
innodb_flush_log_at_trx_commit =2
thread_cache_size =16
query_cache_type = ON
query_cache_size =128M
query_cache_limit =256K
query_cache_min_res_unit =2k
max_heap_table_size =64M
tmp_table_size =64M
Запускаем:
systemctl start mysqld
systemctl enable mysqld
ОбщийпринциппостроениявысокопроизводительногосайтанаWordPresssтаков:вседолжнопомещатьсяпримернов75%оперативнойпамяти: nginx, mysql, php-fpm.Вконсоливкоманде top должнобытьвидно,чтосвободно20-25%оперативкии swap неиспользуется.Этапамятьещеоченьпригодитсяпризапускемножествапроцессов php-fpm вовремяобработкидинамическихстраницсайта.
Ас https,какиожидалось,существенномедленнее.Слишкоммногооперацийпосогласованиюключей,хешированию,шифрованиюит.д.Забавнонаблюдатьвкоманде top вконсоли,какдвапроцесса nginx пожираюткаждый🙂по99%процессора.Вотрезультат—1,000соединенийвсекунду:
Единственный обладатель значков золотой WordPress и бронзовый WooCommerce на StackOverflow RU. WordPress Core contributor. Работал ведущим девелопером в команде WPML.