我在许多服务器上使用 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 页面无法正常工作......)我已经检查过了:
- 会话目录(与 nginx 和 php-fpm 相同的用户)cfphpmyadmin 在 RHEL 6 上的 nginx 和 php-fpm 上遇到问题
- 将 nginx 的 worker_process 更改为我的 CPU 数量查找导致随机 502 网关错误的 Nginx/PHP-FPM 瓶颈