【问题标题】:PHP-FPM core dump not generated未生成 PHP-FPM 核心转储
【发布时间】:2020-05-13 13:28:25
【问题描述】:

当 PHP 以 WARNING: [pool www] child 2756 exited on signal 11 (SIGSEGV) after 153.518521 seconds from start 失败时,我正在尝试生成核心转储。 我正在使用托管在 ECS 上的基于 Alpine 的自定义 Docker 容器。

我遵循了多个指南,但 PHP-FPM 不生成核心转储(我可以使用 php cli 或 kill -s SIGSEGV $$ 生成核心转储)。我遵循的指南: -https://ma.ttias.be/generate-php-core-dumps-segfaults-php-fpm/https://www.bggofurther.com/2015/04/generating-core-dumps-for-php-fpm/ - Core dump file is not generated

我的配置如下:

/ # ulimit -c
unlimited

/ # cat /proc/sys/kernel/core_pattern
/tmp/core-dumps/core-%t-%p

/ # cat /proc/sys/kernel/core_uses_pid
0

/ # php-fpm -tt
[global]
 pid = undefined
 error_log = /proc/self/fd/2
 syslog.ident = php-fpm
 syslog.facility = 24
 log_buffering = yes
 log_level = unknown value
 log_limit = 8192
 emergency_restart_interval = 0s
 emergency_restart_threshold = 0
 process_control_timeout = 0s
 process.max = 0
 process.priority = undefined
 daemonize = no
 rlimit_files = 0
 rlimit_core = 0
 events.mechanism = epoll

[www]
 prefix = undefined
 user = www-data
 group = www-data
 listen = 9000
 listen.backlog = 511
 listen.owner = undefined
 listen.group = undefined
 listen.mode = undefined
 listen.allowed_clients = undefined
 process.priority = undefined
 process.dumpable = no
 pm = dynamic
 pm.max_children = 35
 pm.start_servers = 6
 pm.min_spare_servers = 4
 pm.max_spare_servers = 8
 pm.process_idle_timeout = 10
 pm.max_requests = 500
 pm.status_path = /_/php-fpm/status
 ping.path = undefined
 ping.response = undefined
 access.log = /proc/self/fd/2
 access.format = [%{%Y-%m-%dT%H:%M:%S%z}t] %R "%m %{REQUEST_SCHEME}e://%{HTTP_HOST}e%{REQUEST_URI}e" %s %f %{mili}d %{kilo}M %C%%
 slowlog = undefined
 request_slowlog_timeout = 0s
 request_slowlog_trace_depth = 20
 request_terminate_timeout = 0s
 request_terminate_timeout_track_finished = no
 rlimit_files = 0
 rlimit_core = unlimited
 chroot = undefined
 chdir = undefined
 catch_workers_output = yes
 decorate_workers_output = no
 clear_env = no
 security.limit_extensions = .php .phar

configuration file /usr/local/etc/php-fpm.conf test is successful

我尝试使用/proc/sys/kernel/core_uses_pid1process.dumpable = yes,但仍然没有生成核心转储。 我想 PHP-FPM 配置存在问题,因为当我在 cli 中执行脚本时(我的意思是像 php generate_sigsegv.php),核心转储生成良好。但是,我不知道为什么会出错。

对于 CLI,我使用这个脚本:

<?php

  function segfault ($i = 1) {
    echo "$i\n";
    segfault($i + 1);
  }

  segfault();

?>

对于 PHP-FPM,我正在调查我的应用程序中的一个错误,因此我有一个 API 可以调用以生成 SIGSEGV。

【问题讨论】:

  • 由于核心转储是由内核生成的,因此需要在主机而不是容器中启用它们。 stackoverflow.com/q/28335614/1216776
  • 感谢您的回答。在我的容器中为任何进程(cli、shell 中的 php)很好地生成了核心转储,问题仅在于 PHP-FPM。所以我想我的主机配置没问题。
  • 所以 PHP-FPM 一定是困住了他们。你可以用 strace 或 gdb 运行吗?
  • 这里是 strace 详细信息:pastebin.com/vf793W33
  • @stark 你有提示为什么我的配置无法创建核心转储吗?提前致谢!

标签: php linux segmentation-fault


【解决方案1】:

我也遇到了这个问题,最后我通过在 fpm pool conf 中启用另一个设置解决了这个问题。

process.dumpable = yes
rlimit_core = unlimited

注意:不仅应设置rlimit_core,还应设置process.dumpable

【讨论】:

    【解决方案2】:

    问题在于生成核心转储的文件夹的权限。确保 PHP-FPM 使用的用户有权在文件夹上写入。 因为 CLI 中的 PHP 是由容器中的用户(主要是 root)执行的,所以您可能有权限但没有 PHP-FPM。

    【讨论】:

      猜你喜欢
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 2011-09-05
      • 2023-03-27
      • 2013-07-24
      • 1970-01-01
      相关资源
      最近更新 更多