Непрерывные ошибки сегментации (код 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

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

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

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

pm.max_requests = 600

Опять же это снизило частоту ошибок, но не значительно.

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

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

1 ответ

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

Включите основные файлы: http://aplawrence.com/Linux/limit_core_files.html

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

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

Другие вопросы по тегам