仅当使用 phpMyAdmin 时,通过 nginx/php-fpm 才会发生随机 502 错误,并出现 php 段错误

仅当使用 phpMyAdmin 时,通过 nginx/php-fpm 才会发生随机 502 错误,并出现 php 段错误

我在许多服务器上使用 nginx 和 php-fpm。有些服务器使用带 APC 的 php 5.4,有些使用带 opcache 的 php 5.5 或 5.6。5.4 服务器上的 PhpMyAdmin 运行正常。5.5 或 5.6 服务器上的 PhpMyAdmin 随机抛出 502 错误。这些服务器上托管的所有网站都运行良好,不会抛出 502 错误。

我所说的随机的意思是,我可以多次重新加载相同的 ajax 请求,并且它会完全随机地失败或成功。

我通过禁用 phpMyAdmin 的 opcache 进行了测试,但没有任何改变。

以下是一些 nginx 错误日志:

2015/08/09 23:45:12 [error] 8386#8386: *8 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: XX.XX.XX.XX, server: phpmyadmin.host.com, request: "GET /js/get_scripts.js.php?scripts%5B%5D=jquery/jquery.uitablefilter.js&scripts%5B%5D=gis_data_editor.js&scripts%5B%5D=multi_column_sort.js&scripts%5B%5D=makegrid.js&scripts%5B%5D=sql.js&call_done=1 HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "phpmyadmin.host.com", referrer: "https://phpmyadmin.host.com/"
2015/08/09 23:46:04 [error] 8386#8386: *6 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: XX.XX.XX.XX, server: phpmyadmin.host.com, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "phpmyadmin.host.com"

正如您所看到的,即使来自 phpMyAdmin 的 phpinfo 有时也会出现 502

在 PHP FPM 日志中,我得到了每个 502 错误的段错误。下面是其中一个:

[09-Aug-2015 23:46:04] WARNING: [pool www] child 6965 exited on signal 11 (SIGSEGV) after 372.815678 seconds from start
[09-Aug-2015 23:46:04] NOTICE: [pool www] child 9104 started

最后,使用的配置: nginx 站点

server {
    listen  443 ssl;
    listen  [::]:443 ssl;
    ssl_certificate /etc/ssl/certs/phpmyadmin.pem;
    ssl_certificate_key /etc/ssl/private/phpmyadmin.key;

    server_name phpmyadmin.host.com;
    root /home/var/www/phpmyadmin/;

    location ~ \.php$ {
            expires off;
            include fastcgi_params;
            fastcgi_index index.php;
            fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass  unix:/var/run/php5-fpm.sock;

            fastcgi_buffers 8 16k;
            fastcgi_buffer_size 32k;
            fastcgi_connect_timeout 300;
            fastcgi_send_timeout 300;
            fastcgi_read_timeout 300;
            fastcgi_param PHP_VALUE "max_execution_time=360 \n memory_limit=500M \n post_max_size=40M \n upload_max_filesize=20M \n opcache.enable=0";
    }

    location ~ /\. {
            deny  all;
    }
    access_log /var/log/nginx/phpmyadmin/access.log;
    error_log /var/log/nginx/phpmyadmin/error.log;
}

php-fpm

[www]
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 10
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

phpMyadmin 配置.inc.php

<?php
/* Servers configuration */
$i = 0;

$cfg['blowfish_secret'] = 'a_32_char_long_secret_here';

/* Server: localhost [1] */
$i++;
$cfg['Servers'][$i]['verbose'] = '';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['auth_type'] = 'http';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';

/* End of servers configuration */

$cfg['DefaultLang'] = 'en';
$cfg['ServerDefault'] = 1;
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';
$cfg['ShowPhpInfo'] = true;

关于其他 php 扩展:我使用带有 dotdeb 的 debian 软件包来安装它们。包括的扩展:

  • opcache(但对 phpMyadmin 主机禁用)
  • 副标题
  • 亚太大学
  • 卷曲
  • 广东
  • 映射
  • 国际
  • 加密
  • mysqli
  • mysql
  • pdo_mysql
  • 查询数据库
  • pdo_sqlite
  • 数据库查询语言
  • 阅读行
  • sqlite3

你知道什么可能导致这个问题吗?

如果您需要更多信息,请告诉我。

这可能与 phpMyAdmin 没有直接关系,但我只在使用 phpMyAdmin 时遇到此类错误。服务器用于各种 PHP 项目:Symfony2、magento、自定义框架等...

据我所知,经过快速而粗糙的调试(echo/exit)后,我发现 502 来自 PMA_response::response 函数上的 chdir 指令。

将其注释掉后,phpMyAdmin 的 phpinfo 页面就可以正常工作了。(显然常规 PMA 页面无法正常工作......)我已经检查过了:

相关内容