¿Pasos para optimizar WordPress en relación con la carga del servidor?

78

Además de instalar W3 Total Cache u otro complemento de almacenamiento en caché, qué pasos puedo seguir para asegurarme de que mi tema y mi sitio se ejecuten lo más rápido posible.

    
pregunta Paul Sheldrake 12.08.2010 - 12:24

14 respuestas

30

Podrías instalar WordPress en Nginx. Hay una serie de recursos para ayudar:

Alguna información sobre el rendimiento del último enlace (que parece ser una configuración un poco diferente a las demás):

  

Así que decidí poner un proxy delante   de wordpress a caché estática tanto   como sea posible. TODO no autenticado   el tráfico se sirve directamente desde el   caché de archivos nginx, tomando algunas solicitudes   (como la generación de RSS feed) desde 6   páginas / segundo a 7000+ páginas / segundo.   Oof Nginx también maneja el registro y   gzipping, dejando el backend más pesado   apaches para hacer lo que mejor saben hacer: servir   páginas dinámicas de wordpress solo cuando   necesario.

     

...

     

En nginx - es tan eficiente que   de miedo. Nunca lo he visto usar más   de 10 a 15 megas de RAM y un blip   CPU, incluso bajo nuestra carga más pesada. Nuestro   Los gráficos de ganglios no mienten: nos hemos reducido a la mitad.   nuestros requisitos de memoria, duplicaron nuestra   rendimiento de la red saliente y   Nivelado completamente nuestra carga. Nosotros   han tenido básicamente ningún problema desde   Nosotros configuramos esto.

    
respondido por el Travis Northcutt 18.08.2010 - 16:35
25

Establezca los vencimientos del lado del cliente para cosas como css, imágenes, JavaScript, etc., que no es necesario volver a descargar para cada vista de página. Esto, con diferencia, hizo la mayor diferencia en los tiempos de carga de mi sitio. La descarga más rápida es la descarga que nunca ocurrió ...

# BEGIN Expire headers
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 7200 seconds"
  ExpiresByType image/x-icon "access plus 2592000 seconds"
  ExpiresByType image/jpeg "access plus 2592000 seconds"
  ExpiresByType image/png "access plus 2592000 seconds"
  ExpiresByType image/gif "access plus 2592000 seconds"
  ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
  ExpiresByType text/css "access plus 2592000 seconds"
  ExpiresByType text/javascript "access plus 2592000 seconds"
  ExpiresByType application/x-javascript "access plus 2592000 seconds"
  ExpiresByType text/html "access plus 7200 seconds"
  ExpiresByType application/xhtml+xml "access plus 7200 seconds"
</IfModule>
# END Expire headers

# BEGIN Cache-Control Headers
<IfModule mod_headers.c>
  <FilesMatch "\.(ico|jpe?g|png|gif|swf|gz)$">
    Header set Cache-Control "max-age=2592000, public"
  </FilesMatch>
  <FilesMatch "\.(css)$">
    Header set Cache-Control "max-age=2592000, public"
  </FilesMatch>
  <FilesMatch "\.(js)$">
    Header set Cache-Control "max-age=2592000, private"
  </FilesMatch>
<filesMatch "\.(html|htm)$">
Header set Cache-Control "max-age=7200, public"
</filesMatch>
# Disable caching for scripts and other dynamic files
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
</IfModule>
# END Cache-Control Headers

Puedes pre-gzip todo lo que razonablemente puedas (7-zip es una buena herramienta para esto) & cárguelo en el mismo lugar que el archivo que acaba de descargar. Cambie .htaccess para servir los archivos pre-gzipped, como se muestra a continuación. La advertencia aquí es que debes recordar volver a gzip si / cuando actualizas las cosas. Esto elimina la sobrecarga de la CPU, además de analizar .htaccess.

