Introducción
A medida que su aplicación o sitio web crece, podría llegar a un punto en que la configuración actual de su servidor se quede pequeña. Si aloja su servidor web y su base de datos en la misma máquina, puede ser buena idea separar ambas funciones para que cada una pueda ejecutarse en su propio hardware y compartir la carga de responder a las solicitudes de sus visitantes.
En esta guía, veremos cómo configurar un servidor de base de datos MySQL remoto al que se pueda conectar tu aplicación web. Usaremos WordPress como ejemplo para poder trabajar con él, pero la técnica es aplicable a cualquier aplicación compatible con MySQL.
Requisitos previos
- Dos servidores Ubuntu 18.04. Como se explica en el tutorial "Configuración inicial del servidor con Ubuntu 18.04", cada uno debe tener un usuario no root con privilegios de sudo y el firewall UFW habilitado. Uno de estos servidores alojará su servidor MySQL y lo llamaremos "servidor de base de datos" en esta guía. El otro se conectará remotamente a su servidor de base de datos y actuará como su servidor web. De igual forma, lo llamaremos "servidor web" en esta guía.
- Nginx y PHP están instalados en su servidor web. Nuestro tutorial sobre cómo instalar Linux, Nginx, MySQL y PHP (pila LEMP) en Ubuntu 18.04 le guiará en el proceso, pero tenga en cuenta que debe omitir el paso 2 de este tutorial, que se centra en la instalación de MySQL, ya que lo instalará en su servidor de bases de datos.
- MySQL está instalado en tu servidor de bases de datos. Sigue nuestra guía sobre cómo instalar MySQL en Ubuntu 18.04 para configurarlo.
- Opcionalmente (pero muy recomendable), se instalan certificados TLS/SSL de Let's Encrypt en su servidor web. Necesitará comprar un nombre de dominio y configurar registros DNS para su servidor, pero los certificados son gratuitos. Nuestra guía "Cómo proteger Nginx con Let's Encrypt en Ubuntu 18.04" le muestra cómo obtener estos certificados.
Paso 1: Configurar MySQL para escuchar conexiones remotas
Una vez alcanzado el límite de rendimiento de una configuración de una sola máquina, almacenar los datos en un servidor independiente es una buena manera de escalar con fluidez. Además, proporciona la estructura básica necesaria para equilibrar la carga y escalar la infraestructura posteriormente. Después de instalar MySQL siguiendo el tutorial de prerrequisitos, deberá cambiar algunos valores de configuración para permitir conexiones desde otras computadoras.
La mayoría de los cambios en la configuración del servidor MySQL se pueden realizar en el archivo mysqld.cnf, que se almacena por defecto en el directorio /etc/mysql/mysql.conf.d/. Abra este archivo en su servidor de bases de datos con privilegios de root en su editor preferido. Usaremos nano:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfEste archivo está dividido en secciones, marcadas con etiquetas entre corchetes ([ y ]). Busque la sección titulada mysqld:
. . .
[mysqld]
. . .
En esta sección, busque un parámetro llamado bind-address. Este indica al software de la base de datos en qué dirección de red debe escuchar las conexiones.
De forma predeterminada, está configurado en 127.0.0.1, lo que significa que MySQL está configurado para buscar solo conexiones locales. Deberá cambiarlo para que apunte a una dirección IP externa desde la que se pueda acceder a su servidor.
Si ambos servidores se encuentran en un centro de datos con capacidad de red privada, utilice la IP de red privada de su servidor de base de datos. De lo contrario, puede usar su dirección IP pública:
[mysqld]
. . .
bind-address = db_server_ipDado que se conectará a su base de datos a través de internet, se recomienda usar conexiones cifradas para proteger sus datos. Si no cifra su conexión MySQL, cualquier persona en la red puede interceptar información confidencial entre sus servidores web y de base de datos. Para cifrar las conexiones MySQL, agregue la siguiente línea después de la línea bind-address que actualizó:
[mysqld]
. . .
require_secure_transport = on
. . .Cuando termines, guarda y cierra el archivo. Si usas nano, hazlo presionando CTRL+X, Y y luego ENTER.
Para que las conexiones SSL funcionen, necesita crear claves y certificados. MySQL incluye un comando que los configura automáticamente. Ejecute el siguiente comando para crear los archivos necesarios. Además, los hace legibles para el servidor MySQL especificando el UID del usuario MySQL:
sudo mysql_ssl_rsa_setup --uid=mysqlPara forzar a MySQL a actualizar la configuración y leer la nueva información SSL, reinicie la base de datos:
sudo systemctl restart mysqlPara verificar que el servidor ahora está escuchando en la interfaz externa, ejecute el siguiente comando netstat:
sudo netstat -plunt | grep mysqldOutput
tcp 0 0 db_server_ip:3306 0.0.0.0:* LISTEN 27328/mysqldnetstat imprime estadísticas sobre el sistema de red de su servidor. Esta salida nos muestra que un proceso llamado mysqld está conectado a db_server_ip en el puerto 3306, el puerto estándar de MySQL, y confirma que el servidor está escuchando en la interfaz correcta.
A continuación, abra ese puerto en el firewall para permitir el tráfico a través de él:
sudo ufw allow mysqlEstos son todos los cambios de configuración que necesita realizar en MySQL. A continuación, veremos cómo configurar la base de datos y algunos perfiles de usuario, uno de los cuales usará para acceder al servidor de forma remota.
Paso 2: Configuración de una base de datos de WordPress y credenciales remotas
Aunque MySQL está escuchando en una dirección IP externa, no hay usuarios ni bases de datos configurados remotamente. Creemos una base de datos para WordPress y un par de usuarios que puedan acceder a ella.
Comience conectándose a MySQL como usuario raíz de MySQL:
sudo mysqlDesde el símbolo del sistema de MySQL, cree una base de datos que WordPress usará. Puede ser útil darle un nombre reconocible para que pueda identificarla fácilmente más adelante. Aquí la llamaremos WordPress:
Ahora que ha creado su base de datos, el siguiente paso es crear un par de usuarios. Crearemos un usuario local y un usuario remoto asociado a la dirección IP del servidor web.
Primero, crea tu usuario local, wpuser, y asocia esta cuenta únicamente a intentos de conexión local, utilizando localhost en la declaración:
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password';Luego dale a esta cuenta acceso completo a la base de datos de WordPress:
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';Este usuario ahora puede realizar cualquier operación en la base de datos de WordPress, pero no puede usar esta cuenta de forma remota, ya que solo se conecta a conexiones del equipo local. Teniendo esto en cuenta, cree una cuenta complementaria que se conecte exclusivamente a conexiones de su servidor web. Necesitará la dirección IP de su servidor web para ello.
Tenga en cuenta que debe usar una dirección IP que utilice la misma red que configuró en el archivo mysqld.cnf. Esto significa que si especificó una IP de red privada en el archivo mysqld.cnf, debe ingresar la IP privada de su servidor web en los dos comandos siguientes. Si configuró MySQL para usar la red pública de internet, debe hacerla coincidir con la dirección IP pública del servidor web.
CREATE USER 'remotewpuser'@'web_server_ip' IDENTIFIED BY 'password';Después de crear su cuenta remota, asígnele los mismos privilegios que a su usuario local:
GRANT ALL PRIVILEGES ON wordpress.* TO 'remotewpuser'@'web_server_ip';Por último, borre los privilegios para que MySQL sepa que debe comenzar a usarlos:
FLUSH PRIVILEGES;Luego salga del comando MySQL escribiendo:
exitAhora que tiene una nueva base de datos y un usuario remoto activo configurado, puede probar si puede conectarse a la base de datos desde su servidor web.
Paso 3 – Probar las conexiones remotas y locales
Antes de continuar, es una buena idea verificar que puede conectarse a su base de datos tanto desde su máquina local (su servidor de base de datos) como desde su servidor web.
Primero, pruebe la conexión local desde su servidor de base de datos intentando iniciar sesión en su nueva cuenta:
mysql -u wpuser -pCuando se le solicite, ingrese la contraseña que estableció para esta cuenta.
Si se le solicita MySQL, la conexión local se realizó correctamente. Puede salir de nuevo escribiendo:
exitLuego inicie sesión en su servidor web para probar las conexiones remotas:
ssh sammy@web_server_ipPara acceder a la base de datos remota, necesita instalar algunas herramientas cliente MySQL en su servidor web. Primero, actualice la caché local de paquetes si no lo ha hecho recientemente:
sudo apt updateA continuación, instale las herramientas del cliente MySQL:
sudo apt install mysql-clientDespués de esto, conéctese a su servidor de base de datos utilizando el siguiente comando:
mysql -u remotewpuser -h db_server_ip -pNuevamente, asegúrese de usar la dirección IP correcta para su servidor de base de datos. Si configuró MySQL para escuchar en una red privada, ingrese la IP de la red privada de su base de datos. De lo contrario, ingrese la dirección IP pública de su servidor de base de datos.
Se le solicitará la contraseña de la cuenta remotewpuser. Tras introducirla, y si todo funciona correctamente, verá el mensaje de MySQL. Verifique que la conexión utilice SSL con el siguiente comando:
statusSi la conexión realmente utiliza SSL, la línea SSL: lo indicará, como se muestra aquí:
Output
--------------
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper
Connection id: 52
Current database:
Current user: [email protected]
SSL: Cipher in use is DHE-RSA-AES256-SHA
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.18-0ubuntu0.16.04.1 (Ubuntu)
Protocol version: 10
Connection: 203.0.113.111 via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 3 hours 43 min 40 sec
Threads: 1 Questions: 1858 Slow queries: 0 Opens: 276 Flush tables: 1 Open tables: 184 Queries per second avg: 0.138
--------------Después de confirmar que puede conectarse de forma remota, continúe y salga del comando:
exitCon esto, ha verificado el acceso local y el acceso desde el servidor web, pero no ha verificado que se estén denegando otras conexiones. Para una mayor verificación, haga lo mismo desde un tercer servidor para el que no haya configurado una cuenta de usuario específica para asegurarse de que no se le esté concediendo acceso.
Tenga en cuenta que es posible que tenga que instalar las aplicaciones cliente MySQL como lo hizo anteriormente antes de ejecutar el siguiente comando para intentar conectarse:
mysql -u wordpressuser -h db_server_ip -pEsto no debería completarse correctamente y debería devolver un error similar a este:
Output
ERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL serverEsto es esperado, porque no ha creado un usuario MySQL que tenga permiso para conectarse desde este servidor, y también es deseado, porque desea estar seguro de que su servidor de base de datos evita que usuarios no autorizados accedan a su servidor MySQL.
Después de probar con éxito su conexión remota, puede proceder a instalar WordPress en su servidor web.
Paso 4 – Instalar WordPress
Para demostrarle las capacidades de su nuevo servidor MySQL con control remoto, le guiaremos paso a paso para instalar y configurar WordPress, el popular sistema de gestión de contenido, en su servidor web. Para ello, deberá descargar y extraer el software, configurar su información de conexión y, a continuación, ejecutarlo mediante el instalador web de WordPress.
En su servidor web, descargue la última versión de WordPress a su directorio raíz:
cd ~
curl -O https://wordpress.org/latest.tar.gzExtrae los archivos, lo que creará un directorio llamado wordpress en tu directorio raíz:
tar xzvf latest.tar.gz
WordPress incluye un archivo de configuración de ejemplo que usaremos como punto de partida. Haga una copia de este archivo, eliminando la "muestra" del nombre para que WordPress lo cargue:
cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.phpUna vez abierto el archivo, lo primero que deberá hacer es configurar algunas claves secretas para que su instalación sea más segura. WordPress proporciona un generador seguro para estos valores, así que no tendrá que generarlos usted mismo. Estos solo se usan internamente, por lo que tener valores complejos y seguros no perjudica la usabilidad.
Para obtener valores seguros del generador de claves secretas de WordPress, escriba:
curl -s https://api.wordpress.org/secret-key/1.1/salt/Esto imprimirá varias claves en la salida. Las añadirás al archivo wp-config.php al instante:
Output
define('AUTH_KEY', 'L4|2Yh(giOtMLHg3#] DO NOT COPY THESE VALUES %G00o|te^5YG@)');
define('SECURE_AUTH_KEY', 'DCs-k+MwB90/-E(=!/ DO NOT COPY THESE VALUES +WBzDq:7U[#Wn9');
define('LOGGED_IN_KEY', '*0kP!|VS.K=;#fPMlO DO NOT COPY THESE VALUES +&[%8xF*,18c @');
define('NONCE_KEY', 'fmFPF?UJi&(j-{8=$- DO NOT COPY THESE VALUES CCZ?Q+_~1ZU~;G');
define('AUTH_SALT', '@qA7f}2utTEFNdnbEa DO NOT COPY THESE VALUES t}Vw+8=K%20s=a');
define('SECURE_AUTH_SALT', '%BW6s+d:7K?-`C%zw4 DO NOT COPY THESE VALUES 70U}PO1ejW+7|8');
define('LOGGED_IN_SALT', '-l>F:-dbcWof%4kKmj DO NOT COPY THESE VALUES 8Ypslin3~d|wLD');
define('NONCE_SALT', '4J(<`4&&F (WiK9K#] DO NOT COPY THESE VALUES ^ZikS`es#Fo:V6');Copie la salida recibida a su portapapeles, luego abra el archivo de configuración en su editor de texto:
nano ~/wordpress/wp-config.phpBusca la sección que contiene los valores ficticios para esas configuraciones. Se verá así:
. . .
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
. . .Elimina esas líneas y pega los valores que copiaste de la línea de comando.
A continuación, introduzca la información de conexión de su base de datos remota. Estas líneas de configuración se encuentran al principio del archivo, justo encima de donde pegó las claves. Recuerde usar la misma dirección IP que utilizó anteriormente en la prueba de la base de datos remota:
. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'remotewpuser');
/** MySQL database password */
define('DB_PASSWORD', 'password');
/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .Y finalmente, en cualquier parte del archivo, agregue la siguiente línea que le indica a WordPress que use una conexión SSL a nuestra base de datos MySQL:
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
Guarde y cierre el archivo.
A continuación, copie los archivos y directorios de su directorio ~/wordpress a la raíz de documentos de Nginx. Tenga en cuenta que este comando incluye el parámetro -a para garantizar la transferencia de todos los permisos existentes:
sudo cp -a ~/wordpress/* /var/www/html
Después de esto, solo necesita cambiar la propiedad del archivo. Cambie la propiedad de todos los archivos en la raíz del documento a www-data, el usuario predeterminado del servidor web de Ubuntu.
sudo chown -R www-data:www-data /var/www/htmlCon esto, WordPress está instalado y estás listo para ejecutarlo a través del procedimiento de configuración basado en web.
Paso 5: Configuración de WordPress a través de la interfaz web
WordPress cuenta con un proceso de configuración web. A medida que lo vas completando, te hará algunas preguntas e instalará todas las tablas necesarias en tu base de datos. Aquí te guiaremos por los pasos básicos para configurar WordPress, que puedes usar como punto de partida para crear tu propio sitio web personalizado con una base de datos remota.
Vaya al nombre de dominio (o dirección IP pública) asociado con su servidor web:
http://example.comVerá una página de selección de idioma para el instalador de WordPress. Seleccione el idioma adecuado y haga clic en la página principal de instalación:
Una vez que haya enviado su información, deberá iniciar sesión en la interfaz de administración de WordPress con la cuenta que creó. Accederá a un panel de control donde podrá personalizar su nuevo sitio de WordPress.
Resultado
Al seguir este tutorial, habrá configurado una base de datos MySQL para aceptar conexiones con seguridad SSL desde una instalación remota de WordPress. Los comandos y técnicas utilizados en esta guía son aplicables a cualquier aplicación web escrita en cualquier lenguaje de programación, pero los detalles específicos de implementación variarán. Consulte la documentación de la base de datos de su aplicación o lenguaje para obtener más información.










