Debian Jessie: WEB-сервер — ускоряемся … (memcached, xcache)

Это заметка из цикла стетей моего небольшого HowTo по Debian Jessie.

Попробуем немного ускорить выдачу сервером web-контента. Начнем с простого пятиминутного тюнинга … сессии. По умолчанию сессии пользователей на сервере хранятся в виде отдельных файликов на файловой системе в директории /var/lib/php5/sessions Это вполне отлично при малом количестве посетителей ресурса, но становится проблемой при увеличении посещаемости, так как дисковые операции очень «дорогие» и «тяжелые» с точки зрения сервера. Такой способ хранения сессий порождает излишнюю нагрузку на дисковую подсистему сервера и замедляет выдачу контента пользователям. Выход придуман давным давно — перенести сессии в RAM-у сервера. Простейшим решением является сервис memcached который представляет из себя key value базу данных работающую исключительно в оперативной памяти. Это, кстати, таит в себе и побочный неприятный момент — в случае перезапуска сервиса memcached или сервера целяком — база очищается, а значит пользователям придется «перелогиниться». Если это критичный для вас момент — тогда лучше использовать сервис который синкает базу данных на диск, например couchbase или redis. Но я не дорожу своими сессиями, потому что пользователей у меня чуть больше чем 1 🙂 поэтому буду использовать memcached
Установим необходимые пакеты:

gw:~$ sudo apt-get install memcached php5-memcached

Открываем основной конфиг memcached:

gw:~$ sudo vim /etc/memcached.conf

По умолчанию сервис запускается с базой в 64MB, для меня это мало (чуть позже расскажу почему) — ставлю 128 MB:

-m 128

Запускаем службу memcached:

gw:~$ sudo systemctl start memcached

Проверяем что служба «слушает» порт 11211:

gw:~$ sudo netstat -lnp |grep mem
tcp  0  0 127.0.0.1:11211   0.0.0.0:*     LISTEN      3187/memcached  
udp  0  0 127.0.0.1:11211   0.0.0.0:*                 3187/memcached  
gw:~$

Теперь перестроим php таким образом чтобы он хранил сессии в memcached, а не в файлах на диске. Открываем конфиг php.ini для fpm:

gw:~$ sudo vim /etc/php5/fpm/php.ini

Ищем там секцию [Session] и настраиваем ее вот так (привожу только те параметры что поменял, остальные оставляем по дефолту):

session.save_handler = memcached
session.save_path = "127.0.0.1:11211"
session.gc_probability = 1

Перезапускаем сервис php5-fpm:

gw:~$ sudo systemctl restart php5-fpm.service

Если вы используете в apache2 модуль php5 то у него есть отдельный конфиг ( /etc/php5/apache2/php.ini ), операцию по перестройке его на memcached сессионное хранилище нужно повторить по аналогии с php5-fpm, после чего перегрузить сервис apache2

Поскольку memcached давно откатанный и стабильный вариант работы с RAM хранилищем в PHP (и не только) в различных WEB проектах его используют не только для хранения сессий, но и как хранилку кеша. Для популярных CMS есть готовые модули которые умеют запихивать в memcache куски страниц или даже целые страницы готового скомпилированного HTML-я. Это позволяем в разы увеличить скорость выдачи контента и при этом уменьшить нагрузку на сервер (магия?) но требует серьезной проработки кода проекта под фичу кеширования вцелом.
Вот примеры среди популярных бесплатных CMS:
— Drupal 6/7 — тыц
— WordPress — тыц
— Joomla — тыц
и тд.
Я отдал memcached-у 128MB RAM именно для этого варианта кеширования.
Ставим модуль, настраиваем, пользуемся и радуемся дикому приросту скорости отдачи контента. Имейте ввиду что кеш очищается при рестарте сервиса memcached.

С memcached вроде как все ясно, неясно одно — почему решение вопроса «кешировать или компилить» должен решать программист конкретного продукта с помощью сторонних приложений, а не сам php? Это вполне логичный вопрос и он имеет решение в виде модулей для php которые призваны этим заниматься. Их много, почитать коротко о них можно здесь, ИМХО — достаточно вменяемый на сегодняшний день XCache, он достаточно стабилен и продолжает развиваться. Достаточно часто встречал в сети лестные отзывы о нем. Пробую прикрутить …

Установим необходимые пакеты:

gw:~$ sudo apt-get install php5-xcache

Приятной особенностью данного модуля является наличие web-админки где можно посмотреть текущие настройки, статистику, очистить кеш и тп Это не обязательная фича данного модуля, можно не заморачиваться, но мне было интересно — решил настроить.
Генерим пароль в админку XCache (иначе никак):

gw:~$ echo -n "_mypassword_" | md5sum
34819d7beeabb9260a5c854bc85b3e44  -
gw:~$

Для настройки модуля xcache открываем его конфиг:

gw:~$ sudo vim /etc/php5/fpm/conf.d/20-xcache.ini

Вот такой конфиг получился (только то что поменял от дефолта):

[xcache.admin]
xcache.admin.enable_auth = On
; Configure this to use admin pages
xcache.admin.user = "xcache_admin"    
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = "34819d7beeabb9260a5c854bc85b3e44"

xcache.size  =     64M
xcache.count =     2
xcache.gc_interval = 86400

xcache.var_size  = 8M
xcache.var_count = 2
xcache.var_gc_interval = 86400

xcache.optimizer = On

Перезапускаем сервис php5-fpm:

gw:~$ sudo systemctl restart php5-fpm.service

Про настройку WEB-интерфейса данного модуля расскажу чуть позже, настроим его вместе с другими популярными WEB-приложениями (PHPMyAdmin, PostfixAdmin, Roundcube).

Теоретически такой вариант кеширования должен работать быстрее чем основанный на memcached, чтобы убедиться в этом нужно тестировать, но это уже отдельная тема. Модуль работает сразу после его включения в php5. Для большей эффективности можно использовать плагины со стороны CMS, например для WordPress можно попробовать вот этот модуль. Устанавливается он не сложно, по инструкции. Дополнительных действий никаких, просто ждем пока наполнится кеш и наступит нирвана 🙂 Напомню что в данном варианте кеш очищается при рестарте сервиса php5-fpm

Незнаю будет ли кому полезно, получилось несколько сумбурно …

Хай щастить!

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?