Вопрос или проблема
У меня есть этот код на моем ПК (Windows), вызывающий базу данных из виртуальной машины Ubuntu с сетевой конфигурацией host-only. Я использую VirtualBox для машины Ubuntu
$ipHost = "xxx.xxx.x.xxx";
$nombreUsuario = "rootpi";
$passUsuario = "rootpi";
$bddNombre = "tienda";
$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);
if ($conexion->connect_error) {
die("Conexión fallida: " .$conexion->connect_error);
}
$sql = "SELECT id, name, address, image FROM people";
$result = $conexion->query($sql);
if ($result->num_rows > 0 ) {
//Stuff...
}
Этот код работает нормально. Соединение устанавливается и показывает результат на моей PHP-странице в сервере Apache. Моя основная цель – передать файлы на мою виртуальную машину Ubuntu 14.04 в директорию /var/www/html
с помощью WinSCP и вызывать их оттуда.
Единственная строка, которую я думаю нужно изменить, это переменная $ipHost с ip на localhost:
$ipHost = "xxx.xxx.x.xxx"; -> $ipHost = "localhost";
Но это не работает. Я пытался вывести echo после:
$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);
Но echo не показывается после него.
У меня установлен MySQL в Ubuntu, также пакет php5
php5-mcrypt
.
Мои версии PHP:
- Windows: PHP Version 5.6.3
- Ubuntu: PHP Version 5.5.9-1ubuntu4.5
Итак, вы в основном говорите, что когда вы подключаетесь по IP-адресу к MySQL Ubuntu, вы можете подключиться, но когда вы на localhost
, это не получается?
Это может быть проблема с правами доступа MySQL, привязанными к IP-адресу. Но это неясно. Я бы сделал следующее для отладки.
Сначала основы.
Прежде всего, вы говорите, что у вас установлены php5
и php5-mcrypt
. А как насчет php5-mysql
? Что-то простое, как это, может вызывать проблемы. Просто выполните эту строку:
sudo aptitude install php5-mysql
И после того как это установлено, перезапустите Apache вот так:
sudo service apache2 restart
Теперь, если это решит проблему, это была простая проблема с установкой программного обеспечения. Всё остальное должно быть покрыто следующими двумя пунктами.
Далее проверьте, как настроено сетевое подключение MySQL.
Если у вас установлен nmap
на вашей системе Ubuntu, войдите в командную строку на Ubuntu и выполните эту команду:
nmap localhost -p 3306
Если у вас нет nmap
установлено, просто выполните следующую команду, чтобы установить его; это простой инструмент для отладки сети, который должен быть установлен по умолчанию:
sudo aptitude install nmap
Это покажет вам, открыт ли порт MySQL (3306) на вашем компьютере или нет. Например, я только что сделал это на тестовой установке Ubuntu 12.04, и вот ответ, который я получил:
Starting Nmap 5.21 ( http://nmap.org ) at 2014-11-30 01:29 EST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000070s latency).
PORT STATE SERVICE
3306/tcp open mysql
Это говорит мне, что порт MySQL (3306) на моем localhost
открыт. Если он закрыт, это может быть проблемой, и я бы открыл my.cnf
на системе Ubuntu и искал bind-address
. Я люблю использовать nano
, поэтому я бы использовал следующую команду:
sudo nano /etc/mysql/my.cnf
И на не сетевой установке MySQL настройка bind-address
будет следующая:
bind-address = 127.0.0.1
Это принудительно связывает его только с localhost
(127.0.0.1). Но если вы говорите, что вы можете подключиться к базе данных MySQL с компьютера Windows, это может быть настроено на IP-адрес VirtualBox, например, используя псевдо-пример с поддельным IP-адресом:
bind-address = 123.456.789.0
И это определенно позволит компьютеру с Windows подключиться, но — и это критично — это позволит подключения только через 123.456.789.0
.
Так что лучший способ позволить как Windows, так и Ubuntu использовать сервер MySQL на этой настройке VirtualBox — это закомментировать строку bind-address
следующим образом:
# bind-address = 123.456.789.0
А затем перезапустить MySQL вот так:
sudo service mysql restart
С этим сделано, ваш MySQL будет доступен в пределах Ubuntu через localhost
, а также на вашем компьютере Windows через IP-соединение. Это фактически позволяет любому подключению в мире подключиться к этой машине. Что не является хорошей вещью для реального рабочего сервера, но для локализованной тестовой/развивающей среды это должно быть нормально.
Теперь проверьте, как настроены права MySQL для пользователя базы данных.
Теперь, если эта первая часть показала, что вы успешно установили сетевое соединение между мирами Ubuntu и Windows, но все же не можете подключиться, следующая проблема может быть связана с MySQL GRANTS
, что по сути является пользовательскими правами в MySQL.
Чтобы проверить права своего пользователя, сначала необходимо войти в MySQL как привилегированный пользователь и выполнить эту команду для подключения к основной базе данных mysql
:
CONNECT `mysql`;
А затем выполнить эту команду, чтобы увидеть, какие пользователи/хосты вы настроили:
SELECT `user`, `host` from `user`;
Вывод на простой установке MySQL должен выглядеть примерно так, если у вас настроен только root
:
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| debian-sys-maint | localhost |
| root | localhost |
+------------------+-----------+
Конечно, ваш список может отличаться от моего, так что имейте это в виду. Но ключ в том, что вы должны увидеть что-то вроде этого. Обратите внимание, как root
имеет три разных записи в user
: одна для 127.0.0.1
(IPv4 адрес), ::1
(IPv6 адрес) и localhost
(читаемое имя хоста). Это здесь ключевой момент.
Дело в том, что если ваш пользователь привязан только к сетевому адресу — такому как 123.456.789.0
— то пользователь не сможет подключиться через localhost
. Итак, вам нужно будет настроить отдельное разрешение для localhost
.
Сделать это довольно просто. Некоторые люди любят предоставлять все права пользователю в развивающей среде следующим образом:
GRANT ALL PRIVILEGES ON `some_database`.* TO 'some_user'@'localhost';
Но мне это не нравится по многим причинам. Я предпочитаю использовать довольно безопасный, но стандартный набор прав для пользователей MySQL, который позволяет им делать то, что им необходимо в их базе данных, но не позволяет root-права следующим образом:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `some_database`.* TO 'some_user'@'localhost';
Конечно, измените some_database
и some_user
, чтобы они соответствовали вашей специфической настройке. Но после выполнения одной из этих команд GRANT
, вам нужно сказать MySQL перезагрузить права вот так:
FLUSH PRIVILEGES;
И теперь, если вы выполните команду SHOW GRANTS
для этого пользователя, вы увидите все их права, как вы их настроили:
SHOW GRANTS FOR 'some_user'@'localhost';
Это основные два пункта, которые я бы проверил и сделал, когда отлаживаю проблем у MySQL с подключением/сетью, как эта.
Наконец, протестируйте соединение из командной строки.
И теперь, чтобы протестировать соединение из командной строки Ubuntu 14.04, просто введите следующую команду:
mysql -u some_user -p
Конечно, измените some_user
, чтобы он соответствовал вашему пользователю, а затем введите ваш пароль. Теперь вы должны быть подключены к MySQL через этого пользователя. Если вы можете успешно подключиться через командную строку, значит, у вас всё в порядке с подключением/сетью MySQL. Всё остальное может быть связано с вашим PHP-кодированием. И это действительно выходит за рамки простого ответа на этом сайте; вам нужно отладить ваш локальный PHP-код самостоятельно, чтобы это решить.
Пара обновлений к @Giacomo1968’s очень подробному и полезному ответу в Ubuntu 24.04.1 LTS…
Строки bind-address, которые нужно закомментировать, находятся в /etc/mysql/mysql.conf.d/mysqld.cnf
:
# Вместо skip-networking по умолчанию сейчас только прослушивание
# на localhost, что более совместимо и не менее безопасно.
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
(Я закомментировал обе “на всякий случай”, хотя я не использую MySQL’s X Plugin, так что только bind-address действительно был нужен.)
Также мне нужно было открыть брандмауэр с помощью:
sudo ufw allow mysql
И:
sudo ufw reload
Ответ или решение
Чтобы подключиться к базе данных MySQL на виртуальной машине Ubuntu, работающей в VirtualBox с сетью типа host-only, необходимо выполнить ряд шагов. Эти шаги обеспечат корректную настройку как самой виртуальной машины, так и MySQL, чтобы обеспечивать надежное соединение. Давайте разберем этот процесс детально.
Теория
При работе с MySQL на виртуальной машине важно учитывать несколько аспектов: настройку MySQL, настройку сети VirtualBox и настройку уверенного доступа через SSH или другие соединения.
-
Версии программного обеспечения: Убедитесь, что все необходимые пакеты установлены. Например, в Ubuntu нужно установить
php5-mysql
,php5
,php5-mcrypt
, и убедиться, что служба Apache запущена корректно. -
Сетевые настройки: VirtualBox позволяет настраивать различные режимы сети, такие как NAT и host-only. В случае, когда виртуальная машина должна быть доступна только с хоста, рекомендуется использовать host-only сеть.
-
MySQL доступ через сеть: MySQL может быть настроен на прослушивание соединений только из определенных местоположений. Это можно настроить в конфигурационном файле
my.cnf
с параметромbind-address
.
Пример
Предположим, у вас уже настроена виртуальная машина Ubuntu и MySQL, согласно следующей конфигурации:
- Windows PC служит хост-машиной.
- Ubuntu VM находится в VirtualBox и настроена на использование host-only сети.
- Мы используем
root
пользователя для доступа к MySQL на тестовой базе данных под названиемtienda
.
Изначально код PHP может выглядеть так:
$ipHost = "xxx.xxx.x.xxx";
$nombreUsuario = "rootpi";
$passUsuario = "rootpi";
$bddNombre = "tienda";
$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);
if ($conexion->connect_error) {
die("Conexión fallida: " .$conexion->connect_error);
}
$sql = "SELECT id, name, address, image FROM people";
$result = $conexion->query($sql);
if ($result->num_rows > 0 ) {
// Обработка данных...
}
Код работает, пока вы используете IP-адрес, но как только вы хотите переключиться на localhost
, вы сталкиваетесь с проблемой соединения.
Применение
1. Установка необходимых пакетов
Прежде всего, убедитесь, что у вас установлены все необходимые расширения PHP:
sudo aptitude install php5-mysql
После установки перезапустите Apache, чтобы изменения вступили в силу:
sudo service apache2 restart
2. Проверка настройки MySQL
Убедитесь, что MySQL настроен для прослушивания локальных подключений. Для этого откройте конфигурационный файл my.cnf
:
sudo nano /etc/mysql/my.cnf
Проверьте или закомментируйте строку с bind-address
:
# bind-address = 127.0.0.1
Затем перезапустите MySQL:
sudo service mysql restart
3. Настройка прав доступа
Проверка прав доступа MySQL выполняется с помощью команды SHOW GRANTS
. Убедитесь, что пользователи MySQL имеют необходимые права для подключения с localhost
. Если это не так, создайте соответствующий набор прав:
GRANT ALL PRIVILEGES ON tienda.* TO 'rootpi'@'localhost' IDENTIFIED BY 'rootpi';
FLUSH PRIVILEGES;
4. Проверка сетевых портов
Используйте nmap
для проверки открытых портов:
sudo aptitude install nmap
nmap localhost -p 3306
Если порт закрыт, убедитесь, что ваш файервол разрешает соединения. Для этого выполните:
sudo ufw allow mysql
sudo ufw reload
5. Обратный тест соединения
Теперь, когда все настройки обновлены, протестируйте MySQL соединение с командной строки Ubuntu:
mysql -u rootpi -p
Введите ваш пароль. Если все успешно, значит ваша настройка верна.
Заключение
Процесс настройки MySQL на виртуальной машине с Ubuntu может требовать учета множества деталей, включая конфигурации сети, настройки доступа и MySQL, а также обеспечения необходимых прав доступа. Этот процесс требует должной внимательности к деталям, чтобы гарантировать, что база данных доступна и отвечают задачам локальной разработки и тестирования.