Get Social

Ошибка mod_fcgid: HTTP request length 137536 (so far) exceeds MaxRequestLen (131072)

mod_fcgid: HTTP request length 137536 (so far) exceeds MaxRequestLen (131072)

После установки панели ISPmanager Lite 5.126.2 с пробной лицензией на 2 недели (это удобно, так как за это время можно спокойно купить и активировать лицензию) я столкнулся с этой ошибкой. В этом случае php настроен в режиме FastCGI.

При попытке запустить веб-приложение, получаем (в логах или в debug):

mod_fcgid: HTTP request length 132992 (so far) exceeds MaxRequestLen (131072), referer: http...

В браузере вы можете получить малоинформативное сообщение:

Error 500, Internal server error

Вернёмся к логам:

1-я цифра – всегда разная и зависит от запроса от вашего приложения

2-я цифра – 131072 – это значение MaxRequestLen по-умолчанию.

Ошибка HTTP request length 132992 (so far) exceeds MaxRequestLen (131072) говорит о том, что ваш запрос превысил значение по умолчанию

Значит решением будет – увеличить этот параметр.

Конечно, можно его вставить практически где угодно в конфиге apache. Можно в настройках вашего хоста.

Но лучше всего править конфиг самого модуля FastCGI:

/etc/apache2/mods-available/fcgid.conf (если у вас Debian, Ubuntu и другие их производные)
/etc/httpd/conf.d/fcgid.conf (если у вас CentOS, Fedora и подобные им)

Чтобы выбрать подходящее значение параметра MaxRequestLen, посмотрите свой php.ini

upload_max_filesize = 2M

Для этого значения подойдёт: 2M = 2097152 байт. Добавьте в ваш файл fcgid.conf

FcgidMaxRequestLen 2097152

Остаётся перезапустить apache:

apachectl restart

 

Установка и настройка Sphinx 2.2.11 (Yii и дельта-индексы) на Ubuntu / Debian и RHEL / CentOS 7

После перехода с версии 1 на 2 в sphinx много изменений. Больше не работают запросы в командной строке через searh, удалены многие директивы из конфигурационного файла и другое. Будем разбираться.

Установка Sphinx 2.2.11 на Ubuntu / Debian и RHEL / CentOS 7

Для начала нужно поставить пакет:

Ubuntu/Debian:
aptitude install sphinxsearch

RHEL/CentOS:
yum install -y postgresql-libs unixODBC
wget http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm
yum install sphinx-2.2.11-1.rhel7.x86_64.rpm

Настройка Sphinx 2.2.11 на Ubuntu / Debian и RHEL / CentOS 7

Ubuntu/Debian:
nano /etc/sphinxsearch/sphinx.conf

RHEL/CentOS:
vi /etc/sphinx/sphinx.conf

Сам конфигурационный файл Sphinx состоит из блоков для source, indexer и searchd.
Вот пример конфигурации Sphinx + дельта-индексы:

# for db connect to include in other sources
source dbconnect
{
	type			= mysql
	sql_host		= localhost
	sql_user		= your_db_user
	sql_pass		= your_db_pass
	sql_db			= your_db_name
	sql_port		= 3306
}

# --------- products --------- #
# sources products
source sphinx_source_products : dbconnect
{
        sql_query_pre		= SET NAMES utf8mb4
	sql_query_pre = \
	        update sphinx_delta_counter \
	        set last_post_id = (select max(id) from tb_products) \
	        where index_name = 'sphinx_index_products';
	sql_query = \
		SELECT id, title, descr \
		FROM tb_products \
		WHERE status = 1 # or any your condition
#	sql_attr_uint = id
	sql_field_string = title
	sql_field_string = descr
}
source sphinx_source_products_delta : dbconnect
{
        sql_query_pre		= SET NAMES utf8mb4
        sql_query = \
		SELECT id, title, descr \
		FROM tb_products \
		WHERE status = 1 AND id > (select last_post_id from sphinx_delta_counter where index_name = 'sphinx_index_products');
#	sql_attr_uint = id
	sql_field_string = title
	sql_field_string = descr
}
# indexes products
index sphinx_index_products
{
	source			= sphinx_source_products
	path			= /home-path-to-web-dir/example.com/sphinx_data/sphinx_products
	dict			= keywords
	morphology		= stem_ru, stem_en
	min_word_len		= 2
	docinfo			= extern
}
index sphinx_index_products_delta
{
        source                  = sphinx_source_products_delta
        path                    = /home-path-to-web-dir/example.com/sphinx_data/sphinx_products_delta
        dict                    = keywords
        morphology              = stem_ru, stem_en
        min_word_len            = 2
        docinfo                 = extern
}
# --------- / products --------- #

