Для эффективного взаимодействия со своими сообществами многие крупные организации и компании используют давно зарекомендовавший себя формат форума. В отличие от популярного формата социальных сетей, форум позволяет консолидировать сообщество на качественно другом уровне за счет более точного структурирования данных, возможности использовать мощные инструменты для поиска информации, возможности использовать продвинутые системы рейтингов и геймификации, модерации и защиты от спама.
Целью статьи является описание процедуры установки современного движка XenForo для разворачивания форумов c использованием кэширования на базе memcached и мощнейшего поискового движка ElasticSearch. Эти сервисы будут работать внутри Docker контейнеров и разворачиваться и управляться через интерфейс Plesk.
Кроме того, в статье затронуты вопросы более широкого использования Elastic Stack (ElasticSearch+Logstash+Kibana) в контексте Plesk для анализа данных. Например, анализа поисковых запросов на форуме и анализа логов сервера.
Начнем с разворачивания форума на базе движка XenForo на Plesk домене:
- Создаем в Плеске подписку для домена forum.domain.tld
- В PHP Settings этого домена выбираем последнюю доступную версию PHP для использования. Например, PHP 7.1.10
- Идем в File Manager и в директории httpdocs сайта удаляем все, кроме, возможно, файла favicon.ico
- Через File Manager и кнопку Upload заливаем в директорию httpdocs zip файл дистрибутива XenForo. К примеру, xenforo_1.5.15a_332013BAC9_full.zip
- Распаковываем файл кнопкой Extract Files. Содержимое архива будет распаковано в директорию upload. Нужно войти в нее, выделить все, и с помощью кнопки Move перенести все в директорию httpdocs. После этого, директорию upload и архив xenforo_1.5.15a_332013BAC9_full.zip можно удалить.
- В подписке forum.domain.tld идем в раздел Databases и создаем базу данных для будущего форума. Название, имя пользователя и пароль задаем по своему усмотрению. Примерно вот так:
Для секьюрности важно выставить Access Control в Allow local connections only. - Начинаем инсталляцию форума. Идем по адресу forum.domain.tld. Должно появиться меню инсталляции XenForo. Следуем инструкции и в одном из шагов указываем имя созданной базы данных, имя ее пользователя и пароль. Затем нужно будет создать админиский аккаунт для форума. После успешного окончания установки вы сможете войти в административную панель вашего форума и выполнить окончательные настройки.
- Для значительного ускорения работы вашего форума подключим к нему кэширование на базе memcached и используем для этого соответствующий docker container из Plesk Docker Extension. Но прежде чем мы его установим, нам необходимо установить memcached module для нашей используемой на сайте версии PHP.
- Компилируем memcached PHP module на примере Debian/Ubuntu Plesk server. Устанавливаем все необходимые пакеты:
# apt-get update && apt-get install gcc make autoconf libc-dev pkg-config plesk-php71-dev zlib1g-dev libmemcached-dev
Компилируем модуль:
# cd /opt/plesk/php/7.1/include/php/ext # wget -O phpmemcached-php7.zip https://github.com/php-memcached-dev/php-memcached/archive/php7.zip # unzip phpmemcached-php7.zip # cd php-memcached-php7/ # /opt/plesk/php/7.1/bin/phpize # ./configure --with-php-config=/opt/plesk/php/7.1/bin/php-config # export CFLAGS="-march=native -O2 -fomit-frame-pointer -pipe" # make # make install
Устанавливаем скомпилированный модуль:
# ls -la /opt/plesk/php/7.1/lib/php/modules/ # echo "extension=memcached.so" >/opt/plesk/php/7.1/etc/php.d/memcached.ini # plesk bin php_handler --reread # service plesk-php71-fpm restart
- В установленном Plesk Docker Extension находим memcached docker и устанавливаем и запускаем его вот с такими настройками:
- После этого на вашем Plesk server должен быть доступен порт 11211. Его работоспособность можно проверить командой:
# lsof -i tcp:11211 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME docker-pr 8479 root 4u IPv6 7238568 0t0 TCP *:11211 (LISTEN)
- Подключаем memcached кэширование к форуму. Для этого идем в File Manager и в Code Editor открываем файл forum.domain.tld/httpdocs/library/config.php. В его конец добавляем строки:
$config['cache']['enabled'] = true; $config['cache']['frontend'] = 'Core'; $config['cache']['frontendOptions']['cache_id_prefix'] = 'xf_'; //Memcached $config['cache']['backend']='Libmemcached'; $config['cache']['backendOptions']=array( 'compression'=>false, 'servers' => array( array( 'host'=>'localhost', 'port'=>11211, ) ) );
- Проверяем, что форум работает корректно. Непосредственно работу подключенного кэширования можно проверить командой:
# { echo "stats"; sleep 1; } | telnet localhost 11211 | grep "get_" STAT get_hits 1126 STAT get_misses 37 STAT get_expired 0 STAT get_flushed 0
- К форуму на базе XenForo можно подключить мощный поисковый движок ElasticSearch. Для этого необходимо будет установить плагин XenForo под названием XenForo Enhanced Search и docker container elasticsearch. Этот docker container для своей работы требует значительного объема памяти, поэтому, ваш сервер должен иметь достаточное ее количество. Установку плагина XenForo Enhanced Search можно так же выполнить загрузкой и распаковкой zip файла через Plesk File Manager. Детали установки XenForo плагинов можно найти в соответствующей документации. В итоге в админской панели вашего форума вы должны получить вот такие настройки вашего поискового движка ElasticSearch:
- Для того, чтобы поиск заработал в Plesk Docker Extension необходимо установить elasticsearch docker container с такими настройками:
и затем проверить, что порт 9200 открыт для подключения с помощью команды:
# lsof -i tcp:9200
- После этого в панели администрирования форума нужно убедиться, что ElasticSearch подключен и создать поисковый индекс:
- В итоге вы получили форум на современном движке XenForo с мощной поисковой системой и ускоренный кэшированием на базе memcached. В качестве дальнейшего усовершенствования и расширения возможностей, можно использовать анализ поисковых запросов на вашем форуме с помощью Kibana. Для этого нужно будет использовать либо отдельный kibana docker container, либо один elasticsearch+kibana docker container и патч для плагина XenForo Enhanced Search, который создает отдельный индекс ElasticSearch, в котором хранятся поисковые запросы и которые можно будет анализировать с помощью Kibana. Например, получать вот такую статистику по используемым в поисковых запросах ключевым словам:
- Пропатченный файл для версии 1.1.6 XenForo Enhanced Search плагина можно взять тут ElasticSearch.php Им нужно заменить оригинальный файл в директори httpdocs>library>XenES>Search>SourceHandler После этого помимо поискового индекса в ElasticSearch будет создан отдельный индекс для хранения поисковых запросов с именем saved_quiries, который нужно будет использовать для анализа в Kibana.
Интересным применением видится замена стандартных систем анализа в Плеске Awstats и Webalizer на более эффективную и гибкую систему анализа в Kibana. Существует несколько вариантов отправки vhost logs в ElasticSearch. Например:
- с помощью третьей компоненты Elastic Stack — Logstash
- с помощью сервиса rsyslog и установленного для него плагина omelasticsearch.so (yum install rsyslog-elasticsearch) данные логов можно напрямую отправлять в ElasticSearch. Это очень круто, так как не требуется лишнее звено в виде Logstash.
Пока проблема тут в том, что для правильного хранения логов в ElasticSearch и распарсивания их Kibana, они должны быть в json формате. На уровне vhost изменить nginx параметр log_format не представляется возможным. Как один из вариантов возможного решения, это использование сервиса Filebeat, который будет брать обычный лог nginx, Apache или другого сервиса, парсить его в необходимый формат и отдавать дальше. Причем он позволяет собирать логи с разных серверов. В-общем, поле для экспериментов видится огромным.
Например, с помощью rsyslog можно отправлять любые другие системные логи в ElasticSearch для анализа Kibana и это вполне работоспособно. Например, можно использовать такой конфигурационный файл /etc/rsyslog.d/syslogs.conf, который будет работать для отправки журналов локального журнала syslog в Elasticsearch в удобном для Logstash/Kibana формате после запуска службы rsyslog командой rsyslogd -dn:
# for listening to /dev/log
module(load="omelasticsearch") # for outputting to Elasticsearch
# this is for index names to be like: logstash-YYYY.MM.DD
template(name="logstash-index"
type="list") {
constant(value="logstash-")
property(name="timereported" dateFormat="rfc3339" position.from="1" position.to="4")
constant(value=".")
property(name="timereported" dateFormat="rfc3339" position.from="6" position.to="7")
constant(value=".")
property(name="timereported" dateFormat="rfc3339" position.from="9" position.to="10")
}
# this is for formatting our syslog in JSON with @timestamp
template(name="plain-syslog"
type="list") {
constant(value="{")
constant(value="\"@timestamp\":\"") property(name="timereported" dateFormat="rfc3339")
constant(value="\",\"host\":\"") property(name="hostname")
constant(value="\",\"severity\":\"") property(name="syslogseverity-text")
constant(value="\",\"facility\":\"") property(name="syslogfacility-text")
constant(value="\",\"tag\":\"") property(name="syslogtag" format="json")
constant(value="\",\"message\":\"") property(name="msg" format="json")
constant(value="\"}")
}
# this is where we actually send the logs to Elasticsearch (localhost:9200 by default)
action(type="omelasticsearch"
template="plain-syslog"
searchIndex="logstash-index"
dynSearchIndex="on"
bulkmode="on" # use the bulk API
action.resumeretrycount="-1" # retry indefinitely if Logsene/Elasticsearch is unreachable
)
Вы можете видеть, что ElasticSearch index logstash-2017.10.10 был успешно создан и готов для использования и анализа с помощью Kibana:
# curl -XGET http://localhost:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open .kibana TYNVVyktQSuH-oiVO59WKA 1 1 4 0 15.8kb 15.8kb
yellow open xf JGCp9D_WSGeuOISV9EPy2g 5 1 6 0 21.8kb 21.8kb
yellow open logstash-2017.10.10 NKFmuog8Si6erk_vFmKNqQ 5 1 9 0 46kb 46kb
yellow open saved_queries GkykvFzxTiWvST53ZzunfA 5 1 16 0 43.7kb 43.7kb
В результате можно создать в Kibana Dashboard с необходимыми данными, из которых вы можете создать свои собственные визуализации. Например, что-то вроде такого Dashboard:
А в случае анализа nginx access.log можно сделать какой-нибудь такой Dashboard:
В итоге мы получаем современную платформу для работы с сообществом с дополнительной возможностью сбора всевозможных статистических данных и их анализа.
Конечно, статья носит общий, рекомендательный характер. В ней не упомянуты многие важные аспекты, например, вопросы безопасности, она лишь дает направления, описывает возможные сценарии и способы их реализации. Более тонкие детали настройки опытные администраторы могут выполнить самостоятельно. Elastic Stack похож на некий инструмент, конструктор, с помощью которого вы можете получить желаемый результат по вашему вкусу. Важно лишь скормить ему нужные и правильные данные, с которыми в дальнейшем вы хотите работать и которые вам нужно анализировать.
densol92
У вас на форуме геймификация прикручена уже около года. Оживило ли это форум? Мониторите ли такую активность в принципе?
Iron_Butterfly Автор
Да, геймификация прикручена уже более года, насколько я помню. И я регулярно делаю ежемесячную статистическую выборку прямо из базы. Активность форума зависит от множества разных причин, но после внедрения геймификации она стала одной из значимых причин, по которым активность растет. Рост заметен, да.