Introducción
Muchos sitios web y aplicaciones comienzan con el servidor web y el backend de la base de datos alojados en la misma máquina. Sin embargo, con el tiempo, una configuración como esta puede volverse engorrosa y difícil de escalar. Una solución común es separar estas funciones configurando una base de datos remota, lo que permite que el servidor y la base de datos crezcan a su propio ritmo en sus propias máquinas.
Uno de los problemas más comunes que encuentran los usuarios cuando intentan configurar una base de datos MySQL remota es que su instancia de MySQL solo está configurada para escuchar conexiones locales. Este es el valor predeterminado de MySQL, pero no funcionará para una configuración de base de datos remota, ya que MySQL necesita poder escuchar una dirección IP externa donde se pueda acceder al servidor.
Habilitar el acceso remoto
Para habilitar el acceso remoto a MySQL, abra su archivo mysqld.cnf
:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Vaya a la línea que comienza con la directiva bind-address
. Se verá así:
...
lc-messages-dir = /usr/share/mysql
skip-external-locking
#
# 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...
De forma predeterminada, este valor se establece en 127.0.0.1
, lo que significa que el servidor solo buscará conexiones locales. Deberá cambiar esta directiva para hacer referencia a una dirección IP externa. Para solucionar problemas, puede establecer esta directiva en una dirección IP comodín, *
, ::
o 0.0.0.0
:
...
lc-messages-dir = /usr/share/mysql
skip-external-locking
#
# 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...
Nota:bind-addressmysqld.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
...
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
bind-address = 0.0.0.0
Después de editar esta línea, guarde y cierre el archivo ( CTRL + X, Y, luego ENTER si lo editó con nano ).
Luego reinicie el servicio MySQL para que los cambios surtan efecto:
sudo systemctl restart mysql
Si tiene una cuenta de usuario MySQL existente que planea usar para conectarse a la base de datos desde su host remoto, deberá volver a configurar esa cuenta para conectarse desde el servidor remoto en lugar de localhost. Para ello, abra el cliente MySQL como usuario raíz de MySQL u otra cuenta de usuario con privilegios:
sudo mysql
Si tiene habilitada la autenticación de contraseña para root, deberá usar el siguiente comando para acceder al shell de MySQL:
mysql -u root -p
Cambiar el host de un usuario
Para cambiar el host de un usuario, puede usar el comando MySQL RENAME USER
. Ejecute el siguiente comando, asegurándose de cambiar el nombre noviello
de su cuenta de usuario de MySQL y la dirección IP de su servidor remoto remote_server_ip
:
RENAME USER 'noviello'@'localhost' TO 'noviello'@'remote_server_ip';
Crear un nuevo usuario
Alternativamente, puede crear una nueva cuenta de usuario que solo se conectará desde el host remoto con el siguiente comando:
CREATE USER 'noviello'@'remote_server_ip' IDENTIFIED BY 'password';
Notacaching_sha2_password
Si planea usar esta base de datos con una aplicación PHP, como phpMyAdmin, es posible que desee crear un usuario remoto que se autentique con el complemento mysql_native_password
anterior, aunque aún es seguro:
CREATE USER 'noviello'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
Si no está seguro, siempre puede crear un usuario que se autentique con caching_sha2_plugin
y ALTER
más tarde con este comando:
ALTER USER 'noviello'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
Luego otorgue al nuevo usuario los privilegios apropiados para sus necesidades particulares. El siguiente ejemplo le otorga a un usuario privilegios globales para CREATE
, ALTER
y DROP
bases de datos, tablas y usuarios, así como para alimentar INSERT
, UPDATE
y DELETE
datos de cualquier tabla en el servidor. También otorga al usuario la capacidad de consultar datos con SELECT
, crear claves externas con la clave REFERENCES
y realizar operaciones FLUSH
con el privilegio RELOAD
. Sin embargo, solo debe otorgar a los usuarios los permisos que necesitan, así que siéntase libre de cambiar los privilegios de su usuario si es necesario.
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'noviellO'@'remote_server_ip' WITH GRANT OPTION;
Después, es una buena idea ejecutar el comando FLUSH PRIVILEGES
. Esto liberará cualquier memoria que el servidor haya almacenado en caché como resultado de las declaraciones CREATE USER
y GRANT
anteriores:
FLUSH PRIVILEGES;
Luego puede salir del cliente MySQL:
exit
Configurar el cortafuegos
Finalmente, suponiendo que haya configurado un firewall en su servidor de base de datos, también deberá abrir el puerto 3306
, el puerto predeterminado de MySQL, para permitir el tráfico a MySQL.
Si planea acceder al servidor de la base de datos solo desde una máquina específica, puede otorgar a esa máquina permiso exclusivo para conectarse a la base de datos de forma remota con el siguiente comando. Asegúrese de reemplazar remote_IP_address
con la dirección IP real de la máquina con la que planea conectarse:
sudo ufw allow from remote_IP_address to any port 3306
Si necesita acceder a la base de datos desde otras máquinas en el futuro, puede otorgarles acceso ad hoc con este comando. Solo recuerde incluir sus respectivas direcciones IP.
Alternativamente, puede permitir conexiones a su base de datos MySQL desde cualquier dirección IP con el siguiente comando:
AdvertenciaNo
sudo ufw allow 3306
A continuación, intente acceder a su base de datos de forma remota desde otra máquina:
Nota
mysql -u user -h database_server_ip -p
Conclusión
Si puede acceder a su base de datos, confirme que la directiva bind-address
en su archivo de configuración fue el problema. Tenga en cuenta, sin embargo, que configurar bind-address
en 0.0.0.0
no es seguro, ya que permite conexiones a su servidor desde cualquier dirección IP. Por otro lado, si aún no puede acceder a la base de datos de forma remota, es posible que otra cosa esté causando el problema.