Назад | Перейти на главную страницу

Непрерывные ошибки сегментации (код 11) с nginx и php-fpm

Я использую 64-битный сервер CentOS 6 с процессором 1,2 ГГц и 2,4 ГБ ОЗУ. На сервере работают nginx и php-fpm с расширением APC, а также mysql.

Пару недель назад сервер начал непрерывно выдавать 500 ошибок на HTTP-запросы; Google WMT ежедневно сообщал около 450 ошибок сервера в Ошибках сканирования. Если вы просматривали веб-сайт, ошибка выдавалась каждые 3-4 страницы или около того.

Вот как был настроен php-fpm:

pm = dynamic
pm.max_children = 45
pm.start_servers = 15
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 1000

После проверки журналов я обнаружил в журнале ошибок php-fpm, что это 2 наиболее частые ошибки:

ERROR: fork() failed: Cannot allocate memory (12)
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 30 total children

WARNING: [pool www] child 27455 exited on signal 11 (SIGSEGV) after 8393.397161 seconds from start

Я последовал рекомендациям журнала и увеличил значения выше до следующего:

pm = dynamic
pm.max_children = 70
pm.start_servers = 25
pm.min_spare_servers = 15
pm.max_spare_servers = 25
pm.max_requests = 1000

Это уменьшило частоту ошибок, но незначительно.

После дополнительных исследований я обнаружил, что одной из причин ошибки «Невозможно выделить память» может быть несовместимость между установленными PHP 5.4 и APC 3.1.9, поэтому я пошел дальше и обновил APC до версии 3.1.13, в которой сообщается о совместимости с PHP. 5.4. Это привело к тому, что ошибка «Невозможно выделить память» полностью исчезла, но по-прежнему вызывала ошибки сегментации кода 11.

Я обнаружил, что значение pm.max_requests может быть слишком большим, поэтому я уменьшил его до следующего:

pm.max_requests = 600

Это снова снизило частоту выдаваемых ошибок, но не значительно.

Прочитав еще немного рекомендаций, я установил Varnish в качестве внешнего интерфейса для веб-сервера. Это привело к значительному снижению количества ошибок, но журналы показывают, что ошибка segfault с кодом 11 все еще выдается каждые 2-3 часа или около того. Это означает, что все еще есть пользователи, у которых возникают ошибки сервера, когда они пытаются просмотреть мой сайт. Я хотел бы знать, есть ли какие-либо другие оптимизации, которые я могу сделать для своего веб-сервера.

Другая информация, которая может быть полезна: я получаю около 2000 уникальных посетителей в день, но я также получаю высокий уровень спам-атак на мой веб-сайт. Я установил Cloudflare в качестве прокси перед своим сервером, и с тех пор уровень спама значительно снизился. Я также использую MaxCDN для статических файлов, таких как сценарии или изображения, поэтому они обычно не запрашиваются с веб-сервера.

Скорее всего, какой-то модуль, который включает php, вызывает ваши ошибки. Вам нужно будет выполнить некоторую отладку, чтобы выяснить, что может быть причиной этого. Вот хорошее место для начала:

Включите файлы ядра: http://aplawrence.com/Linux/limit_core_files.html

Прочтите дамп ядра с помощью GDB: https://stackoverflow.com/questions/5115613/core-dump-file-analysis

Это даст вам общее представление о том, что может быть причиной этого. Возможно, вам потребуется обновить / понизить версию любых установленных вами модулей PHP.