Acelerar WordPress: Conexión con la base de datos De socket TCP/IP a socket de archivo

Optimizar la conexión con la base de datos local en WordPress

Cuando la base de datos está en el mismo equipo que el servidor web, conviene utilizar un conector o socket Unix en lugar de una conexión TCP/IP. De este modo, se reducen algunos procesos del sistema operativo, como tareas de inicio de comunicaciones de red, espera a respuestas a cada dato enviado, el filtrado del firewall, etc., lo que aportará otra pizca de velocidad que siempre es bienvenida por los usuarios a la vez que útil para mejorar el SEO. En https://www.percona.com/blog/2020/04/13/need-to-connect-to-a-local-mysql-server-use-unix-domain-socket/ publicaron algunas pruebas comparativas que confirman la mejora.

Como además, es fácil, merece la pena dedicarle unos pocos minutos hacer el cambio cuando es posible.

¿Estoy usando conexión TCP?

La ventaja es tan lógica y simple que el módulo de PHP usado para conectar a MySQL trata de aplicarla directamente con valores por defecto. Las características y configuraciones particulares de cada sitio pueden fácilente dar al traste con el intento, generalmente por desconocimiento pues hay poca información al respecto.

La forma más fiable de saber si conectas mediante socket Unix o TCP es viendo la conexión establecida desde la base de datos si tienes acceso a ello. Una sentencia MySQL consultando los procesos como esta lo puede dejar claro:

SHOW FULL PROCESSLIST;

Si observamos en la columna Host, hay dos formatos posibles:

+--------+------------+---------------------+-------------+---------+------+----------+-----------------------+----------+
| Id     | User       | Host                | db          | Command | Time | State    | Info                  | Progress |
+--------+------------+---------------------+-------------+---------+------+----------+-----------------------+----------+
| 279554 | root       | 79.32.128.64:58382  | NULL        | Sleep   |    0 |          | NULL                  |    0.000 |
| 324868 | clientec4  | localhost           | phpbb3      | Sleep   |    4 |          | NULL                  |    0.000 |
| 324990 | clientec4  | localhost           | phpbb3      | Sleep   |    1 |          | NULL                  |    0.000 |
| 325219 | clientec4  | localhost           | phpbb3      | Sleep   |   18 |          | NULL                  |    0.000 |
| 325933 | apache2    | localhost           | bbdd        | Sleep   | 4306 |          | NULL                  |    0.000 |
| 326723 | clientec4  | localhost           | phpbb3      | Sleep   |   11 |          | NULL                  |    0.000 |
| 328232 | foro       | localhost           | foro        | Sleep   |   22 |          | NULL                  |    0.000 |
| 328664 | apache2    | localhost           | prueba      | Sleep   |  935 |          | NULL                  |    0.000 |
| 329247 | foro       | localhost           | foro        | Sleep   |    4 |          | NULL                  |    0.000 |
| 329256 | apache     | localhost           | bbdd        | Sleep   |  117 |          | NULL                  |    0.000 |
| 329264 | clientec4  | localhost           | phpbb3      | Sleep   |   11 |          | NULL                  |    0.000 |
| 329320 | apache2    | localhost           | prueba      | Sleep   |    2 |          | NULL                  |    0.000 |
| 329321 | panel      | localhost           | dbpanel     | Sleep   |    2 |          | NULL                  |    0.000 |
| 329324 | usuaria    | localhost           | usbbdd      | Sleep   |    0 |          | NULL                  |    0.000 |
| 329325 | root       | localhost:44870     | NULL        | Query   |    0 | starting | SHOW FULL PROCESSLIST |    0.000 |
+--------+------------+---------------------+-------------+---------+------+----------+-----------------------+----------+

El caracter dos puntos (:) separa el nombre de servidor o IP del puerto de comunicaciones si lo hay. Mientras unas conexiones tienen indicación de servidor y puerto, otras carecen del puerto. Si hay un puerto indicado, la conexión es TCP, si no lo hay es mediante socket Unix (o named pipe en Windows). En el ejemplo mostrado:

  • 79.32.128.64:58382 es una conexión mediante socket TCP.
  • localhost es una conexión mediante socket Unix.
  • localhost:44870 es una conexión mediante socket TCP.

Las conexiones que indican IP son externas y por tanto solo pueden realizarse mediante TCP. Las que indican localhost son claramente locales y tienen las dos posibilidades. Por el usuario (User) y la base de datos (db) deberíamos poder identificar la que queremos comprobar. Si no aparece, hay que ir reintentando la ejecución de la sentencia hasta pillar un momento en que se use y aparezca.

¿Y si no tengo acceso a esos datos?

Hay pistas que pueden indicar lo que está sucediendo. Observar cómo está configurada la conexión en la configuración de WordPress es lo más claro.

La línea que configura el modo de conexión es la que define el valor de DB_HOST.

La más estándar es así y deja en manos del módulo mysqli la decisión. Si este sabe dóde está el socket, lo usará, si no lo sabe, dejará que otras capas lo decidan y puede terminar usando una conexión TCP:

define( 'DB_HOST', 'localhost' );

Cualquier conexión indicando una dirección IP, incluyendo la 127.0.0.1, un nombre de dominio o indicando puerto, hará que se conecte mediante TCP. Algunos ejemplos serían:

define( 'DB_HOST', 'localhost:3306' );
define( 'DB_HOST', 'servidor.com' );
define( 'DB_HOST', '128.6.32.16' );
define( 'DB_HOST', '128.6.32.16:3306' );
define( 'DB_HOST', '127.0.0.1' );

Si el servidor es externo, reconocible por usar una IP que no es local o un nombe de dominio que no resuelve al mismo servidor, no hay opciones, hay que seguir usando la conexión mediante TCP.

Si el servidor es local y la configuración está forzando el uso de TCP o no se ha podido determinar de otro modo si usa TCP o socket Unix, es cuando conviene el cambio para mejorar.

Localizar el socket

Para aplicar el cambio a conexión mediante socket Unix, en primer lugar, localizamos la ruta del socket de MySQL/MariaDB en su archivo de configuración. Probablemente esto ayude:

grep socket /etc/mysql/*.cnf

Lo que se busca es algo parecido a esto:

socket = /run/mysqld/mysqld.sock

También es posible buscar directamente la existencia del socket en directorios como /run/mysqld/ o /var/run/mysqld/, /tmp/mysql/ o /var/lib/mysql/.

Aplicar el uso del socket

Una vez localizado el archivo socket, supongamos como ejemplo que es /run/mysqld/mysqld.sock, en el archivo de configuración de WordPress wp-config.php, remplazamos la indicación del servidor de bases de datos, generalmente algo así como:

define( 'DB_HOST', 'localhost' );

o

define( 'DB_HOST', '127.0.0.1' );

por:

define( 'DB_HOST', 'localhost:/run/mysqld/mysqld.sock' );

La indicación de localhost suele considerarse por defecto y por ello ser omisible, lo que no hay que olvidar en todo caso son los dos puntos delante de la ruta del socket, aunque no empiece indicando localhost. En este caso no es numérico y no lo confundirá con un puerto TCP, esto lo gestiona el código de WordPress.

Alternativamente, podemos emplear WP-CLI y hacer el cambio con un comando al estilo de:

wp config set DB_HOST ":/run/mysqld/mysqld.sock"

Una vez cambiado, solo queda comprobar que WordPress sigue funcionando.


Publicado

en

por

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos
Responsable Carlos González-Román Ferrer +info…
Finalidad Gestionar y moderar tus comentarios. +info…
Legitimación Consentimiento del interesado. +info…
Destinatarios Automattic Inc., EEUU para filtrar el spam. +info…
Derechos Acceder, rectificar y cancelar los datos, así como otros derechos. +info…
Información adicional Puedes consultar la información adicional y detallada sobre protección de datos en nuestra página de política de privacidad.