# some tables
# what you need
# just as it is done section above

indexer
{
	mem_limit		= 32M
}

searchd
{
	listen			= 9312
	listen			= 9306:mysql41
	log			= /var/log/sphinx/searchd.log
	query_log		= /var/log/sphinx/query.log
	read_timeout		= 5
	max_children		= 30
	pid_file		= /var/run/sphinx/searchd.pid
#	max_matches		= 1000
	seamless_rotate		= 1
	preopen_indexes		= 1
	unlink_old		= 1
	workers			= threads # for RT to work
	binlog_path		= 
#	binlog_path		= /var/log/sphinx
 # use /var/log/sphinxsearch/ and  /var/run/sphinxsearch/ paths for ubuntu
}

Замените тут “your_db_user”, “your_db_pass”, “your_db_name”, “/home-path-to-web-dir/example.com/” на свои значения. Создайте папку для хранения индексов, например “sphinx_data”. Отредактируйте sql_query и sql_query_pre под свою базу. Для этого необходимо продумать запрос для поиска, а также выбрать колонку поиска и прописать её в sql_field_string (если несколько – значит несколько строк прописать соотвественно).

Sphinx delta index. Индексирование больших объёмов данных.

Для того, чтобы не переиндексировать в течение дня (если у вас большая база данных mysql) всю базу, используются дельта-индексы. Просто создаём в базе mysql таблицу “sphinx_delta_counter” с колонкой “last_post_id”. Из запроса в конфиге, думаю, понятно, что сюда записывается последний проиндексированный id. В поиск потом нужно будет включить оба индекса.

Для работы с русским языком нужно установить кодировку базы: SET NAMES utf8 (или SET NAMES utf8mb4), а также морфологию: параметр stem_ru . Строку “sql_query_pre = SET NAMES utf8mb4” обязательно нужно прописывать в каждый source отдельно, если в общий connect -> это не работает. Долго пришлось мучаться с ошибкой из-за того, что sphinx не индексировал русские слова.

Настройка Sphinx для Yii2

  1. Поставить расширение yii2-sphinx для Yii.
  2. Отредактировать config/main.php (секция components):
    'sphinx' => [
    'class' => 'yii\sphinx\Connection',
    'dsn' => 'mysql:host=127.0.0.1;port=9312;',
    'username' => '', # тут обычно не надо ничего указывать
    'password' => '', # тут обычно не надо ничего указывать
    ],
  3. Полнотекстовый поиск с морфологией и прочими плюшками:
    use yii\sphinx\Query;
    $query_search = new Query();
    $search_result = $query_search->from('siteSearch')->match($q)-all();

Индексация, запуск и проверка Sphinx

После настройки конфигурационного файла sphinx нужно проиндексировать все source, которые мы создали:
indexer --all

Потом прописать в крон (как тут видно – раз в сутки пересоздаётся полный индекс, а каждые 5 минут – дельта):
crontab -e
0 1 * * * /usr/bin/indexer --config /etc/sphinx/sphinx.conf sphinx_index_course --rotate > /dev/null
*/5 * * * * /usr/bin/indexer --config /etc/sphinx/sphinx.conf sphinx_index_course_delta --rotate > /dev/null

Перед запуском службы полезно будет сделать владельцем папки с индексами sphinxsearch (или sphinx):
chown sphinxsearch: /home-path-to-web-dir/example.com/sphinx_data

Запускаем Sphinx командой:
systemctl start searchd

В Ubuntu (или Debian), возможно получите сообщение:
Failed to start searchd.service: Unit searchd.service not found.
В этом случае – попробуйте такой вариант:
systemctl start sphinxsearch
Можно также включать sphinx альтернативной командой:
/etc/init.d/sphinxsearch start
Также, возможно, необходимо в файле /etc/default/sphinxsearch будет прописать START=yes (вместо START=no).

Чтобы проверить, можно воспользоваться такой командой:
systemctl status searchd
или
systemctl status sphinxsearch

Также, чтобы убедиться, что служба работает и слушает заданные порты:
ps aux | grep search
lsof -i tcp:9306
lsof -i tcp:9312

Раньше (в sphinx 1.x) можно было проверить поиск в консоли:
search -i название_индекса "слова поиска"

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

Вместо поиска в консоли sphinx можно использовать следующую команду:
indextool --dumphitlist sphinx_index_course "какое-нибудь слово" | more

Кроме того, можно проверить поиск с помощью MySQL-клиента, как предлагает разработчик Sphinx:

# To query search daemon using MySQL client:
mysql -h 0 -P 9306
mysql> SELECT * FROM test1 WHERE MATCH(‘test’);

Ошибки при запуске Sphinx

