ITСooky

IT-рецепты съедобные и не очень!

Ставим на форум phpBB3 супер быстрый поиск Sphinx!

дата 21.09.2019

У вас же тоже так было. Делаешь сайт, он растет, Apache уже не справляется, ставишь Nginx он пару лет тянет, потом начинает тормозить MySQL, покупаешь хостинг по мощнее, он тоже пару лет тянет, потом опять начинает все тормозить и вот через 15 лет узнаешь что надо было всего лишь включить один модуль в PHP и все бы летало и так, даже без Sphinx!!! Нет?

Как понять что, на форуме на phpBB, тормозит?
Хорошо если у вас форум с парой миллионов постов, тогда понятно что нормально он работать не будет без оптимизации, тогда даже разработчики phpBB скажут что форум слишком большой чтобы поиск вообще работал на встроенных движках (это кстати они советуют ставить Sphinx в таких случаях).

Запускаем в консоле сервера
top

И смотрим load average он показывает попугаев за 1, 5 и 15 минут. Принято считать что нагрузка нормальная если меньше количества ядер. 0.5 для одного ядра, 1.5 для двух! Но тут все относительно, у меня по ощущениям на два ядра сервер начинает тормозить при 5-7(генерация страниц от 4 секунд), а постоянно работает на 3-5(генерация страниц 0,4-1,5 секунд)! Эта общая нагрузка на сервер и не всегда понятно что надо оптимизировать.

Однако в phpBB есть инструмент диагностики то есть дебагинга
в настройка форума, в файле config.php расскоментим или напишем

@define('PHPBB_DISPLAY_LOAD_TIME', true);
@define('DEBUG', true);
@define('DEBUG_EXTRA', true);

Теперь все будут видеть внизу форума строку с информацией за сколько времени сгенерировалась страница, именно сгенерировалась, а не сколько по вашим ощущениям прошло времени с момента нажатия на ссылку и появления страницы, это уже от скорости соединения зависит.

А если зайти на форум под админом до там же будет еще и ссылка SQL Explain на страницу где статистика замера времени исполнения MySQL запросов и просто время работы PHP

SQL Report

Page generated in 1.0217 seconds with 13 queries + 3 queries returning data from cache

Time spent on mysqli queries: 0.02616s | Time spent on PHP: 0.9955s

Оказывается больше времени съедает PHP, а не MySQL как мне всегда казалось!

Тут начинается мистика. Парочка админов больших форумов заметила и указала phpBB разработчикам, что для нормальной работы в PHP должен быть включен модуль mbstring, и вообще об этом надо писать в инструкции и в требованиях к форуму, но… разработчики молчат и ничего не делают! Это странно!

У меня форум перестал тормозить когда нагрузка по поиску легла на Sphinx. Но тормозила выдача результатов поиска — пока не включил mbstring

Включим модуль PHP mbstring
У меня CentOS 6.10 и php 7.2 обновился с CentOS 6.7 и php 5.6 пока искал почему Sphinx тормозит(но это не он тромозил, а PHP)

Команда посмотреть версию php
php -v
посмотреть модули
php -m
или так сразу покажи mbstring если он есть
php -m | grep mbstring

Ставим модуль
yum install php-mbstring
И рестартим php-fpm (или то что у вас крутит PHP, apache может быть)
/sbin/service php-fpm restart

И все полетело, небо и земля, до и после…если у вас после этого все еще тормозит поиск, то вам в сфинкс однозначно!

Ставим Sphinx
Можно скачать 3-ю версию с сайта разработчиков www.sphinxsearch.com но я не понял в каком она виде и как ставить то!

Буду ставить версию 2, она уже в архиве на сайте.

Качаю
wget https://sphinxsearch.com/files/sphinx-2.2.11-2.rhel6.i386.rpm
устанавливаю то что надо установить для сфинкса
yum install postgresql-libs unixODBC
yum install rpm

и сама установка
rpm -Uhv sphinx-2.2.11-2.rhel6.i386.rpm
делаем нужные папки
mkdir {/usr/www/sphinx/,/usr/www/sphinx/log}
chown -R sphinx:sphinx /usr/www/sphinx

По настройке phpBB почти все что нужно описано тут
wiki.phpbb.com/Sphinx_Fulltext_Search

Идем в ACP своего форум phpBB3 в GENERAL > Search settings и выбираем Sphinx Fulltext в Serach Backend и прописать в настройках путь где лежит сфинкс /usr/www/sphinx/

После нажатия Submit сгенерируется файл настроек сфинкса.

