Encontrar al culpable del alto uso del procesador en nuestro servidor de WordPress

Hace unos días, recibimos un correo electrónico de nuestro proveedor de alojamiento (SiteGround) anunciando que nuestro sitio ya tenía “90% del uso mensual permitido” y que, una vez que superamos el 100%, “el servicio web sería limitado” y es posible tener “problemas para acceder a él”. Bastante aterrador, ¿verdad? Ciertamente era una situación totalmente no deseada que tuvimos que reparar lo antes posible. Pero … ¿por dónde empezar?

Estadísticas de nuestro sitio durante el episodio de alto uso del procesador.
Hoy queríamos compartir nuestra experiencia con un problema bastante común en los sitios web, explicando lo que hicimos para identificar al culpable y cómo resolvimos el problema. De esta manera, si está experimentando un problema similar, tendrá algunas ideas sobre cómo comenzar …
Las razones por las cuales puede tener un gran uso del procesador de WordPress es un sistema de gestión de contenido escrito en el PHP. Esto significa que el contenido que sirve es generado dinámicamente por un conjunto de scripts de PHP: cada vez que un visitante llega a su sitio web, WordPress procesa la solicitud (que es algo así como “Envíeme su página por inicio”) y genera una respuesta (En este caso, envíe la página de inicio). Claramente, la respuesta a una solicitud implica un cierto uso de los recursos del servidor: debe observar la solicitud en sí, para determinar a qué quiere acceder el visitante, para tomarlo de la base de datos, generar la respuesta HTML, etc.
Una de las razones por las cuales un sistema de caché acelera el tiempo de carga de su sitio debería ser bastante obvio ahora: prácticamente ahorra este tiempo de procesamiento. Cuando llega una determinada solicitud por primera vez (“Envíame tu página de inicio”), WordPress comienza y genera la respuesta. Si hay un caché, almacena la respuesta antes de que realmente se envíe al visitante. De esta manera, las solicitudes futuras al mismo recurso (en nuestro ejemplo, una página de inicio) ya no requieren que WordPress procese nada; La memoria de caché puede enviar la copia previamente guardada, ahorrando así el tiempo y los recursos. Al considerar este rendimiento, no es difícil imaginar cuáles son las razones por las que podemos ver un alto uso de la CPU en nuestro servidor:
Obtienes demasiadas solicitudes. Si muchos usuarios vienen a su sitio al mismo tiempo, o reciben muchas solicitudes ilegítimas (probablemente alguien ataca a su servidor), WordPress tendrá que procesar todas esas solicitudes y, por lo tanto, el uso de recursos del servidor aumentará.
Las solicitudes tardan en resolver. Si tiene muchos complementos instalados o algunos de ellos son ineficientes por cualquier motivo, todas las solicitudes que reciba llevará más tiempo de lo necesario, porque WordPress ejecutará mucho código ineficiente.
Entonces, parece que un caché es una buena protección contra estos problemas, ¿verdad? Y realmente lo es. Sin embargo, tenga en cuenta que la memoria de caché no “resuelve” el problema; Simplemente “ocultarlo”. Y esto es importante recordar porque hay características de WordPress que no se pueden almacenar en caché y, por lo tanto, siempre requerirán WordPress Run:
Tareas programadas utilizando WP-chron. WP-CRON es un mecanismo de WordPress para la programación de tareas que se ejecutarán en el futuro. Por ejemplo, WordPress lo usa para publicar publicaciones programadas. El resto de WordPress. REST API es una interfaz que puede usar de aplicaciones de terceros para interactuar con un sitio de WordPress enviando y recibiendo objetos JSON. Algunas solicitudes de API REST se pueden almacenar en caché (es decir, solicitudes de GET), pero otras no lo son (publicar y bueno). Por lo tanto, hay algo que generalmente no puede almacenar en caché …
AJAX SOLITS en WordPress. Antes de tener el resto en WordPress, tuvimos que usar la API AJAX para crear sitios web dinámicos. Esta API es bastante similar a la API REST, porque podemos usarla para enviar y recibir información del servidor. Es un sistema diferente, pero está sujeto a las mismas limitaciones que el resto.
Analizando el problema primero debemos identificar por qué el uso del procesador ha crecido en nuestro sitio web. ¿Ha aumentado el número de solicitudes a nuestro sitio? ¿Es ahora más lento satisfacer las solicitudes individuales? Para responder a estas preguntas, tenemos en nuestro servidor una herramienta muy útil: el diario de acceso.
El diario de acceso es un archivo de texto en el que el servidor registra cada solicitud que recibe con información útil sobre ellos. Específicamente, el diario de acceso nos dice cuándo se recibió una solicitud (fecha y hora), quién lo hizo (una IP), qué recurso solicitó (una URL), si la solicitud fue exitosa, etc. Aquí hay un ejemplo de nuestro servidor: 66.249.83.82-[22/abril/2020: 14: 04: 59 +0200] “Get/es/Blog/Imagenes-Gratuas-Pura-TU-Blog/HTTP/1.0” 200 22325 “-” “Mozilla/5.0 (Linux; Android 4.2.1; en-US; Nexus 5 Build/Jop40d) AppleWebkit/535.19 (KHTML, como gecko; Googlewoblight) Chrome/38.0.11025.166 móvil Safari/535.19” 66.249.83.84444444444444444444444444444444444444444444444 cada cada cada lugarían -[22/abril/2020: 14: 05: 02 +0200] “get/es/wp-content/uploads/sites/3/2018/07/Aziz-Charki-549137 Unsplash-540×350.jpg http/1.0” 200 10566 “https://neliosoftware.com/es/blog/imagenes-gratuas-para-tu-blog/” “Mozilla/5.0 (Linux; Android 4.2.1; en-u; Nexus 5 Build/Jop40d) AppleWebkit/ 535.19 (khtml, como gecko; googleweblight) Chrome/38.0.1025.166 Safari Mobile/535.19 “66.249.83.82 – – [22/abr/2020: 14: 05: 02 +0200]” get/wp -content/uploads/sites/sites/sites/ 3/2018/07/Captura de captación-of-unplah-Website-768×520.png http/1.0 “200 399577” https://neliosoftware.com/es/blog/imagenes-gratuitas-para-tu-blog/ “” mozilla//” 5.0 (Linux; Android 4.2.1; EN-US; Nexus 5 Build/JOP40D) AppleWebki T/535.19 (KHTML, como Gecko; GoogleWeblight) Chrome/38.0.1025.166 Safari Mobile/535.19 “… 188.79.17.218-[22/abril/2020: 14: 06: 14 +0200]” Get/es/Blog/Problemas-Mas-Comunes-De- de WordPress/http/1.0 “200 110741” https://www.google.com/ “” Mozilla/5.0 (Macintosh;
Intel Mac OS X 10_12_6) AppleWebkit/605.1.15 (khtml, como gecko) versión/12.1.2 Safari/605.1.15 “188.79.17.218 – – [22/abril/2020: 14: 06: 16 +0200]” Get /ES/WP-Content/Plugins/Nelio-Ab Testing/Assets/Dist/JS/Alternative-Loader.js? Version = 52B0FF65C68AB39896D47D6FF673FD59 HTTP/1.0 “200 2763″ https://neliosoftware.com/es/Blog/Problemas. -Mas-Communes-de -wordpress/”” Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebkit/605.1.15 (Khtml, como gecko) Versión/12.1.2 Safari/605.1.15 “188.79.17.218– — [22/abril/2020: 14: 06: 16 +0200] “get /es/wp-includes/css/dist/block-library/style.min.css ?ver=5.4 http/1.0” 200 7627 “https: //neliosoftware.com/es/blog/problemas-mas-comunes-de-wordpress/” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) Applewebkit/605.1.15 (khtml, como gecko) versión///// 12.1.2 Safari/605.1.15 “… Echemos un vistazo más de cerca: 66.249.83.82. Esta es la IP del dispositivo que realizó la solicitud.
22/abril/2020: 14: 04: 59 +0200. Esta es la fecha y hora de solicitud precisas.
Get/es/blog/Imagenes-Gratuitas-para-tu-blog/http/1.0. Luego vemos que el visitante preguntó (obtuvo) una publicación de nuestro blog (en español).
Mozilla/5.0 (Linux; Android … Este es el agente de usuario del navegador y nos brinda información sobre el dispositivo y el sistema operativo que realizó la solicitud.
Observe cómo nuestro servidor recibió varias solicitudes de la misma IP (66,249.83.82) después de la primera. Esto puede parecer un ataque, pero en realidad no es: las páginas web generalmente incluyen más elementos (imágenes, scripts, estilos) y es completamente normal para un visitante que accede a una determinada página del sitio web para realizar más solicitudes para recuperarlas todas. . Extremadamente alto, en realidad. Y sabía esto porque el archivo del diario era mucho más grande de lo habitual. Una posible explicación sería que hubo un pico de visitas por algunas razones … pero según Google Analytics, no fue el caso. Entonces sucedió algo diferente. Un análisis más detallado del diario de acceso nos permitió identificar el siguiente hecho: más del 15% de todas las solicitudes que recibimos de la misma IP. ¡Y (ejecutando tambor) esa IP era nuestro propio servidor web!
Identificando al culpable en este momento, finalmente supe que nuestro propio servidor era el que hizo tantas solicitudes que generó un pico en el uso de su procesador. ¿Pero por qué? ¿Por qué pasó esto? ¿Quién genera esas solicitudes? Estas son preguntas más difíciles de responder. Primero volvimos a ver nuestros diarios, filtrando después de IP e intentando identificar un modelo que podría arrojar un poco de luz sobre el problema en cuestión: 35.214.244.124 – – [22/abril/2020: 14: 08 + 0200] “Get/ es http/1.0 “301 -” https://neliosoftware.com/es “” php -requests/1.7-3470169 “35.214.244.124 – – [22/abr/2020: 06: 08 + 0200]” get/es? … “” Php -Requests/1.7-3470169 “35.214.244.124 – -[22/abril/2020: 14: 06: 18 +0200]” Get/es? … “” Php -Requests/1.7-3470169 “35.214.244.124-[22/abril/2020: 14: 07: 21 +0200]” Get/es? … “” Php-Requests/1.7-3470169 “35.214.244.124–[22/2020 : 14: 07: 24 +0200] “Get/es? …” “Php-Requests/1.7-3470169” … y encontré uno: agente de usuario de todas estas solicitudes anormales fue Php-Requests/1.7 -3470169. ¡Interesante!
WordPress tiene varias funciones para activar las solicitudes: WP_REMOTE_REQUEST.Si observa el código fuente de estas funciones, verá que prácticamente incluye algunos métodos en una clase llamado WP_HTTP.Esta clase es interesante porque, por defecto, todas las solicitudes que el agente de usuario se establece en “WordPress/Version”, por lo que era posible tener algo que ver con nuestro problema.Pero no … todavía.Si continuamos inspeccionando el código fuente de WordPress, vemos que WP_HTTP usa otra clase de WordPress en el interior para hacer las solicitudes: solicitudes.Y el niño es esta clase interesante: al comienzo de su definición, vemos que define una versión constante llamada cuyo valor es 1.7-3470169.Y un poco más tarde, use esta constante para construir el agente de usuario que encontramos en nuestras revistas: PHP-Requests/1.7-3470169.
¡Brillante! Ahora hemos confirmado que todas estas solicitudes extrañas que recibimos provienen de nuestro sitio web de WordPress. Esto probablemente significa que el culpable es un complemento … pero ¿cuál? La idea que tuvimos que darnos cuenta era bastante simple: si cambiamos el agente de usuario para incluir el nombre del complemento que usa la clase de solicitudes, veremos el nombre del complemento en el diario de acceso de nuestro servidor. Y esto es realmente bastante fácil de lograr. Todo lo que hicimos fue editar la función get_default_options en solicitudes con el siguiente fragmento: $ trace = debug_backtrace (); $ files = []; Foreach ($ trace como $ log) {if (false! == strpos ($ log [‘file’], ‘/wp-account/plugins/’) {$ files [] = $ log [‘file’]; }} if (vacía ($ archivos)) {$ debug = ‘no-plugin’; } else {$ plugins = array_map (function ($ x) {return preg_replace (‘/.*/wp-content/plugins/(bar^/font>+)/.*/’, ‘$ 1’, $ x);} , $ archivos); $ plugins = array_unique ($ plugins); $ debug = implode (”, $ complementos); } $ defaults [‘userAgent’]. = “(nelioDebug {$ debug})”; Veamos qué hace paso a paso: primero obtenemos la pila de ejecución con debug_backtrace. Esta es una función PHP que genera un retroceso, revelando todas las funciones que han sido llamadas para alcanzar la actual.

Para cada elemento de la pila de ejecución tenemos información, como la función que se invocó, el archivo y la línea en la que se define, los argumentos con los que se llamaba, etc. Sin embargo, en lo que queremos centrarnos, es un archivo en el que se ha definido la función: si está en contenido WP/complementos, sabemos con certeza que es una función definida en un complemento.

Una vez que procesamos todos los elementos en la pila, simplemente tenemos que obtener el nombre (si allí) de todos los complementos que encontramos e incluir en la variable de usuario 2020: 10: 59: 08 +0200] “Get/es http/1.0” 301-“https://neliosoftware.com/es” “Php -Requests/1.7-3470169 (NelioDebug Culprit)” 35.214.244.124-[[[[[[[[[[[[[[[[[[[[ 23/abril/2020: 10: 59: 20 +0200] “Get/? …” “Php -Requests/1.7-3470169 (NelioDebug Culprit)” 35.214.244.124 – – [23/abril/2020: 10: 59: 59 : 36 +0200] “Get/? …” “Php -Requests/1.7-3470169 (NelioDebug Culprit)” 35.214.244.124 – – [23/abr/2020: 11: 00: 01 +0200] “Get/es ? … “” Php -Requests/1.7-3470169 (NelioDebug Culprit) “35.214.244.124 – – [23/abril/2020: 11: 05: 21 +0200]” Get/es? … “” Php- Solicitudes /1.7-3470169 (NelioDebug Culprit) “… Resolviendo el problema Una vez que supe el nombre del complemento ofensivo, simplemente contacté a su desarrollador y Pedí ayuda. Respondieron y nos dijeron cómo superar el problema mientras trabajaba en una solución adecuada. Afortunadamente para nosotros, las cosas han mejorado rápidamente:
Estadísticas en nuestro sitio después de pedir ayuda.

Copyright statement: Unless otherwise noted, this article is Collected from the Internet, please keep the source of the article when reprinting.

Check Also

gkOVSBm5B8SgiXmo

Shopify vs WooCommerce – ¿Cuál es la mejor plataforma?(Comparación)

Shopify vs WooCommerce

Leave a Reply

Your email address will not be published. Required fields are marked *