phpmyadmin не будет подключаться к удаленному экземпляру MySQL
У меня есть блок стека LAMP (CentOS 6) и еще один блок CentOS 6 под управлением сервера MySQL.
Я установил phpmyadmin на блок LAMP, но не могу заставить его общаться с моим блоком 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 - Не удается подключиться к локальному серверу MySQL через сокет '/var/lib/mysql/mysql.sock' (2) Сервер не отвечает (или сокет локального сервера настроен неправильно).
Я не знаю, почему речь идет о попытке подключиться к локальному серверу, поскольку я настроил только один сервер (и он удаленный).
Если я tcpdump, я вижу, что он не пытается установить соединение с указанным IP.
Как будто мой конфигурационный файл игнорируется.
Есть ли способ включить больше отладочной информации? Любые предложения приветствуются!
3 ответа
Я решил проблему. Действительно, мой конфигурационный файл игнорировался. Я копировал config.inc.sample.php в config.inc.php в каталоге верхнего уровня веб-сайта (/var/www/html/pma).
Однако в CentOS 6 есть отдельный каталог конфигурации - /etc/phpMyAdmin/. Как только я скопировал туда свой конфиг, все работает нормально.
Одна из стандартных настроек RHEL 6 и CentOS 6 - SELinux по умолчанию в принудительном режиме. Вы можете проверить это с помощью getenforce
команда.
Если в Enforcing
mode самый быстрый способ проверить, является ли виновником SELinux частое временное отключение SELinux с помощью setenforce 0
, Если с отключенным SELinux все работает как положено, это подтверждается.
Верните SELinux в принудительный режим с помощью setenforce 1
и установите политику, управляющую сетевым доступом к базе данных для веб-приложений, разрешенной:
setsebool -P httpd_can_network_connect_db 1
Если база данных MySQL прослушивает нестандартный порт, которого может быть недостаточно, и вы можете попытаться разрешить общую сетевую политику:
sesebool -P httpd_can_network_connect 1
Я столкнулся с другой причиной, по которой вы можете получить эту ошибку. Вам необходимо выполнить следующие условия
- Используйте MySQL Native Driver для PHP (что рекомендуется)
- Используйте 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
, который отключает проверку сертификатов SSL на стороне MySQLND. Для версий до 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;