ОСТОРОЖНО: Тут надо проследтиь за параметром
mem_limit = 32M
если слишком большой может вызывать разрыв соединения с MySQL

Далеe надо сходить в MANTAINANCE > Search index и нажать в Sphinx Fulltext (active) кнопку Create index.

Это просто создаст что-то, это еще не индексирование. Другие индексы можно удалить — только место занимают

Сгенерированные форумом настройки вставляем сюда
vi /etc/sphinx/sphinx.conf

Меняем

	sql_user = dbuser 
	sql_pass = dbpassword

Здесь надо написать пароль от своей базы и пользователя, его можно подсмотреть в папке форума в файле config.php

ОСТОРОЖНО: Если в пароле есть # то сфинкc решить что дальше не часть пароля, а комментарий!!! Если есть # то его надо записывать так
\#

Параметр morphology доводим до вида

morphology = stem_ru

это дает объединение слов с разными окончаниями в результатах поиска. Я его включил, но иногда он выдает странные результаты — если слово разрублено пробелом он его тоже считает

И самый больше место привожу к виду

charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, U+0430..U+044F, U+4E00..U+9FFF, U+0400->U+0435, U+0401->U+0435, U+0402->U+0452, U+0452, U+0403->U+0433, U+0404->U+0454, U+0454, U+0405->U+0455, U+0455, U+0406->U+0456, U+0407->U+0456, U+0457->U+0456, U+0456, U+0408..U+040B->U+0458..U+045B, U+0458..U+045B, U+040C->U+043A, U+040D->U+0438, U+040E->U+0443, U+040F->U+045F, U+045F, U+0450->U+0435, U+0451->U+0435, U+0453->U+0433, U+045C->U+043A, U+045D->U+0438, U+045E->U+0443, U+0460->U+0461, U+0461, U+0462->U+0463, U+0463, U+0464->U+0465, U+0465, U+0466->U+0467, U+0467, U+0468->U+0469, U+0469, U+046A->U+046B, U+046B, U+046C->U+046D, U+046D, U+046E->U+046F, U+046F, U+0470->U+0471, U+0471, U+0472->U+0473, U+0473, U+0474->U+0475, U+0476->U+0475, U+0477->U+0475, U+0475, U+0478->U+0479, U+0479, U+047A->U+047B, U+047B, U+047C->U+047D, U+047D, U+047E->U+047F, U+047F, U+0480->U+0481, U+0481, U+048A->U+0438, U+048B->U+0438, U+048C->U+044C, U+048D->U+044C, U+048E->U+0440, U+048F->U+0440, U+0490->U+0433, U+0491->U+0433, U+0490->U+0433, U+0491->U+0433, U+0492->U+0433, U+0493->U+0433, U+0494->U+0433, U+0495->U+0433, U+0496->U+0436, U+0497->U+0436, U+0498->U+0437, U+0499->U+0437, U+049A->U+043A, U+049B->U+043A, U+049C->U+043A, U+049D->U+043A, U+049E->U+043A, U+049F->U+043A, U+04A0->U+043A, U+04A1->U+043A, U+04A2->U+043D, U+04A3->U+043D, U+04A4->U+043D, U+04A5->U+043D, U+04A6->U+043F, U+04A7->U+043F, U+04A8->U+04A9, U+04A9, U+04AA->U+0441, U+04AB->U+0441, U+04AC->U+0442, U+04AD->U+0442, U+04AE->U+0443, U+04AF->U+0443, U+04B0->U+0443, U+04B1->U+0443, U+04B2->U+0445, U+04B3->U+0445, U+04B4->U+04B5, U+04B5, U+04B6->U+0447, U+04B7->U+0447, U+04B8->U+0447, U+04B9->U+0447, U+04BA->U+04BB, U+04BB, U+04BC->U+04BD, U+04BE->U+04BD, U+04BF->U+04BD, U+04BD, U+04C0->U+04CF, U+04CF, U+04C1->U+0436, U+04C2->U+0436, U+04C3->U+043A, U+04C4->U+043A, U+04C5->U+043B, U+04C6->U+043B, U+04C7->U+043D, U+04C8->U+043D, U+04C9->U+043D, U+04CA->U+043D, U+04CB->U+0447, U+04CC->U+0447, U+04CD->U+043C, U+04CE->U+043C, U+04D0->U+0430, U+04D1->U+0430, U+04D2->U+0430, U+04D3->U+0430, U+04D4->U+00E6, U+04D5->U+00E6, U+04D6->U+0435, U+04D7->U+0435, U+04D8->U+04D9, U+04DA->U+04D9, U+04DB->U+04D9, U+04D9, U+04DC->U+0436, U+04DD->U+0436, U+04DE->U+0437, U+04DF->U+0437, U+04E0->U+04E1, U+04E1, U+04E2->U+0438, U+04E3->U+0438, U+04E4->U+0438, U+04E5->U+0438, U+04E6->U+043E, U+04E7->U+043E, U+04E8->U+043E, U+04E9->U+043E, U+04EA->U+043E, U+04EB->U+043E, U+04EC->U+044D, U+04ED->U+044D, U+04EE->U+0443, U+04EF->U+0443, U+04F0->U+0443, U+04F1->U+0443, U+04F2->U+0443, U+04F3->U+0443, U+04F4->U+0447, U+04F5->U+0447, U+04F6->U+0433, U+04F7->U+0433, U+04F8->U+044B, U+04F9->U+044B, U+04FA->U+0433, U+04FB->U+0433, U+04FC->U+0445, U+04FD->U+0445, U+04FE->U+0445, U+04FF->U+0445, U+0410..U+0418->U+0430..U+0438, U+0419->U+0438, U+0430..U+0438, U+041A..U+042F->U+043A..U+044F, U+043A..U+044F 

