我有一个 LAMP 堆栈盒(CentOS 6)和另一个运行 mysql 服务器的 CentOS 6 盒。
我已经在 LAMP 框上安装了 phpmyadmin,但我根本无法让它与我的 SQL 框对话。
我在 config.inc.php 中配置了以下内容
/* Servers configuration */
$i = 0;
/* Server: usp-ggdb2 [1] */
$i++;
$cfg['Servers'][$i]['verbose'] = 'usp-ggdb2';
$cfg['Servers'][$i]['host'] = '10.1.2.3';
$cfg['Servers'][$i]['port'] = '';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';
当我浏览 phpmyadmin 网站时出现以下错误:
#2002 - 无法通过套接字“/var/lib/mysql/mysql.sock”连接到本地 MySQL 服务器(2)服务器没有响应(或者本地服务器的套接字配置不正确)。
我不知道为什么它说尝试连接到当地的服务器,因为我只配置了一台服务器(并且它是远程的)。
如果我使用 tcpdump,我可以看到它没有尝试与我指定的 IP 建立连接。
就好像我的配置文件被忽略了一样。
有没有办法打开更多调试信息?欢迎提出任何建议!
答案1
我已经解决了这个问题。事实上,我的配置文件被忽略了。我一直在将 config.inc.sample.php 复制到网站顶级目录 (/var/www/html/pma) 中的 config.inc.php。
但是,在 CentOS 6 上有一个单独的配置目录 -- /etc/phpMyAdmin/。一旦我将配置复制到那里,一切就都正常了。
答案2
RHEL 6 和 CentOS 6 中的标准设置之一是 SELinux 默认为强制模式。您可以使用命令来验证这一点getenforce
。
如果处于Enforcing
模式,验证 SELinux 是否是罪魁祸首的最快方法通常是使用 暂时禁用 SELinux setenforce 0
。如果禁用 SELinux 后一切正常,则确认无误。
将 SELinux 返回到强制模式,setenforce 1
并将管理 Web 应用程序基于网络的数据库访问的策略设置为允许:
setsebool -P httpd_can_network_connect_db 1
如果 MySQL 数据库正在监听非标准端口,则可能不足,您可以尝试允许通用网络策略:
sesebool -P httpd_can_network_connect 1
答案3
我遇到了导致此错误的另一个原因。您需要满足以下条件
- 使用适用于 PHP 的 MySQL Native Driver(推荐)
- 使用 MySQL 5.6 或更高版本
- 使用自签名 SSL 证书进行 MySQL 通信
正如所述这个PHP错误,MySQLND 将遵循 MySQL 的偏好并尝试验证 SSL 证书。由于无法验证(自签名),因此连接会失败并出现 2002 错误(很好,很模糊!)
如错误中所述,PHP 5.6.16(7.0 及以上版本中也存在)添加了另一个mysqli_real_connect
名为的连接选项MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT
,该选项禁用了 MySQLND 端的 SSL 证书验证。对于 PMA 4.6.0 之前的版本,您必须编辑libraries/dbi/DBIMysqli.php
并编辑以下行
$client_flags |= MYSQLI_CLIENT_SSL;
并将其替换为(仅适用于 PHP 5.6.16 或更高版本)
$client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT;
对于 PMA 4.6.0 或更高版本,您只需在配置中设置
$cfg['Servers'][$i]['ssl_verify'] = false;