Ошибка в работе apache20
На моем сервере под управлением FreeBSD 8.0-RELEASE работает web-сервер apache-2.0.63 с прикрученным к нему языком php5-5.3.2, который в свою очередь использует библиотеку, реализующую работу регулярных выражений в стиле Perl – pcre-8.02 (Perl Compatible Regular Expressions library). Совсем недавно в логи системы стали сыпаться ошибки следующего вида: |
В системном логе:
# less /var/log/messages ... Jul 8 14:14:19 mail kernel: pid 26933 (httpd), uid 80: exited on signal 4 ...
В логе самого апача:
# less /var/log/apache2/httpd-error.log ... [Thu Jul 08 14:14:07 2010] [notice] child pid 26927 exit signal Illegal instruction (4) ...
Причем видимого деструктивного воздействия на мой сайт не происходило. В интернете решения не нашел. Пришлось копать самому.
Все дело оказалось в библиотеке pcre. Это из-за того, что она вместо динамической памяти использовала стек, происходило переполнение стека и процесс, его вызвавший, «падал». В данном случае это был httpd.
Для того, чтобы этого не происходило необходимо пересобрать порт pcre с опцией —disable-stack-for-recursion (отключить стек для рекурсии):
# whereis pcre pcre: /usr/ports/devel/pcre # cd /usr/ports/devel/pcre # make "CONFIGURE_ARGS= --disable-stack-for-recursion --enable-utf8 --enable-unicode-properties" # make install clean
Теперь нам надо внести кое-какие изменения в конфигурационный файл php.ini для лучшей работы языка php с pcre. Раскомментируйте строки pcre.backtrack_limit=100000 и pcre.recursion_limit=100000:
# nano -w /usr/local/etc/php.ini ... [Pcre] ;PCRE library backtracking limit. pcre.backtrack_limit=100000 ... ;PCRE library recursion limit. ;Please note that if you set this value to a high number you may consume all ;the available process stack and eventually crash PHP (due to reaching the ;stack size limit imposed by the Operating System). pcre.recursion_limit=100000 ...
Теперь нам осталось только перезапустить наш web-сервер и проверить его работу:
# /usr/local/etc/rc.d/apache2 restart Performing sanity check on apache2 configuration: Syntax OK Stopping apache2. Waiting for PIDS: 37617. Performing sanity check on apache2 configuration: Syntax OK Starting apache2.
Дадим команду pcretest для проверки работы pcre:
# pcretest -C | grep 'Match recursion' Match recursion uses heap
Выводом работы это команды должно стать сообщение, что «Рекурсия соответствия использует динамическую память (Match recursion uses heap)». Смотрим логи работы web-сервера:
# less /var/log/apache2/httpd-error.log ... [Thu Jul 08 14:20:27 2010] [notice] child pid 26971 exit signal Illegal instruction (4) [Thu Jul 08 15:16:26 2010] [notice] caught SIGTERM, shutting down [Thu Jul 08 15:16:30 2010] [notice] Apache/2.0.63 (FreeBSD) PHP/5.3.2 with Suhosin-Patch configured -- resuming normal operations ...
Больше подобных ошибок не возникало.
У меня возникла схожая проблема. Сделал как Вы описали тут. Сейчас наблюдаю. Спасибо.