Форум генерирует файл где описаны только буквы латинца добавляю кирилицу беру от сюда www.sphinxsearch.com/wiki/doku.php?id=charset_tables#cyrillic

Запускаем индексацию, она поразительно быстро происходит. У меня за 10-15 минут, если делать поиск через MySQL Fulltext то это занимает часы!

во всех коммандах 819ad66b94720731 меняете на свой

indexer --config /etc/sphinx/sphinx.conf index_phpbb_819ad66b94720731_main
indexer --config /etc/sphinx/sphinx.conf index_phpbb_819ad66b94720731_delta
indexer --rotate --config /etc/sphinx/sphinx.conf index_phpbb_819ad66b94720731_delta

Теперь надо стартануть сервис
searchd --config /etc/sphinx/sphinx.conf

Смотрим слушает ли он где надо
netstat -tulpn | grep LISTEN

Чтобы он стартовал на загрузке, говорят надо сделать так в CentOS
/sbin/chkconfig searchd on
У меня не сработало
Добавляю в крон
cron -e
строку

@reboot searchd --config /etc/sphinx/sphinx.conf

И еще надо добавить в крон строки которые будут индексировать базу поиска sphinx. Легкая индексация только новых сообщений каждые 5 минут. И жесткая полная раз в день, когда все спят

во всех коммандах 819ad66b94720731 меняете на свой

*/5 * * * * indexer --rotate --config /etc/sphinx/sphinx.conf index_phpbb_819ad66b94720731_delta >> /usr/www/sphinx/log/indexer.log 2>&1 &
0 14 * * * indexer --rotate --config /etc/sphinx/sphinx.conf index_phpbb_819ad66b94720731_main >> /usr/www/sphinx/log/indexer.log 2>&1 &

И всё поиск настроен и работает!

КСТАТИ: Можно запустить два и более sphinx, надо только повторить все шаги опианые тут, создание conf и прочее, но изменить порт на другой!

Как быстро работает сам Sphinx можно посмотреть тут, сделать запрос и посмотреть
tail -5 /usr/www/sphinx/log/sphinx-query.log
И иногда тут появляются пустые запросы, но это не пустые запросы, глюк какойто

ВАЖНО: Если у вас голый CentOS то там конечно включена жуткая безопасность SELinux, sphinx не будет работать, форум при поиске будет выдавая ошибку:

Search failed: connection to localhost:9312 failed (errno=13, msg=Permission denied)

Можно временно отключить эту безопасность
setenforce 0
И поиск сразу заработает, но хотелось бы докапаться все таки что где оно зарубает…нашел, спасибо Гугл и стописят несчастных сталкнувшихся с этим до меня.
Надо
setsebool -P httpd_can_network_connect 1
это на постаянке в SELinux отключает обозначенный параметр

А Хостеры в VPS планах на CentOS вообще просто отключают SELinux, на фиг какая-то еще безопасность на сервере нужна :)!

UPD: Замечаю иногда падает
Делаю скрипт в папке /usr/local/src/
и добавляю текст
vi /usr/local/src/restart_search.sh
вот этот

!#/usr/bin/bash

if netstat -tulpn | grep 9312
then
echo "busy"
else
searchd --config /etc/sphinx/sphinx.conf
fi

Если на порту 9312 никто не слушает, перезапускаем searchd
И добабавляем в крон
crontab -e
вот это

*/10 * * * * /usr/bin/bash /usr/local/src/restart_search.sh/search_re.sh

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *