Introducción
A medida que tu aplicación o sitio web crece, puede llegar un punto en el que hayas superado la configuración de servidor actual. Si estás alojando tu servidor web y la base de datos en la misma máquina, puede ser una buena idea separar estas dos funciones para que cada una pueda operar en su propio hardware y compartir la carga de responder a las solicitudes de tus visitantes.
En esta guía, configurarás un servidor de base de datos MySQL remoto al que tu aplicación web pueda conectarse. Se utiliza WordPress como ejemplo para tener algo con lo que trabajar, pero la técnica es ampliamente aplicable a cualquier aplicación respaldada por MySQL.
Requisitos previos
Antes de comenzar este tutorial, necesitarás:
- Dos servidores Ubuntu 20.04. Cada uno debe tener un usuario no root con privilegios sudo y el firewall UFW habilitado, como se describe en nuestro tutorial Configuración inicial del servidor con Ubuntu 20.04. Uno de estos servidores alojará su backend de MySQL, y será referido como el servidor de base de datos a lo largo de esta guía. El otro se conectará a su servidor de base de datos de forma remota y actuará como su servidor web; del mismo modo, será referido como el servidor web a lo largo de esta guía.
- En su servidor de base de datos: MySQL instalado. Siga Cómo instalar MySQL en Ubuntu 20.04 para configurarlo.
- En tu servidor web: Nginx y PHP instalados. Nuestro tutorial Cómo instalar Linux, Nginx, MySQL, PHP (pila LEMP) en Ubuntu 20.04 te guiará a través del proceso, pero ten en cuenta que debes omitir el Paso 2 de este tutorial, que se centra en la instalación de MySQL, ya que instalarás MySQL en tu servidor de base de datos.
- De forma opcional (pero muy recomendada), certificados TLS/SSL de Let’s Encrypt instalados en tu servidor web. Necesitarás comprar un nombre de dominio y tener registros DNS configurados para tu servidor, pero los certificados en sí son gratuitos. Nuestra guía Cómo asegurar Nginx con Let’s Encrypt en Ubuntu 20.04 te mostrará cómo obtener estos certificados.
Paso 1 — Configuración de MySQL para Escuchar Conexiones Remotas en el Servidor de la Base de Datos
Tener los datos almacenados en un servidor separado es una buena manera de expandirse de manera elegante después de alcanzar el límite de rendimiento de una configuración de una sola máquina. También proporciona la estructura básica necesaria para equilibrar la carga y expandir su infraestructura aún más en un momento posterior. Después de instalar MySQL siguiendo el tutorial previo, deberá cambiar algunos valores de configuración para permitir conexiones desde otras computadoras.
La mayoría de los cambios de configuración del servidor MySQL se pueden realizar en el archivo mysqld.cnf
, que se encuentra almacenado en el directorio /etc/mysql/mysql.conf.d/
de manera predeterminada. Abra este archivo en su servidor de base de datos con privilegios de root en su editor preferido. Este ejemplo utiliza nano
:
Este archivo está dividido en secciones que están indicadas por etiquetas entre corchetes ([
y ]
). Encuentre la sección etiquetada como mysqld
:
. . .
[mysqld]
. . .
Dentro de esta sección, busque un parámetro llamado bind-address
. Esto indica al software de la base de datos en qué dirección de red escuchar conexiones.
Por defecto, esto está establecido en 127.0.0.1
, lo que significa que MySQL está configurado para buscar solo conexiones locales. Necesitas cambiar esto para hacer referencia a una dirección IP externa donde tu servidor pueda ser alcanzado.
Si ambos de tus servidores están en un centro de datos con capacidades de red privada, usa la dirección IP de red privada de tu servidor de base de datos. De lo contrario, puedes usar su dirección IP pública:
[mysqld]
. . .
bind-address = db_server_ip
Debido a que te conectarás a tu base de datos a través de Internet, se recomienda que requieras conexiones cifradas para mantener seguros tus datos. Si no cifras tu conexión MySQL, cualquiera en la red podría husmear información sensible entre tus servidores web y de base de datos. Para cifrar las conexiones de MySQL, agrega la siguiente línea después de la línea de bind-address
que acabas de actualizar:
[mysqld]
. . .
require_secure_transport = on
. . .
Guarda y cierra el archivo cuando hayas terminado. Si estás utilizando nano
, haz esto presionando CTRL + X
, Y
, y luego ENTER
.
Para que las conexiones SSL funcionen, deberás crear algunas claves y certificados. MySQL viene con un comando que configurará automáticamente estos archivos. Ejecuta el siguiente comando, que crea los archivos necesarios. También los hace legibles para el servidor MySQL especificando el UID del usuario mysql:
Para forzar a MySQL a actualizar su configuración y leer la nueva información SSL, reinicia la base de datos:
Para confirmar que el servidor ahora está escuchando en la interfaz externa, ejecuta el siguiente comando ss
:
Outputtcp LISTEN 0 70 127.0.0.1:33060 0.0.0.0:* users:(("mysqld",pid=4053,fd=22))
tcp LISTEN 0 151 db_server_ip:3306 0.0.0.0:* users:(("mysqld",pid=4053,fd=24))
El comando ss
muestra estadísticas sobre el sistema de redes de su servidor. Esta salida muestra que hay un proceso llamado mysqld
conectado a la db_server_ip
en el puerto 3306
, el puerto estándar de MySQL, confirmando que el servidor está escuchando en la interfaz apropiada.
A continuación, abra ese puerto en el firewall para permitir el tráfico:
Esos son todos los cambios de configuración que necesita hacer en MySQL. A continuación, configurará una base de datos y algunos perfiles de usuario, uno de los cuales utilizará para acceder al servidor de forma remota.
Paso 2 — Configurar una base de datos de WordPress y credenciales remotas en el servidor de base de datos
Aunque MySQL mismo ahora está escuchando en una dirección IP externa, actualmente no hay usuarios o bases de datos habilitados para acceso remoto configurados. Cree una base de datos para WordPress y un par de usuarios que puedan acceder a ella.
Comience conectándose a MySQL como el usuario root de MySQL:
Nota: Si tiene habilitada la autenticación de contraseña, como se describe en el Paso 3 del tutorial previo de MySQL, en su lugar deberá usar el siguiente comando para acceder al shell de MySQL:
Después de ejecutar este comando, se te pedirá la contraseña de root de MySQL y, después de ingresarla, se te mostrará un nuevo indicador mysql>
.
Desde el indicador de MySQL, crea una base de datos que WordPress utilizará. Puede ser útil darle a esta base de datos un nombre reconocible para que puedas identificarla fácilmente más adelante. Aquí, se llama wordpress
:
Ahora que has creado tu base de datos, a continuación, necesitas crear un par de usuarios. Crea un usuario solo para conexiones locales y otro usuario remoto vinculado a la dirección IP del servidor web.
Primero, crea tu usuario local, local_db_user, y haz que esta cuenta solo coincida con intentos de conexión locales utilizando localhost en la declaración:
Luego, otorga a esta cuenta acceso completo a la base de datos wordpress
:
Este usuario ahora puede realizar cualquier operación en la base de datos de WordPress, pero esta cuenta no se puede usar de forma remota, ya que solo coincide con conexiones desde la máquina local. Con esto en mente, crea una cuenta complementaria que coincida exclusivamente con conexiones desde tu servidor web. Para ello, necesitarás la dirección IP de tu servidor web.
Por favor, ten en cuenta que debes utilizar una dirección IP que utilice la misma red que configuraste en tu archivo mysqld.cnf
. Esto significa que si especificaste una dirección IP de red privada en el archivo mysqld.cnf
, deberás incluir la IP privada de tu servidor web en los siguientes dos comandos. Si configuraste MySQL para utilizar internet público, deberías coincidir con la IP pública del servidor web.
Después de crear tu cuenta remota, otórgale los mismos privilegios que a tu usuario local:
Por último, actualiza los privilegios para que MySQL comience a usarlos:
Luego, sal del prompt de MySQL escribiendo:
Ahora que has configurado una nueva base de datos y un usuario habilitado para acceso remoto, puedes pasar a probar si puedes conectarte a la base de datos desde tu servidor web.
Paso 3 — Probando Conexiones Remotas y Locales
Antes de continuar, es mejor verificar que puedes conectarte a tu base de datos tanto desde la máquina local — tu servidor de base de datos — como desde tu servidor web.
Primero, prueba la conexión local desde tu servidor de base de datos intentando iniciar sesión con tu nueva cuenta:
Cuando se te solicite, ingresa la contraseña que configuraste para esta cuenta.
Si se te muestra un prompt de MySQL, entonces la conexión local fue exitosa. Puedes salir nuevamente escribiendo:
A continuación, inicia sesión en tu servidor web para probar las conexiones remotas:
Necesitarás instalar algunas herramientas cliente para MySQL en tu servidor web para poder acceder a la base de datos remota. Primero, actualiza la caché de paquetes local si no lo has hecho recientemente:
Luego, instala las utilidades cliente de MySQL:
Después de esto, conéctate a tu servidor de base de datos utilizando la siguiente sintaxis:
Una vez más, asegúrese de estar utilizando la dirección IP correcta para el servidor de base de datos. Si configuró MySQL para escuchar en la 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 pedirá la contraseña de su cuenta remote_user. Después de ingresarla, y si todo funciona como se espera, se le llevará al prompt de MySQL. Verifique que la conexión esté utilizando SSL con el siguiente comando:
Si la conexión está utilizando SSL, la línea SSL:
lo indicará, como se muestra aquí:
Output--------------
mysql Ver 8.0.29-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))
Connection id: 14
Current database:
Current user: remote_user@web_server_ip
SSL: Cipher in use is TLS_AES_256_GCM_SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.29-0ubuntu0.20.04.2 (Ubuntu)
Protocol version: 10
Connection: db_server_ip via TCP/IP
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
TCP port: 3306
Binary data as: Hexadecimal
Uptime: 1 hour 8 min 28 sec
Threads: 2 Questions: 69 Slow queries: 0 Opens: 206 Flush tables: 3 Open tables: 125 Queries per second avg: 0.016
--------------
Después de verificar que puede conectarse de forma remota, salga del prompt:
Ha verificado el acceso local y el acceso desde el servidor web, pero no ha verificado que se rechacen otras conexiones. Para una comprobación adicional, intente hacer lo mismo desde un tercer servidor para el cual no haya configurado una cuenta de usuario específica para asegurarse de que a este otro servidor no se le conceda acceso.
Tenga en cuenta que antes de ejecutar el siguiente comando para intentar la conexión, es posible que deba instalar las utilidades de cliente de MySQL como hizo anteriormente:
Esto no debería completarse correctamente y debería devolver un error similar a este:
OutputERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL server
Esto es esperado, ya que no ha creado un usuario de MySQL que esté autorizado para conectarse desde este servidor, y también deseado, ya que desea asegurarse de que su servidor de bases de datos deniegue el acceso a usuarios no autorizados a su servidor de MySQL.
Después de probar con éxito su conexión remota, puede proceder a instalar WordPress en su servidor web.
Paso 4 — Preparación del servidor web para la instalación de WordPress
Si has seguido los tutoriales previos, deberías tener tanto Nginx como PHP instalados. WordPress, y muchos de sus complementos, aprovechan muchas extensiones adicionales de PHP. Antes de instalar WordPress en tu servidor web, prepara tu servidor instalando algunas de estas extensiones de PHP para su uso con WordPress:
Nota: Cada complemento de WordPress tiene su propio conjunto de requisitos. Algunos pueden requerir la instalación de paquetes adicionales de extensiones de PHP. Consulta la documentación de tu complemento para descubrir sus requisitos de PHP. Si están disponibles, se pueden instalar con apt como en el ejemplo anterior.
Cuando hayas terminado de instalar las extensiones, reinicia el proceso PHP-FPM para que el procesador PHP en ejecución pueda aprovechar las funciones recién instaladas:
A continuación, realiza algunos ajustes en los archivos de bloque de servidor Nginx. Según los tutoriales previos, deberías tener un archivo de configuración para tu sitio en el directorio /etc/nginx/sites-available/
. También debería estar configurado para responder al nombre de dominio o dirección IP de tu servidor y protegido por un certificado TLS/SSL. /etc/nginx/sites-available/your_domain
se usa como un ejemplo de directorio aquí. Sustituye la ruta de tu archivo de configuración donde corresponda.
Además, /var/www/your_domain
se utilizará como el directorio raíz en esta instalación de ejemplo de WordPress. Nuevamente, use el directorio raíz especificado en su propia configuración.
Nota: Es posible que esté utilizando la configuración predeterminada /etc/nginx/sites-available/default
con /var/www/html
como su directorio raíz de documentos. Esto está bien si solo va a alojar un sitio web en este servidor. De lo contrario, es mejor dividir la configuración necesaria en fragmentos lógicos, un archivo por sitio.
Abra el archivo de bloque de servidor de su sitio con su editor preferido. Este ejemplo usa nano
:
Dentro de este bloque de servidor, agregue algunos bloques de ubicación. Comience creando bloques de ubicación de coincidencia exacta para solicitudes a /favicon.ico
y /robots.txt
, que no desea registrar solicitudes.
Hará esto utilizando una ubicación de expresión regular para que coincida con cualquier solicitud de archivos estáticos, desactive el registro para estas solicitudes y las marcará como altamente caché, ya que estos son recursos típicamente costosos de servir. Puede ajustar esta lista de archivos estáticos para contener cualquier otra extensión de archivo que su sitio pueda usar:
server {
server_name your_domain www.your_domain;
root /var/www/your_domain;
index index.html index.htm index.php;
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; allow all; }
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
. . .
}
Dentro del bloque de ubicación existente location /
, puede ajustar la lista de try_files
. Primero, comente la configuración predeterminada agregando un signo de almohadilla (#
) al principio de la primera línea. Luego, agregue las siguientes líneas:
server {
. . .
location / {
#try_files $uri $uri/ =404;
try_files $uri $uri/ /index.php$is_args$args;
}
. . .
}
Con esta nueva línea en su configuración, en lugar de devolver un error 404 como opción predeterminada, el control se pasa al archivo index.php
con los argumentos de la solicitud.
En conjunto, la parte superior de tu archivo debería ser similar a esto:
server {
server_name your_domain www.your_domain;
root /var/www/your_domain;
index index.html index.htm index.php;
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; allow all; }
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
location / {
# try_files $uri $uri/ =404;
try_files $uri $uri/ /index.php$is_args$args;
}
...
}
Cuando hayas terminado, guarda y cierra el archivo.
Verifica tu configuración en busca de errores de sintaxis escribiendo:
Si no se reportan errores, recarga Nginx escribiendo:
Después de preparar tu servidor web, ahora estás listo para instalar WordPress.
Paso 5: Instalando WordPress en el servidor web
Para demostrar las capacidades de tu nuevo servidor MySQL compatible con remoto, pasarás por el proceso de instalar y configurar WordPress — el popular sistema de gestión de contenidos — en tu servidor web. Con tu software de servidor configurado, puedes descargar WordPress. Por razones de seguridad, siempre es recomendable obtener la última versión de WordPress directamente desde el sitio web del proyecto.
Primero, cambia a un directorio escribible (se recomienda uno temporal como /tmp
):
Esto cambia tu directorio de trabajo al folder temporal. Luego, ingresa el siguiente comando para descargar la última versión de WordPress como un archivo comprimido:
Extrae el archivo comprimido para crear la estructura de directorios de WordPress:
Estos archivos los moverás a tu raíz de documentos en breve, pero antes de hacerlo, copia el archivo de configuración de ejemplo al nombre de archivo que lee WordPress:
Copia todo el contenido del directorio en la raíz del documento. La bandera -a
garantizará que se mantengan tus permisos, y un punto al final de tu directorio fuente para indicar que se debe copiar todo dentro del directorio (incluyendo archivos ocultos):
Con tus archivos en su lugar, asigna la propiedad al usuario y grupo www-data. Este es el usuario y grupo con el que Nginx se ejecuta, y Nginx necesitará poder leer y escribir archivos de WordPress para servir el sitio web y realizar actualizaciones automáticas:
Tus archivos de WordPress ahora están en la raíz del documento del servidor y tienen la propiedad correcta. Ahora estás listo para configurar WordPress.
Paso 6 — Configurar el Archivo de Configuración de WordPress
Cuando abras el archivo de configuración de WordPress, comenzarás ajustando algunas claves secretas para proporcionar seguridad a tu instalación. WordPress proporciona un generador seguro para estos valores para que no tengas que crearlos tú mismo. Estos solo se utilizan internamente, así que no afectará la usabilidad tener valores complejos y seguros aquí.
Para obtener valores seguros del generador de claves secretas de WordPress, escribe:
Recibirás valores únicos que se asemejan a la salida siguiente:
¡Advertencia! Es importante que solicites tus propios valores únicos cada vez. No copies los valores mostrados aquí.
Outputdefine('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');
Estas son líneas de configuración que puedes pegar directamente en tu archivo de configuración para establecer claves seguras. Copia la salida que recibiste ahora.
Abre el archivo de configuración de WordPress:
Encuentra la sección que contiene los valores de ejemplo para esas configuraciones:
. . .
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 desde la línea de comandos:
. . .
define('AUTH_KEY', 'VALUES COPIED FROM THE COMMAND LINE');
define('SECURE_AUTH_KEY', 'VALUES COPIED FROM THE COMMAND LINE');
define('LOGGED_IN_KEY', 'VALUES COPIED FROM THE COMMAND LINE');
define('NONCE_KEY', 'VALUES COPIED FROM THE COMMAND LINE');
define('AUTH_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
define('SECURE_AUTH_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
define('LOGGED_IN_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
define('NONCE_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
. . .
A continuación, modifica algunos de los ajustes de conexión a la base de datos al principio del archivo. Deberás ajustar el nombre de la base de datos, el usuario de la base de datos y la contraseña asociada que se configuró dentro de MySQL.
Ingresa la información de conexión para tu base de datos remota. Recuerda usar la misma dirección IP y credenciales que usaste en tu prueba de base de datos remota anterior:
. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'remote_user');
/** MySQL database password */
define('DB_PASSWORD', 'remote_user_password');
/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .
Y finalmente, después de la línea define( 'DB_COLLATE', '' );
, agrega esta línea resaltada que indica a WordPress que use una conexión SSL a tu base de datos MySQL:
...
define( 'DB_COLLATE', '' );
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
...
Guarda y cierra el archivo.
Con tu configuración establecida, WordPress está instalado y estás listo para ejecutar su rutina de configuración basada en la web.
Paso 7 — Configuración de WordPress a través de la Interfaz Web
WordPress tiene un proceso de configuración basado en la web. A medida que avanza, le hará algunas preguntas e instalará todas las tablas que necesita en su base de datos. Aquí, realizará los pasos iniciales para configurar WordPress, que puede utilizar como punto de partida para construir su propio sitio web personalizado que utilice una base de datos remota.
Diríjase al nombre de dominio (o dirección IP pública) asociado con su servidor web junto con un /wp-admin
al final:
http://your_domain.com/wp-admin
Se le pedirá que seleccione el idioma que desea utilizar:
A continuación, llegará a la página principal de configuración.
Seleccione un nombre para su sitio de WordPress y elija un nombre de usuario. Se recomienda elegir algo único y evitar nombres de usuario comunes como “admin” por motivos de seguridad. Se genera automáticamente una contraseña segura. Guarde esta contraseña o seleccione una alternativa segura.
Ingrese su dirección de correo electrónico y seleccione si desea desalentar a los motores de búsqueda de indexar su sitio:
Una vez que haya enviado su información, deberá iniciar sesión en la interfaz de administración de WordPress utilizando la cuenta que acaba de crear. Luego será llevado a un panel donde podrá personalizar su nuevo sitio de WordPress.
Conclusión
Siguiendo este tutorial, has configurado una base de datos MySQL para aceptar conexiones protegidas por 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 de implementación específicos serán diferentes. Consulta la documentación de tu aplicación o lenguaje de programación para obtener más información.