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