При диагностике работы web-сервера, обнаружил ошибки, которые сыпались в лог httpd-error.log:
[Sun Feb 02 10:13:51.778392 2014] [core:notice] [pid 73431] AH00052: child pid 82474 exit signal Illegal instruction (4) [Sun Feb 02 10:20:07.346392 2014] [core:notice] [pid 73431] AH00052: child pid 93379 exit signal Illegal instruction (4) [Sun Feb 02 10:30:58.217398 2014] [core:notice] [pid 73431] AH00052: child pid 93375 exit signal Illegal instruction (4) [Sun Feb 02 10:32:36.356384 2014] [core:notice] [pid 73431] AH00052: child pid 20375 exit signal Illegal instruction (4) |
Версии установленного ПО:
# uname -opr # php -v |
После длительного копания что и как, обнаружил, что ошибку вызывает библиотека pcre, которая вместо динамической памяти использовала стек, что при определенных условиях вызывало его переполнение, и, соответственно, родительский процесс "падал". Узнать, что pcre работает с использованием стека можно следующим образом:
# pcretest -C | grep 'Match recursion' Match recursion uses stack |
Решение - пересобрать pcre (/usr/ports/devel/pcre), и отключить опцию STACK_RECURSION.
После пересборки порта, проверяем, как работает pcre:
# pcretest -C | grep 'Match recursion' Match recursion uses heap |
Теперь можно смело увеличивать значение переменных php.ini, которые касаются pcre, не боясь преполнения стека. Для этого необходимо расскоментировать следующие опции в php.ini:
pcre.backtrack_limit = 100000 pcre.recursion_limit = 100000 |
Чтобы изменения вступили в силу, необходимо перезапустить веб-сервер:
# sh /usr/local/etc/rc.d/apache24 restart |
После этого Apache перестал "крашиться" и более проблем не замечалось.
Последние комментарии
21 неделя 6 дней назад
46 недель 16 часов назад
2 года 46 недель назад
3 года 16 недель назад
3 года 39 недель назад
4 года 2 недели назад
4 года 3 недели назад
4 года 6 недель назад
4 года 18 недель назад
4 года 22 недели назад