--- source: https://axenov.dev/как-исправить-ошибки-при-работе-с-sphinx-3-0-3-с/ --- ## Установка [Качаем бинарники](http://sphinxsearch.com/downloads/current/) под свою ОСь Распечатываем из архива содержимое папки `/bin/` в `/usr/bin/` (с повышенными правами) Готовим структуру файлов и папок для хранения твоих настроек, индексов и логов #sphinx: ``` /home/user/sphinxdata/ # или любая удобная директория |- binlogs/ |- indexes/ |- logs/  | |- searchd.log # пустой файл | |- query.log # пустой файл | |- log.log # пустой файл |- searchd.pid # пустой файл |- sphinx.conf ``` Оформляем конфиг `sphinx.conf`. Образец лежит в скачанном тобой архиве в директории `/etc/`. Запускаем индексацию ```shell indexer --all --rotate -c ~/sphinxdata/sphinx.conf ``` Вывод команды в этот раз будет выглядеть примерно так: ``` using config file '/home/user/sphinxdata/sphinx.conf'... indexing index 'index1'... collected 43010 docs, 3.5 MB sorted 0.3 Mhits, 100.0% done total 43010 docs, 3.521 Mb total 2.1 sec, 1.669 Mb/sec, 20383 docs/sec indexing index 'index2'... collected 91965 docs, 14.7 MB sorted 1.4 Mhits, 100.0% done total 91965 docs, 14.65 Mb total 7.4 sec, 1.990 Mb/sec, 12494 docs/sec WARNING: failed to open pid_file '/home/user/sphinxdata/searchd.pid'. WARNING: indices NOT rotated. ``` Индексация прошла почти успешно. Почти — потому что последние две строки означают, что ротация не удалась, т.к. не запущен демон searchd. Это норма. > В файл `searchd.pid` будет записан идентификатор процесса демона. После успешной индексации утилита `indexer` считывает PID процесса searchd из этого файла и отправляет процессу сигнал, чтобы тот подцепил индекс. > Поскольку мы ещё не запускали `searchd` и он сейчас не работает, то и PID-а там нет, и ротация логов не произошла, потому что слать сигнал нечему — о том и говорят последние две строки. > Пожалуй, при первой индексации параметр `--rotate` можно даже не добавлять. Вот теперь запускаем демона: ```shell searchd -c ~/sphinxdata/sphinx.conf ``` При успешном запуске будет примерно такой вывод: ``` using config file '/home/user/sphinxdata/sphinx.conf'... listening on all interfaces, port=9312 listening on all interfaces, port=9306 precaching index 'index1' rotating index 'index1': success precaching index 'index2' rotating index 'index2': success precached 2 indexes in 0.009 sec WARNING: No extra index definitions found in data folder ``` Демон на свободе и работает. Можно тестировать поиск. Как? Не знаю. У меня перед настройкой **sphinx**, как правило, уже развёрнут рабочий проект, поэтому я просто прямо на сайте вбиваю поисковый запрос. > [!attention] > Строки `rorating` будут видны только в том случае, если ты запускал индексацию при выключенном демоне. Когда он запустится индексы будут ротированы. > Если ты просто запускаешь демона со старыми индексами, то будут строчки в духе `precaching <...>: success`. Если нет даже `precaching`, то читай дальше. ## Траблшутинг Тут описаны самые часто встречаемые ошибки и проблемы, которые могут возникнуть при работе со сфинксом. **ПРОБЛЕМА:** вывод команды `indexer` выглядит так: ``` using config file '/home/user/sphinxdata/sphinx.conf'... indexing index 'index1'... ERROR: index 'index1': sql_connect: Access denied for user 'mysqluser'@'localhost' (using password: YES) (DSN=mysql://mysqluser:***@localhost:3306/database). total 0 docs, 0.0 Kb total 0.0 sec, 0.0 Kb/sec, 0 docs/sec ``` **ПРИЧИНА:** указана не та БД, либо не те логин/пароль, либо пользователь не имеет прав на чтение таблиц БД. Короче, не удалось подключиться к БД. **РЕШЕНИЕ:** верно указать все данные для подключения, проверить БД и права пользователя на чтение таблиц БД. --- **ПРОБЛЕМА:** вывод команды `indexer` выглядит так: ``` using config file '/home/user/sphinxdata/sphinx.conf'... indexing index 'index1'... ERROR: index 'index1': sql_connect: failed to load libmysqlclient (or libmariadb) (DSN=mysql://mysqluser:***@localhost:3306/database). total 0 docs, 0.0 Kb total 0.0 sec, 0.0 Kb/sec, 0 docs/sec ``` **ПРИЧИНА:** не установлена (не найдена) библиотека [libmysqlclient.so](http://libmysqlclient.so/) либо [libmariadb.so](http://libmariadb.so/) **РЕШЕНИЯ:** [https://toster.ru/answer?answer_id=1238929#answers_list_answer](https://toster.ru/answer?answer_id=1238929#answers_list_answer) [https://blog.csdn.net/wuzuyu365/article/details/80151083](https://blog.csdn.net/wuzuyu365/article/details/80151083) Установить `libmysqlclient-dev` от имени рута: ```shell apt-get install libmysqlclient-dev \#debian yum install libmysqlclient-dev \#centos ``` --- **ПРОБЛЕМА:** при запуске `searchd` возникает ошибка: ``` FATAL: failed to parse config file '/home/user/sphinxdata/sphinx.conf' ``` **ПРИЧИНА:** некорректный путь или имя файла конфига, который ты ему дал (параметр `-c`), либо ошибка в конфиге (в этом случае будет указано место ошибки в файле) **РЕШЕНИЕ:** исправить путь к конфигу и ошибки в нём --- **ПРОБЛЕМА:** вывод команды `searchd` выглядит так (нет ни строчек `rotating`, ни `precaching`): ``` WARNING: both 'sphinxdata' and config file '/home/user/sphinxdata/sphinx.conf' exist; using 'sphinxdata' folder no config file, using 'sphinxdata' folder... listening on all interfaces, port=9312 listening on all interfaces, port=9306 WARNING: No extra index definitions found in data folder ``` **ПРИЧИНА:** демон запущен, но конфиг не прочтён и индексы не подцепились. Почему тут оно так происходит мне в деталях неизвестно. **РЕШЕНИЕ:** выполнить команды по порядку: ```shell searchd --stop # завершаем демона цивилизованно, результат не важен killall searchd # убиваем всё цивилизованно не завершённое, результат не важен rm -f ~/sphinxdata/sphinx.state* # мешают файлы sphinx.state и sphinx.state.new searchd -c ~/sphinxdata/sphinx.conf # запускаем заново и всё будет заебись ``` **ПРИМЕЧАНИЕ:** Вообще, директория `sphinxdata` всегда создаётся в текущей рабочей директории при запуске демона `searchd` (там, где вы находитесь в момент запуска). Говорят, что нужно просто удалять папку `sphinxdata` перед каждым запуском если она создаётся, либо после запуска, если создалась. Якобы, тогда всё заработает. Этот совет может сработать (а может и не сработать) для тех, кто уже ставил сфинкса, имеет свои старые конфиги, обновил сфинкса до версии 3.* и пытается ему эти конфиги скормить. Но в любом случае, имейте в виду такое поведение сфинкса. В рассматриваемом нами случае, мы пошли другим путём и наоборот стали использовать именно эту папку для наших конфигов и дел. Удалять нам её незачем в контексте данной статьи. Мы запускаем `searchd` где попало (грешновато), но всегда явно суём ему конкретный конфиг (параметр `-c`). --- **ПРОБЛЕМА:** поиск всё ещё не работает **ПРИЧИНА:** ты **РЕШЕНИЕ:** проверить конфиг(и), запустить индексацию, перезапустить демона, следить за каждым WARNINGом, логами, ошибками, гуглить и искать решение, которое тут не описано.