Многие веб-сайты и приложения начинают свою работу с того, что веб-сервер и база данных размещаются на одной машине. Однако со временем такая конфигурация может стать громоздкой и трудно масштабируемой. Общим решением является разделение этих функций путем создания удаленной базы данных, что позволяет серверу и базе данных расти в своем собственном темпе на своих собственных машинах.
Настройка прослушивания
Одна из наиболее распространенных проблем, с которой сталкиваются пользователи при попытке настроить удаленную базу данных MySQL, заключается в том, что экземпляр MySQL настроен только на прослушивание локальных соединений. Это стандартная настройка MySQL, но она не подходит для установки удаленной базы данных, поскольку MySQL должен иметь возможность прослушивать внешний IP-адрес, с которого можно связаться с сервером.
Чтобы включить эту настройку, откройте файл mysqld.cnf:
1 | sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf |
Перейдите к строке, начинающейся с директивы bind-address. Она будет выглядеть следующим образом:
1 2 3 4 | # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = 127.0.0.1 . . . |
По умолчанию это значение установлено на 127.0.0.1, что означает, что сервер будет искать только локальные соединения. Вам нужно изменить эту директиву, чтобы она ссылалась на внешний IP-адрес. Для устранения неполадок вы можете установить эту директиву на IP-адрес с подстановочным знаком, либо *, ::, либо 0.0.0.0:
1 2 3 4 | # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = 0.0.0.0 . . . |
В некоторых версиях MySQL директива bind-address может отсутствовать в файле mysqld.cnf по умолчанию.
Затем перезапустите службу MySQL, чтобы изменения, внесенные в mysqld.cnf, вступили в силу:
1 | sudo systemctl restart mysql |
Если необходимо прослушивать только определенные сетевые интерфейсы, просто укажите IP адреса через запятую, к примеру
1 | bind-address = 192.168.0.1,127.0.0.1 |
Настройка пользователя
Если у вас есть существующая учетная запись пользователя MySQL, которую вы планируете использовать для подключения к базе данных с удаленного хоста, вам нужно будет перенастроить эту учетную запись на подключение с удаленного сервера, а не с localhost. Для этого откройте клиент MySQL от имени пользователя root MySQL или другой привилегированной учетной записи:
1 | sudo mysql |
Если вы включили аутентификацию по паролю для root, вам нужно будет использовать следующую команду для доступа к оболочке MySQL:
1 | mysql -u root -p |
Чтобы изменить хост пользователя, можно использовать команду MySQL RENAME USER. Выполните следующую команду, изменив sammy на имя вашей учетной записи пользователя MySQL, а remote_server_ip - на IP-адрес вашего удаленного сервера:
1 | RENAME USER 'user'@'localhost' TO 'user'@'remote_server_ip'; |
В качестве альтернативы можно создать новую учетную запись пользователя, которая будет подключаться только с удаленного узла, выполнив следующую команду:
1 | CREATE USER 'user'@'remote_server_ip' IDENTIFIED BY 'password'; |
Эта команда создаст пользователя, который будет аутентифицироваться с помощью плагина аутентификации MySQL по умолчанию, caching_sha2_password. Однако в некоторых версиях PHP существует известная проблема, которая может привести к проблемам с этим плагином.
Если вы планируете использовать эту базу данных с PHP-приложением - например, phpMyAdmin, - вам, возможно, захочется создать удаленного пользователя, который будет аутентифицироваться с помощью более старого, но все еще безопасного плагина mysql_native_password:
1 | CREATE USER 'user'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password'; |
Если вы не уверены, вы всегда можете создать пользователя, который будет аутентифицироваться с помощью caching_sha2_plugin, а затем изменить его с помощью этой команды:
1 | ALTER USER 'user'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password'; |
Затем предоставьте новому пользователю привилегии, соответствующие вашим конкретным потребностям. В следующем примере пользователю предоставляются глобальные привилегии на создание, изменение и удаление баз данных, таблиц и пользователей, а также право на INSERT, UPDATE и DELETE данных из любой таблицы на сервере. Кроме того, пользователь получает возможность запрашивать данные с помощью SELECT, создавать внешние ключи с помощью ключевого слова REFERENCES и выполнять операции FLUSH с помощью привилегии RELOAD. Однако вы должны предоставлять пользователям только те права, которые им необходимы, поэтому не стесняйтесь корректировать привилегии своих пользователей по мере необходимости.
1 | GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'user'@'remote_server_ip' WITH GRANT OPTION; |
После этого рекомендуется выполнить команду FLUSH PRIVILEGES. Это освободит память, которую сервер кэшировал в результате выполнения предыдущих команд CREATE USER и GRANT:
1 | FLUSH PRIVILEGES; |
Затем вы можете выйти из клиента MySQL:
1 | exit |
Настройка брандмауэра
Наконец, если вы настроили брандмауэр на своем сервере баз данных, вам также нужно открыть порт 3306 - порт MySQL по умолчанию - чтобы разрешить трафик к MySQL.
Если вы планируете получать доступ к серверу базы данных только с одной определенной машины, вы можете предоставить этой машине эксклюзивное разрешение на удаленное подключение к базе данных с помощью следующей команды. Убедитесь, что вместо remote_IP_address указан реальный IP-адрес машины, с которой вы планируете подключаться:
1 | sudo ufw allow from remote_IP_address to any port 3306 |
Если в будущем вам понадобится доступ к базе данных с других машин, вы можете предоставить им доступ на разовой основе с помощью этой команды. Только не забудьте указать их соответствующие IP-адреса.
Кроме того, вы можете разрешить подключение к базе данных MySQL с любого IP-адреса с помощью следующей команды:
Эта команда позволит любому получить доступ к вашей базе данных MySQL. Не запускайте ее, если в вашей базе данных хранятся конфиденциальные данные.
1 | sudo ufw allow 3306 |
Проверка подключения
После этого попробуйте получить удаленный доступ к базе данных с другой машины:
Если вы добавили правило брандмауэра, разрешающее соединения только с определенного IP-адреса, вы должны попытаться получить доступ к базе данных с машины, связанной с этим адресом.
1 | mysql -u user -h database_server_ip -p |
Если вы сможете получить доступ к базе данных, это подтвердит, что проблема была в директиве bind-address в вашем конфигурационном файле. Обратите внимание, что установка bind-address на 0.0.0.0 небезопасна, так как позволяет подключаться к вашему серверу с любого IP-адреса. С другой стороны, если вы по-прежнему не можете получить удаленный доступ к базе данных, проблема может заключаться в чем-то другом.