it-swarm-es.com

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

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

80
Paul Sheldrake

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

Alguna información de rendimiento de ese último enlace (que parece ser una configuración un poco diferente a las otras):

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

...

En nginx - es tan eficiente que da miedo. Nunca lo he visto usar más de 10 a 15 megas de RAM y un parpadeo de CPU, incluso bajo nuestra carga más pesada. Nuestros gráficos de ganglios no mienten: redujimos a la mitad nuestros requisitos de memoria, duplicamos nuestro rendimiento de red saliente y nivelamos completamente nuestra carga. Básicamente no hemos tenido problemas desde que configuramos esto.

31
Travis Northcutt

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 sucedió ...

# 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) y subirlo en el mismo lugar que el archivo que acabas 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, aparte 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 sólo 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 http://icanhazdot.net/2010/03/23/some-wordpress-stuff/ . 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 encontré muy útil también 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. Es una buena manera de minimizar, combinar y comprimir su 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é anteriormente.

Utilice 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.

26
CAD bloke

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).

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

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

Si usar una CDN es problemático por alguna razón, configure mod_expires en su configuración de Apache. Establezca los tiempos de caducidad siempre que sea razonable para tipos estáticos como imágenes, css, javascript, video, audio, etc.

21
Dougal Campbell

Ejecute memcached y use un caché de objeto 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).

14
Annika Backstrom

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 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 proveedor de web lo proporciona.

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

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 es simplemente plugins mal escritos. Si aprendes a hacer complementos, empiezas 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.

Además de 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 sola base de datos y un solo volumen de disco para los archivos (como un volumen montado sobre NFS). ). Echa un vistazo a Ultra Monkey para saber cómo hacer que todo funcione.

8
Volomike

Algunas respuestas de la parte superior de mi cabeza:

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

2) Descargue la mayor cantidad posible de su imagen/contenido multimedia a CDN de terceros, especialmente si está usando alojamiento compartido.

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

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

7
ZaMoose

Guardar en caché el menú de WordPress también le da 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 wp_nav_menu directamente.

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 su tema, reemplace el wp_nav_menus 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 con frecuencia, pero también debe conectarse a la acción wp_update_nav_menu para eliminar los transitorios antiguos.

Hazlo asi:

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 a la página, y use la versión en caché hasta que alguien actualice el menú nuevamente.

Versión actualizada

Gracias a @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.

7
fischi

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 ).

5
hakre

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, 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 tablas físico . Es posible hacer una optimización decente de MySQL incluso si tiene un hardware limitado . Hay muchos escenarios para hacer tales optimizaciones de 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.

4
RolandoMySQLDBA

Recientemente hablé sobre 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 de 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 TweetMeMe re Tweet (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, busque en Nginx como un proxy de front-end para el contenido estático con Apache manejando el pesado PHP y el levantamiento de MySQL.

3
Chris_O

podría habilitar global compresión de salida . 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.

3
Scott M.

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 hilo de trabajo de Apache y mod_fcgid.

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

2
nottinhill

Guía para comprobar el plugin lento

Hay un complemento maravillosamente simple llamado Tiempo de carga de 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 póngalos ahí.
  3. Actualice la página tres veces tomando nota del 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 verse como

+-------+-------+-------+-------+--------+
| 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 puede ver si puede evitar ese complemento.

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

1
icc97