PHP-FPM и континуо "выход по сигналу 11"
У меня есть веб-сервер Hp с Xeon E5504 2 ГГц и оперативной памятью 8 ГБ, с freebsd 8.2-p9 amd64, nginx 1.2.1, PHP 5.3.14, mysql 5.5.25, apc, memcached и другими пакетами, установленными с использованием портов freebsd. (файл conf в конце этого сообщения)
Моя проблема проста, у меня много "выходов по сигналу 11" в / var / log / messages, и когда умирает ребенок php-fpm, на моем веб-сайте "ошибка шлюза 502", это действительно скучно, потому что я много таких ошибок за день, в этом php-fpm conf я вынудил его к тяжелой конфигурации с 150 потомками php-fpm в статическом режиме, и pm.max_requests = 10000000, но в моем журнале php-fpm Я нашел для каждого ребенка:
[19-Jul-2012 18:58:14.666913] NOTICE: pid 84563, fpm_children_make(), line
421: [pool www] child 84717 started
[19-Jul-2012 18:58:14.666984] DEBUG: pid 84563, fpm_event_loop(), line 409:
event module triggered 1 events
[19-Jul-2012 18:58:17.403217] DEBUG: pid 84563, fpm_event_loop(), line 409:
event module triggered 2 events
[19-Jul-2012 18:58:17.407442] DEBUG: pid 84563, fpm_got_signal(), line 72:
received SIGCHLD
[19-Jul-2012 18:58:17.407552] WARNING: pid 84563, fpm_children_bury(), line
252: [pool www] child 84563 exited on signal 11 (SIGSEGV) after 39.849444
seconds from start
и в / var / log / message для того же pid:
Jul 19 18:58:14 web1 kernel: pid 84563 (php-fpm), uid 1001: exited on signal 11
чтобы быть уверенным, что это не проблемы с файлами конфигурации (php.ini и php-fpm.conf), я восстановил его с помощью оригинального файла, найденного в архиве, но ничего, кроме того, что я пытался использовать spawn-fcgi, но та же беда!
Затем я попытался сгенерировать php-fpm.core под управлением " gdb / usr / local / sbin / php-fpm ", когда дочерний выход с " exited on signal 11 ", выход из основного процесса php-fpm с " exited по сигналу 5 (core dumped) "(это только когда я запускаю его, бросаю GDB!), вот логи и результаты gdb backtrace:
- / var / log / messages (см. выше)
- PHP-fpm.log
- GDB
Как видно из последней ссылки, это последние строки:
#659 0x0000000801534de0 in ?? () from /lib/libc.so.7
#660 0x0000000000000001 in ?? ()
#661 0x00007fffffffec08 in ?? ()
#662 0x000000000000000f in ?? ()
Cannot access memory at address 0x800000000000
Есть идеи?
Спасибо!
/ Вар / Журнал / сообщения:
Jul 24 17:58:41 web1 kernel: pid 3887 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:42 web1 kernel: pid 3998 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:42 web1 kernel: pid 3895 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:42 web1 kernel: pid 3892 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:43 web1 kernel: pid 3889 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:43 web1 kernel: pid 3898 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:44 web1 kernel: pid 3886 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:44 web1 kernel: pid 3999 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:45 web1 kernel: pid 3896 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:45 web1 kernel: pid 4000 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:45 web1 kernel: pid 3893 (php-fpm), uid 1001: exited on signal 11
Jul 24 17:58:55 web1 kernel: pid 3885 (php-fpm), uid 0: exited on signal 5 (core dumped)
php.ini (только отличие от оригинального файла)
[PHP]
memory_limit = 128M
apc.enabled=1
apc.shm_size=128M
apc.ttl=0
apc.mmap_file_mask=/tmp/apc/apc.XXXXXX
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
display_errors = On
display_startup_errors = On
track_errors = On
html_errors = On
upload_max_filesize = 4M
[Date]
date.timezone = Europe/Rome
[browscap]
browscap = /home/serverweb/etc/php/browscap.ini
php-fpm.conf (только отличие от исходного файла)
[global]
error_log = /home/serverweb/log/php-fpm/error.log
log_level = debug
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
process.max = 0
[www]
user = web
group = web
listen = 127.0.0.1:9999
listen.allowed_clients = 127.0.0.1
pm = static
pm.max_children = 16
pm.max_requests = 10000000
slowlog = /home/serverweb/log/php-fpm/$pool.log.slow
2 ответа
В PHP 5.3.14 есть серьезная ошибка, которая приводит к segfault в php-fpm. Это было исправлено в 5.3.15 и 5.4.5.
Если это все еще происходит в последней версии PHP, попробуйте выполнить:
$ dmesg | grep segfault | tail -10
php-fpm[327]: segfault at 834ac30 ip 000000000834ac30 sp 00007ffc112d1b78 error 14 in libnss_nis-2.23.so[7fe02b461000+b000]
php-fpm[329]: segfault at 834ac30 ip 000000000834ac30 sp 00007ffc112d1b78 error 14
php-fpm[331]: segfault at 834ac30 ip 000000000834ac30 sp 00007ffc112d2278 error 14 in libnss_nis-2.23.so[7fe02b461000+b000]
В конце строк вы можете увидеть, в какой библиотеке происходит сбой, например
error 14 in libnss_nis-2.23.so
Таким образом, вы можете попробовать обновить эту библиотеку, например, выполнив следующие команды в качестве примера:
$ locate libnss_nis-2.23.so
/lib/x86_64-linux-gnu/libnss_nis-2.23.so
$ dpkg -S /lib/x86_64-linux-gnu/libnss_nis-2.23.so
Затем, в зависимости от того, к какой библиотеке относится уязвимость, попробуйте обновить ее. Если это не поможет, попробуйте поискать или сообщить о соответствующих ошибках.
За newrelic-X.so
Смотрите: PHP агент Segfaults.
Обратите внимание, что PHP 5.6 и ниже больше не поддерживаются. См.: Страница поддерживаемых версий PHP. Например, поддержка веток PHP 5.6 была до 19 января 2017 года, поэтому рекомендуется обновить ваш PHP до последней стабильной ветки.
Кроме того, когда вы не можете обновить свои версии, включение и исследование дампов ядра с помощью списка обратных трассировок может указать вам правильное направление к корню сбоев.