любые deprecated – это наследие от предыдущих версий – закомментируйте или удалите эти параметры

Установка и настройка sphinx на centos 5

Эта информация подойдёт для sphinx версий 2.0.9 и ниже (также sphinx 1.x).
Если вам нужно установить и настроить версию 2.2.x (2.2.11, например), тогда смотрите здесь >>

[1] Инсталляция sphinx на centos 5

Где искать информацию?

Как всегда – сначала смотрим, что есть в поиске по запросу “установка sphinx на centos”.
Открываем несколько вкладок и работаем. Ну и конечно же, смотрим официальную документацию (http://sphinxsearch.com/docs)
yum search sphinx
yum install sphinx
cat /etc/redhat-release
CentOS release 5.9 (Final)

wget http://sphinxsearch.com/files/sphinx-2.0.9-1.rhel5.i386.rpm
yum --nogpgcheck localinstall sphinx-2.0.9-1.rhel5.i386.rpm

rpm -Uvh sphinx-2.0.9-1.rhel5.i386.rpm
ошибка: Неудовлетворенные зависимости:
libmysqlclient.so.15 нужен для sphinx-2.0.9-1.rhel5.i386
libmysqlclient.so.15(libmysqlclient_15) нужен для sphinx-2.0.9-1.rhel5.i386

иду на http://sphinxsearch.com/docs/current.html#installing
wget http://sphinxsearch.com/files/sphinx-2.0.9-release.tar.gz

cd sphinx-2.0.9-release
./configure
make

libsphinx.a(sphinx.o): In function `xmlUnknownEncoding':
/root/install/sphinx-2.0.9-release/src/sphinx.cpp:22846: undefined reference to `libiconv_open'
/root/install/sphinx-2.0.9-release/src/sphinx.cpp:22864: undefined reference to `libiconv'
/root/install/sphinx-2.0.9-release/src/sphinx.cpp:22870: undefined reference to `libiconv_close'
collect2: выполнение ld завершилось с кодом возврата 1

Как побороть ошибку “collect2: ld completed with a return code 1” ?

замена:
LIBS = -lexpat -ldl -lm -lz -L/usr/local/lib -lrt -lpthread
на
LIBS = -lexpat -liconv -ldl -lm -lz -L/usr/local/lib -lrt -lpthread
помогла!

make
make install

[2] Настройка sphinx на centos 5

на всякий случай скопируем оригинальные конфиги:
cd /usr/local/etc
cp -i sphinx-min.conf.dist sphinx-min.conf.dist.copy
cp -i sphinx.conf sphinx.conf.copy

настроим конфигурацию под свою базу данных
nano /usr/local/etc/sphinx.conf

создадим папки, перечисленные в конфиге (иначе получим ошибки… 🙂 )
mkdir /home/user/sphinx_data/
mkdir /var/log/sphinx/

запускаем процесс
searchd --config /usr/local/etc/sphinx.conf

проверим, что служба на нужных портах работает
lsof -i tcp:9312
lsof -i tcp:9306

проверим, что создались лог-файлы:
ls -lh /var/log/sphinx/

Полезные команды для службы поиска sphinx

создать индекс:
indexer --config /usr/local/etc/sphinx.conf --all

обновить индекс:
indexer --config /usr/local/etc/sphinx.conf --rotate

тест поиска в консоли:
search -q --config /usr/local/etc/sphinx.conf -a 123
или проще:
search -q 123
Для того, чтобы использовать поиск на сайте, нужно использовать Sphinx API для PHP.
Это библиотека, поставляемая вместе с дистрибутивом. Находим, где он лежит:
locate sphinxapi.php
<?php
.....
// Подключаем sphinx-api
require_once ("sphinxapi.php");
.....
?>

Добавим в крон ротацию каждые 15 минут (путь indexer указываем полный, так как крон обычно не в курсе, где искать исполняемые файлы):
*/15 * * * * /usr/local/bin/indexer --config /usr/local/etc/sphinx.conf --rotate > /dev/null 2>&1

[3] Как сделать, чтобы при перезагрузке стартовал searchd (sphinx)?

1) Красивый метод – как описано в статье.

2) Простой метод – в кроне каждую минуту проверять, запущен ли searchd и запускать, в случае необходимости. Критерий – проверка существование pid-файла:
* * * * * if [ ! -f /var/log/sphinx/searchd.pid ]; then /usr/local/bin/searchd --config /usr/local/etc/sphinx.conf; fi > /dev/null 2>&1

 

Update, 21.12.2016: Эти настройки Sphinx подходят для версий 1.x, чтобы узнать, как поставить и настроить версии Sphinx 2.x читайте: Установка Sphinx 2.2.11 на Debian и CentOS, а также настройка в Yii