RewriteEngine on
#Check to see if browser can accept gzip files. If so and we have it - serve it!
ReWriteCond %{HTTP:accept-encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
#make sure there's no trailing .gz on the url
ReWriteCond %{REQUEST_FILENAME} !^.+\.gz$
#check to see if a .gz version of the file exists.
RewriteCond %{REQUEST_FILENAME}.gz -f
#All conditions met so add .gz to URL filename (invisibly)
RewriteRule ^(.+) $1.gz [QSA,L]

Esto es solo una respuesta cruda. Hay muchas variaciones sobre este tema. Hice un blog sobre esto y agregué bastantes referencias a artículos más detallados en enlace . Lea eso y, lo que es más importante, las referencias a las que señalo, son buenos recursos.

Tenga en cuenta que si hace pequeños retoques, los usuarios deberán actualizar su caché.

Un complemento que también me pareció muy útil es wp-minify . Lo que hay que ver con este es que debe excluir los elementos específicos de la página (formulario de contacto, control deslizante de la página frontal, etc.) para que no esté volviendo a descargar todo el conjunto de css, JS, etc. para cada página. Es una buena manera de minimizar, combinar y amp; comprime tu línea de base CSS, JS, etc. Reduce mucho las solicitudes de http. Wp-minify juega bien con Supercache y también con encabezados de caducidad que detallé arriba.

Use Yslow en Firebug (Firefox) o similar para monitorear sus solicitudes http y lo que está y no está comprimido. Echa un vistazo a los encabezados de caducidad allí también. Pronto verás lo que puedes mejorar.

    
respondido por el CAD bloke 14.08.2010 - 04:19
21

Minimice la cantidad de complementos que ejecuta solo para lo que realmente necesita. Especialmente, tenga en cuenta los complementos que agregan javascript y código CSS en cada carga de página, incluso cuando ese código no se usa en la página.

Si está creando su propio tema desde cero, divida su CSS para que las funciones que solo se necesitan para plantillas de página o tipos de vista particulares (publicación única, archivos, categoría, etc.) solo se carguen cuando sea necesario.

Configure W3TC para usar un CDN (como Amazon CloudFront, o cualquiera de los otros compatibles con W3TC).

Comprueba si las opciones de Minify funcionan para ti (algunos complementos generan js / css que no se minimizarán bien, así que asegúrate de probar tu sitio después de activar la función de minify).

Si tiene el control total de su servidor MySQL, asegúrese de que tiene activado el query_cache. Use un secuencia de comandos de optimización de MySQL para encontrar otras formas de optimizar la configuración de su base de datos.

Si usar un CDN es problemático por alguna razón, configure mod_expires en su configuración de apache. Establezca los tiempos de expiración siempre que sean razonables para tipos estáticos como imágenes, css, javascript, video, audio, etc.

    
respondido por el Dougal Campbell 12.08.2010 - 14:57
13

Ejecute memcached y use un caché de objetos para reducir el número de consultas de base de datos. Esto almacena en caché los datos de la base de datos, en lugar de páginas. No estoy seguro de si w3-total-cache ya lo hace.

Asegúrese de que está ejecutando un caché de código de operación como APC . (Hay varios más disponibles).

    
respondido por el Annika Backstrom 12.08.2010 - 12:44
8

Además de usar un complemento de almacenamiento en caché de disco como wp-cache, ponga su blog en un volumen de host que tenga configurada la propiedad "noatime". De lo contrario, SSH en su host (si su proveedor de alojamiento web lo proporciona) y ejecute este comando en sus archivos de forma rutinaria cada pocos días:

chattr -R +A ~/*

El ~ / * significa "mis archivos en mi directorio de inicio". Puedes cambiar ese camino como mejor te parezca. También puede configurar esto en un trabajo cron en cpanel si su servidor web lo proporciona.

Para obtener más información sobre la propiedad atime, consulte esto . Acelera en gran medida el rendimiento de lectura del disco de Linux.

A veces, su sitio está siendo golpeado por arañas. Puedes usar una herramienta como SpyderSpanker o Chennai Central para filtrar las arañas que no ayudan a obtener más rango de páginas en tu sitio y simplemente reducir la velocidad, y luego estrangular a las buenas arañas (como Google, Bing, etc.) enviándolas al azar HTTP 304 Mensajes no modificados.

Otra cosa que veo son simplemente complementos mal escritos. Si aprendes a hacer complementos, comienzas a ver cómo algunos complementos están codificados de manera ineficiente, o incluso encuentras bombas de tiempo, como una tabla de base de datos que se llena y rellena y nunca se elimina, almacenando cosas como datos de conexión entrantes.

Más allá de todas las otras soluciones aquí, también puede crear una granja de servidores web de WordPress de su blog alojándolo en varios PC de nodo web que se conectan a una única base de datos y un solo volumen de disco para los archivos (como un volumen). montado sobre NFS). Visite Ultra Monkey para saber cómo hacer que todo funcione.

    
respondido por el Volomike 18.08.2010 - 22:02
7

Algunas respuestas de la parte superior de mi cabeza:

1) Minimice la cantidad de solicitudes HTTP que el navegador debe realizar a su host mediante la concatenación de JavaScript y CSS cuando sea posible / práctico.

2) Descargue la mayor cantidad de imágenes / medios que se sirvan a CDN de terceros como sea posible, especialmente si está usando alojamiento compartido.

3) Intenta reducir la cantidad de publicaciones que estás mostrando en la página principal para reducir el tiempo total de reproducción.

3a) Trate de usar un tema que presente algunas de las publicaciones destacadas en la página principal y todas las otras publicaciones anteriores como extractos.

    
respondido por el ZaMoose 18.08.2010 - 22:51
6

El almacenamiento en caché del menú de WordPress también le proporciona un aumento de rendimiento. Especialmente si tienes muchas Páginas o una Estructura de Menú gigante, esto debería ser considerado.

Hazlo en 2 sencillos pasos. Al principio, cree una función que obtenga o cree el menú, en lugar de llamar directamente a wp_nav_menu .

function get_cached_menu( $menuargs ) {

    if ( !isset( $menuargs['menu'] ) ) {

        $theme_locations = get_nav_menu_locations();
        $nav_menu_selected_id = $theme_locations[$menuargs['theme_location']];
        $termslug = get_term_by( 'id', $nav_menu_selected_id, 'nav_menu' );
        $transient = 'menu_' . $termslug->slug . '_transient';

    } else {

        $transient = 'menu_' . $menuargs['menu'] . '_transient';

    }


    if ( !get_transient( $transient ) ) { // check if the menu is already cached

        $menuargs['echo'] = '0'; // set the output to return
        $this_menu = wp_nav_menu( $menuargs ); // build the menu with the given $menuargs
        echo $this_menu; // output the menu for this run
        set_transient( $transient, $this_menu ); // set the transient, where the build HTML is saved

    } else {

        echo get_transient( $transient ); // just output the cached version

    }

}

En tu tema, reemplaza wp_nav_menu s con get_cached_menu . Ahora, cada vez que se llama al menú, tiene una consulta de base de datos en lugar de toda la construcción de menú.

Los menús no cambian a menudo, pero también tienes que enlazar con la acción wp_update_nav_menu para eliminar los transitorios antiguos.

Hazlo así:

add_action('wp_update_nav_menu', 'my_delete_menu_transients');

function my_delete_menu_transients($nav_menu_selected_id) {

    $termslug = get_term_by( 'id', $nav_menu_selected_id, 'nav_menu' );

    $transient = 'menu_' . $termslug->slug . '_transient';

    delete_transient( $transient ); 

}

El menú se generará la próxima vez que se llame la página, y use la versión en caché hasta que alguien actualice el menú nuevamente.

Versión actualizada

Gracias @helgatheviking por señalar un error entre las babosas y las identificaciones. Actualicé las funciones para que funcione con theme_position y menu (para una llamada directa del menú).

Los menús siempre se guardan con el nombre del Menú, no con la posición en el Tema.

    
respondido por el fischi 27.12.2012 - 10:59
5

Utilice una clase de base de datos que se recorte para la optimización. Hicimos buenas experiencias con nuestro propio código para reducir el uso de memoria y la velocidad de acceso a la base de datos. Además, puede optimizar la estructura de la base de datos mediante algunos pequeños cambios que también hacen mucho.

Parte del código de clase de la base de datos se puede encontrar en wordpress trac, no se convirtió en el núcleo ( Ticket # 11799 y relacionado ).

    
respondido por el hakre 18.08.2010 - 10:46
4

Para un sitio con mucho tráfico, debe ajustar todos los buffers de MySQL para el contenido que está en su lugar ahora. Independientemente de la versión de WordPress, the La capa MySQL puede tener su configuración calculada .

De hecho, si tiene datos InnoDB sin habilitar innodb_file_per_table, necesita limpiar InnoDB segmentando cada tabla en su propio espacio de tabla físico . Es posible hacer un ajuste decente de MySQL incluso si tiene un hardware limitado . Hay muchos escenarios para hacer tales optimizaciones InnoDB .

En mi humilde opinión, no puede planificar una buena configuración para my.cnf sin saber la cantidad de datos para configurar. Tendría que cargar periódicamente un conjunto de datos actual de producción en un entorno de prueba, realizar optimizaciones y obtener los números para configurar en el archivo my.cnf del servidor de producción.

    
respondido por el RolandoMySQLDBA 16.04.2011 - 00:09
3

podría habilitar la compresión de salida global . Esto hará que gzip todo salga automáticamente si el navegador lo admite. Esto reduce drásticamente el tamaño de los archivos transferidos, pero aumenta la carga de la CPU.

    
respondido por el Scott M. 12.08.2010 - 14:27
3

Hace poco hablé de este tema en WordCamp Houston . Todas las recomendaciones anteriores son excelentes y lo importante es asegurarse de que todo lo relacionado con la interfaz esté completamente optimizado para que pueda comenzar a trabajar en la caché y los problemas de rendimiento del servidor.

La representación progresiva hará que sus páginas se sientan más rápidas porque el usuario verá el contenido de la página antes de que se cargue por completo. Para hacer esto, asegúrese de que el bloqueo js esté en la parte inferior de la página y css esté en la parte superior.

Además, si usa muchos botones de redes sociales, puede personalizar los scripts para que se carguen en un iframe una vez que la página esté completamente cargada. Escribí un tutorial sobre cómo hacerlo con el botón de tweet TweetMeMe (ahora obsoleto desde que Twitter lanzó su propio botón de retweet), pero aún se puede aplicar a otros botones de compartir.

Para el rendimiento del servidor, vea Nginx como un proxy de front-end para contenido estático con Apache manejando el pesado levantamiento de PHP y MySQL.

    
respondido por el Chris_O 19.08.2010 - 08:42
2

Como nadie lo ha mencionado aún, uno de los pasos más importantes para mejorar el rendimiento del servidor junto con cualquier configuración de LAMP sería cambiar al subproceso de apache worker y a mod_fcgid.

Esto liberó 500 MB de memoria en mi servidor privado virtual.

    
respondido por el nottinhill 23.11.2010 - 02:21
1

Guía para comprobar que el complemento está lento

Hay un complemento maravillosamente simple llamado Tiempo de carga de la página , que agrega temporizador a su pie de página. En realidad son solo cuatro líneas de código:

<?php
function ur_pageload_footer() {
    printf(__('Page in %s seconds', 'pageload'), timer_stop());
}
add_action('wp_footer', 'ur_pageload_footer')

Entonces:

  1. Crear una hoja de cálculo
  2. Enumere todos sus complementos activos y colóquelos allí
  3. Actualice la página tres veces, anotando el tiempo de carga de la página en cada turno
  4. Ir a través de sus complementos uno por uno desactivándolos
  5. Repita el paso 3
  6. Tenga en cuenta el orden en que desactivó los complementos

Tu hoja de cálculo debería tener un aspecto similar a

+-------+-------+-------+-------+--------+
| Run 1 | Run 2 | Run 3 | Order | Plugin |

Entonces, si después de desactivar un complemento, el tiempo de respuesta de la página aumenta considerablemente, entonces puedes ver si puedes evitar ese complemento.

Encontré dos complementos que causaron una ralentización 'significativa' mqtranslate y (el más antiguo pero bueno) Complemento de navegación de múltiples niveles .

    
respondido por el icc97 21.10.2014 - 16:54
-1

Mantente dentro del complemento W3 Total Cache para la funcionalidad de almacenamiento en caché en WordPress. Habilite el almacenamiento en caché de la página y el almacenamiento en caché de la base de datos desde la página de configuración del complemento. Asegúrese de elegir 'Caché PHP alternativo (APC / APCu)' como mecanismo de almacenamiento en caché. NO habilite ninguna minificación en W3 Total Cache ya que hay muchas posibilidades de que rompa la apariencia y / o la funcionalidad de su sitio. Se lo dejamos a Cloudflare.

Una vez que haya terminado de configurar el resto de las funcionalidades del complemento, configure Cloudflare para su sitio web. Asegúrese de habilitar Cloudflare en la configuración de caché total de W3 también en "Extensiones".

Cloudflare es una red de entrega de contenido que almacena en caché todos los contenidos estáticos (archivos de imagen, CSS, JS, documentos, etc.) de su sitio y los entrega a sus visitantes desde sus servidores globales. Esto puede ayudar a acelerar los tiempos de carga de la página y reducir la carga en su servidor. Para obtener una lista de los tipos de archivos almacenados en caché por Cloudlfare checkout esta lista . Además, Cloudflare tiene un plan gratuito.

En Cloudflare, establezca el nivel de almacenamiento en caché en estándar y establezca la caducidad de la memoria caché del navegador en algo al menos superior a 20 horas. Habilite Always Online ™ para que incluso si su servidor falla, Cloudflare servirá las páginas estáticas de su sitio web desde su caché. También habilite la función de reducción automática de caracteres (¿recuerda por qué le pedí que no habilitara la minificación es W3 Total Cache? ¡Porque Cloudflare lo hace mejor!) Luego configure Rocket Loader ™ en automático.

Aquí hay un extracto de lo que hace Rocket Loader:

  • Disminuyendo el número de solicitudes de red al agrupar JavaScript Archivos, incluso recursos de terceros, para evitar ralentizar la página. representación.

  • Cargar scripts de forma asíncrona, incluidos scripts de terceros, por lo que
    que no bloqueen el contenido de tu página para que no se carguen
    inmediatamente.

  • Cachear scripts localmente (usando LocalStorage, disponible en la mayoría de los usuarios) navegadores y teléfonos inteligentes) para que no sean recuperados a menos que
    necesario.

Puede encontrar más información aquí .

Si es posible, cambia al marco de Genesis para WordPress porque están limpios sin ninguna . Génesis fue construido con velocidad y SEO en mente. Yo mismo lo he probado y mis puntuaciones de PageSpeed fueron buenas. Además, si está utilizando Genesis, no olvide habilitar la caché de fragmentos en la configuración de la caché total de W3.

Ya que ahora está usando Cloudlfare como CDN, puede usar un complemento como ' Imagify ' o ' Compress JPEG & Imágenes PNG 'de TingPNG para comprimir tus imágenes. Ambos son complementos gratuitos disponibles en el repositorio de complementos de WordPress.org. Además, Imagify admite el potente algoritmo de compresión con pérdida.

Finalmente, instale el complemento ' Eliminar cadenas de consulta de recursos estáticos ' desde el repositorio de WordPress para que elimine las cadenas de consulta de recursos estáticos como CSS & Archivos JS. Esto se debe a que los recursos con un "?" O "&" en la URL no están almacenados en la memoria caché por algunos servidores proxy de almacenamiento en caché (recuerde, Cloudflare también es un servidor proxy de almacenamiento en caché).

Luego instale el complemento ' Usar las bibliotecas de Google '. Este complemento le permite a su sitio de WordPress utilizar el CDN de la API de la Biblioteca AJAX de Google en lugar de servir estos archivos directamente desde su instalación de WordPress.

Algunos de los beneficios son:

  • Aumenta la posibilidad de que un usuario ya tenga estos archivos en caché.
  • Elimina la carga adicional de tu servidor.
  • Utiliza versiones comprimidas de las bibliotecas (cuando están disponibles).
  • Los servidores de Google están configurados para negociar la compresión HTTP con el solicitud de navegador.

Por último, pero no menos importante, use el complemento ' WP-Optimize ' de Ruhani Rabin para limpiar y optimizar su base de datos.

Espero que esto responda a su pregunta con respecto a la optimización de WordPress para reducir la carga del servidor.

    
respondido por el Antony Agnel 16.11.2016 - 12:17

Lea otras preguntas en las etiquetas