Wordpress Speed Up
После того, как настроил свой сервер, немного успокоился и расслабился. Время отклика минимальное, нагрузка на процессор очень маленькая, уровень используемой памяти практически не изменяется и есть очень большой запас.
Что еще нужно для счастливой жизни? Ан нет, в последнее время все больше не давал покоя показатель уровня обрабатываемых запросов. Максимум, что удалось выжать это порядка 20 запросов в секунду. Сопоставляя с показаниями зарубежных блогеров, у которых на чистом apache были значения в 5-7 тыс запросов в секунду, ощущал неудовлетворенность.
По сути проблема заключалась в использовании в каждом запросе PHP-интерпретатора, что излишне загружало процессор. Нужно было каким-то образом избавиться от повторной генерации страниц. И как раз, на днях, на глаза стали попадаться статьи про кеширующий сервер Varnish. Решил его сегодня попробовать.
В Ubuntu устанавливается, как всегда, очень просто:
# apt-get install varnish
Сразу после установки он запускается, но для его использования нужно еще верно указать порты frontend-серверу, что используются Varnish. Но перед этим немного изменим конфигурацию, для корректного использования WordPress. Изменяем файл /etc/varnish/default.vcl:
backend default {
.host = "127.0.0.1";
.port = "8080";
}
# Unless this is the login or admin page, unset the cookie!
sub vcl_recv {
# admin users always miss the cache
if( req.url ~ "^/wp-(login|admin)" || req.http.Cookie ~ "wordpress_logged_in_" ){
return (pass);
}
# ignore any other cookies
unset req.http.Cookie;
return (lookup);
}

И если первый блок остается почти без изменения, там изменяется только номер порта, по которому работает apache, обрабатывающий PHP-скрипты, то второй блок прописывается полностью. Он нужен для того, чтобы администратор мог работать с сайтом напрямую, минуя кэш. И для того, чтобы исключить все те cookies, что плодит WordPress. Без данного блока будет использоваться не кеш, а страницы каждый раз будут генерироваться по новой.
Теперь перезапускаем Varnish:
# /etc/init.d/varnish restart
И изменяем конфигурацию виртуального сервера в nginx, у меня это файл /etc/nginx/sites-available/juev.ru, меняется только следующий раздел:
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_pass http://127.0.0.1:8080; # Apache listening
proxy_pass http://127.0.0.1:6081; # Varnish listening
}
То есть просто указали другой порт backend’а. Перезапускаем nginx и смотрим на работу сайта. Я протестировал работу сайта с помощью ab:
# ab -n 5000 -c 100 http://www.juev.ru/index.php
. . .
Concurrency Level: 100
Time taken for tests: 0.952 seconds
Complete requests: 5000
Failed requests: 0
Write errors: 0
Non-2xx responses: 5000
Total transferred: 1875000 bytes
HTML transferred: 0 bytes
Requests per second: 5253.66 [#/sec] (mean)
Time per request: 19.034 [ms] (mean)
Time per request: 0.190 [ms] (mean, across all concurrent requests)
Transfer rate: 1923.95 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 2.5 1 11
Processing: 2 17 5.8 17 46
Waiting: 2 16 6.0 16 45
Total: 2 19 5.7 18 46
. . .
При этом, во время теста процессор практически не нагружался. Заметить работу теста было просто не возможно.
Разница между 20 запросами в секунду и 5253.66 довольно существенная. Я думаю, что использование Varnish в качестве дополнительной прослойки между Nginx и Apache вполне оправданно!
Итого Nginx занимается отдачей мультимедиа файлов и регулированием внешними соединениями, Apache занимается обработкой PHP-скриптов, а Varnish кеширует работу Apache. Система потихоньку усложняется, обрастает новыми элементами, но в то же время повышает свою эффективность и производительность.
Я думаю, тут есть еще над чем поработать!