У вас же тоже так было. Делаешь сайт, он растет, 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
Добавить комментарий