¿Cuál es la mejor opción de almacenamiento en caché para sitios múltiples de WordPress en alojamiento no compartido?

13

¿Qué configuración de plugin de almacenamiento en caché recomienda y por qué bajo los siguientes supuestos:

  • control total de la configuración del servidor
  • ejecutar WordPress en modo multisitio / multidominio
  • la mayoría de los dominios no usan www.prefijo (cookies)
  • (deseo) poder deshabilitar el almacenamiento en caché para IP específicas o en función de una cookie, cuando realiza cambios en el sitio no necesita almacenamiento en caché.

Detalles: estoy usando el complemento Firefox Google Page Speed ​​para intentar optimizar la velocidad del sitio web.

Además, no guíe con pautas genéricas, como imágenes más pequeñas.

Seamos justos, usar más de un complemento de almacenamiento en caché le traerá más problemas de los que resolverá, así que intente dar un enfoque simple.

sorin
fuente

Respuestas:

4

La respuesta básica a "qué complemento" probablemente sería W3 Total Cache . Es uno de los complementos más funcionales y desarrollados activamente en este momento. Sin embargo, la cadena de rendimiento completa es mucho más larga que el complemento de WordPress solo puede manejar.

  1. Configuración del servidor web (Apache o algo más) (tiempo de respuesta, tiempo hasta el primer byte, encabezados).
  2. Base de datos (tiempo dedicado a procesar consultas).
  3. PHP / WordPress (tiempo de generación de página, consumo de memoria).
  4. Rendimiento de front-end (cantidad de solicitudes HTTP, ancho de banda).

Un buen comienzo sería el complemento de almacenamiento en caché estático (como W3) con caché basado en memoria de código de operación como APC .

Pero a partir de ahí hay muchas más cosas (y mucho más complejas) que podría hacer, como redes de distribución de contenido, servidores web alternativos, etc.

Rarst
fuente
el caché más rápido de wp supera el caché total de w3, incluso sin el caché de objetos.
Ярослав Рахматуллин
19

Mi rendimiento de WordPress y la pila de almacenamiento en caché

Esta es la mejor pila de rendimiento de WordPress para un servidor único o VPS de rango bajo a medio. Estoy clasificando el rango medio como núcleo único con alrededor de 1G de memoria y unidades bastante rápidas.

Pila del servidor

  • Linux: Debian Lenny o Ubuntu
  • Nginx: configurado como caché de archivos estáticos de proxy inverso
  • Apache: Apache manejará el PHP descargado por Nginx en un puerto alternativo
  • MySql: requerido por WP, asegúrese de ejecutar la última versión estable
  • PHP: última versión estable de la rama 5.2 o 5.3

Caché PHP

  • APC: configúrelo con memoria mmap y tamaño shm de al menos 128M

Pila de plugins de rendimiento de WordPress

  • Integrador de caché proxy Nginx
  • W3 Total Cache : establece la memoria caché de la página en el disco mejorado, minimiza en el disco y objeta y db en APC.
    • CDN autohospedado: cree 4 alias de cname que apuntan al dominio en el servidor configurado solo para servir archivos estáticos

Con W3 Total Cache estamos usando el disco para el caché de páginas y minify porque Nginx servirá nuestros archivos estáticos muy rápido.

Cómo configurar Nginx para servir archivos estáticos y pasar PHP a Apache

El problema con el uso de Apache solo es que abre una conexión y golpea php en cada solicitud, incluso para archivos estáticos. Esto desperdicia conexiones porque Apache las mantendrá abiertas y cuando tenga mucho tráfico, sus conexiones se atascarán incluso si no se están utilizando.

De forma predeterminada, Apache escucha las solicitudes en el puerto 80, que es el puerto web predeterminado. Primero vamos a hacer cambios en nuestros archivos Apache conf y hosts virtuales para escuchar en el puerto 8080.

Configuración de Apache

httpd.conf

establecer KeepAlive en apagado

ports.conf

NameVirtualHost *:8080
Listen 8080

Por host virtual de sitio

<VirtualHost 127.0.0.1:8080>
     ServerAdmin [email protected]
     ServerName yoursite.com
     ServerAlias www.yoursite.com
     DocumentRoot /srv/www/yoursite.com/public_html/
     ErrorLog /srv/www/yoursite.com/logs/error.log
     CustomLog /srv/www/yoursite.com/logs/access.log combined
</VirtualHost>

También debe instalar mod_rpaf para que sus registros contengan las direcciones IP reales de sus visitantes. Si no, sus registros tendrán 127.0.0.1 como la dirección IP de origen.

Nginx Config

En Debian puede usar los repositorios para instalar, pero solo contienen la versión 0.6.33. Para instalar una versión posterior, debe agregar los paquetes de lenny backports

$ nano /etc/apt/sources.list

Agregue esta línea al archivo deb http://www.backports.org/debian lenny-backports main

$ nano /etc/apt/preferences

Agregue lo siguiente al archivo:

Package: nginx
Pin: release a=lenny-backports 
Pin-Priority: 999

Emita los siguientes comandos para importar la clave de backports.org para verificar paquetes y actualizar la base de datos de paquetes de su sistema:

$ wget -O - http://backports.org/debian/archive.key | apt-key add -
$ apt-get update

Ahora instale con apt-get

apt-get install nginx

Esto es mucho más fácil que compilar desde la fuente.

Configuración de Nginx conf y server files

nginx.conf

user www-data;
worker_processes  4;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access.log;
    client_body_temp_path /var/lib/nginx/body 1 2;
    gzip_buffers 32 8k;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;

  gzip_comp_level   6;
  gzip_http_version 1.0;
  gzip_min_length   0;
  gzip_types        text/html text/css image/x-icon
        application/x-javascript application/javascript text/javascript application/atom+xml application/xml ;



    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Ahora deberá configurar su alojamiento virtual Nginx. Me gusta usar el método habilitado para sitios con cada símbolo de host v vinculado a un archivo en el directorio de sitios disponibles.

$ mkdir /etc/nginx/sites-available  
$ mkdir /etc/nginx/sites-enabled
$ touch /etc/nginx/sites-available/yourservername.conf
$ touch /etc/nginx/sites-available/default.conf
$ ln -s  /etc/nginx/sites-available /etc/nginx/sites-enabled
$ nano /etc/nginx/sites-enabled/default.conf

default.conf

Nota:

La configuración de caché estática en los siguientes archivos solo funcionará si el complemento integrador de caché proxy Nginx está habilitado.

proxy_cache_path  /var/lib/nginx/cache  levels=1:2   keys_zone=staticfilecache:180m  max_size=500m;
proxy_temp_path /var/lib/nginx/proxy;
proxy_connect_timeout 30;
proxy_read_timeout 120;
proxy_send_timeout 120;

#IMPORTANT - this sets the basic cache key that's used in the static file cache.
proxy_cache_key "$scheme://$host$request_uri";

upstream wordpressapache {
        #The upstream apache server. You can have many of these and weight them accordingly,
        #allowing nginx to function as a caching load balancer 
        server 127.0.0.1:8080 weight=1 fail_timeout=120s;
}

Según la configuración del sitio de WordPress (para sitios múltiples solo necesitará un vhost)

server {
        #Only cache 200 responses, and for a default of 20 minutes.
        proxy_cache_valid 200 20m;

        #Listen to your public IP
        listen 80;

        #Probably not needed, as the proxy will pass back the host in "proxy_set_header"
        server_name www.yoursite.com yoursite.com;
        access_log /var/log/nginx/yoursite.proxied.log;  

        # "combined" matches apache's concept of "combined". Neat.
        access_log  /var/log/apache2/nginx-access.log combined;
        # Set the real IP.
        proxy_set_header X-Real-IP  $remote_addr;

        # Set the hostname
        proxy_set_header Host $host;

        #Set the forwarded-for header.
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
                        # If logged in, don't cache.
                        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
                                set $do_not_cache 1;
                        }
                        proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
                        proxy_cache staticfilecache;
                        proxy_pass http://wordpressapache;
        }

        location ~* wp\-.*\.php|wp\-admin {
                        # Don't static file cache admin-looking things.
                        proxy_pass http://wordpressapache;
        }

        location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
                        # Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
                        # whether logged in or not (may be too heavy-handed).
                        proxy_cache_valid 200 120m;
                        expires 864000;
                        proxy_pass http://wordpressapache;
                        proxy_cache staticfilecache;
        }

        location ~* \/[^\/]+\/(feed|\.xml)\/? {
 # Cache RSS looking feeds for 45 minutes unless logged in.
                        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
                                set $do_not_cache 1;
                        }
                        proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
                        proxy_cache_valid 200 45m;
                        proxy_cache staticfilecache;
                        proxy_pass http://wordpressapache;
        }

        location = /50x.html {
                root   /var/www/nginx-default;
        }

        # No access to .htaccess files.
        location ~ /\.ht {
                deny  all;
        }

        }

Conf. CDN autohospedado

Para su conf CDN autohospedado solo necesita configurarlo para servir archivos estáticos sin el pase de proxy

server {

        proxy_cache_valid 200 20m;
        listen 80;
        server_name yourcdndomain.com;
        access_log   /srv/www/yourcdndomain.com/logs/access.log;
        root   /srv/www/yourcdndomain.com/public_html/;

 proxy_set_header X-Real-IP  $remote_addr;

      location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
                                # Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
                                # whether logged in or not (may be too heavy-handed).

                                proxy_cache_valid 200 120m;
                        expires 7776000;
                        proxy_cache staticfilecache;
                }

location = /50x.html {
                root   /var/www/nginx-default;
        }

 # No access to .htaccess files.
        location ~ /\.ht {
          deny  all;
        }

    }

Ahora inicia los servidores

$ /etc/init.d/apache2 restart  
$/etc/init.d/nginx start

Los resultados de referencia

En Apache Bench, esta configuración teóricamente puede atender 1833.56 solicitudes por segundo

$ ab -n 1000 -c 20 http://yoursite.com/

texto alternativo

Chris_O
fuente
1
+ Wow, esto fue impresionante, pero por el momento preferiré omitir la configuración de nginx porque haría que la configuración del servidor sea demasiado compleja.
sorin
Quiero seguir sus instrucciones en mi hosting VPS. Pero me temo que podría ocurrir algún problema, si hago algo mal. No lo he hecho antes. ¿Puede un usuario como yo poder hacerlo?
user391
1
Gracias. Muy útil Voy a intentar esto. Desearía poder modificar esto más de una vez :)
Nasir
4

Use un espacio web con un mínimo de 64 MB de RAM para Multisitio y use APC y Memcached en Apache, el caché no es estático y puede usar todas las funciones WP sin problemas. Escanear a través de PageSpeed ​​leer también otras opciones, había codificado en el tema. Un caché puede hacer un gran trabajo, pero no puede reparar un mal tema o complemento. Otra solución es usar subdominios sin cookies como CDN en WordPress. Agregue esto a wp-config.php para las Cookies solo en el dominio, no en el subdominio.

define( 'COOKIE_DOMAIN', 'example.com' );

Ahora configure nuevas funciones en functions.php del tema o escriba un complemento para reemplazar la ruta del contenido estático de sus subdominios, su CDN personalizado.

// replace for CDN on bloginfo
if ( !function_exists('fb_add_static_wpurl') ) {
    function fb_add_static_wpurl($info, $show) {

        if ( is_admin() )
            return $info;

        $keys = array(
            'url',
            'wpurl',
            'stylesheet_url',
            'stylesheet_directory',
            'template_url',
            'template_directory',
            );

        if ( in_array( $show, $keys ) ) {

            $wpurl = get_bloginfo('wpurl');

            $search = array(
                $wpurl . '/wp-content/images/',
                $wpurl . '/wp-content/download/',
                $wpurl . '/wp-content/themes/',
                $wpurl . '/wp-content/plugins/',
            );

            $replace = array(
                'http://cdn1.example.com/',
                'http://cdn2.example.com/',
                'http://cdn3.example.com/',
                'http://cdn4.example.com/',
            );

            return str_replace( $search, $replace, $info );

        } else {
            return $info;
        }
    }
    add_filter( 'bloginfo_url', 'fb_add_static_wpurl', 9999, 2 );
}

ahora la función para plantilla y ruta de hoja de estilo

function fb_add_static_stylesheet_uri($uri) {

            if ( is_admin() )
                return $uri;

            $wpurl = get_bloginfo('wpurl');

            $search = array(
                $wpurl . '/wp-content/images/',
                $wpurl . '/wp-content/download/',
                $wpurl . '/wp-content/themes/',
                $wpurl . '/wp-content/plugins/',
            );

            $replace = array(
                'http://cdn1.example.com/',
                'http://cdn2.example.com/',
                'http://cdn3.example.com/',
                'http://cdn4.example.com/',
            );
            return str_replace( $search, $replace, $uri );

}
add_filter ( 'template_directory_uri', 'fb_add_static_stylesheet_uri' );
add_filter ( 'stylesheet_uri', 'fb_add_static_stylesheet_uri' );
add_filter ( 'stylesheet_directory_uri', 'fb_add_static_stylesheet_uri' );

Ahora lea Page Speed ​​en la URL estática frontales de CDN sin cookies.

Agregue también la fuente de seguimiento al .htaccess para bloquear contenido duplicado:

##
# Explicitly send a 404 header if a file on cdn[0-9].example.org is not
# found. This will prevent the start page (empty URL) from being loaded.
##
RewriteCond %{HTTP_HOST} ^cdn[0-9]\.example\.org [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* - [R=404,L]

##
# Do not dispatch dynamic resources via cdn[0-9].example.org.
##
RewriteCond %{HTTP_HOST} ^cdn[0-9]\.example\.org [NC]
RewriteCond %{REQUEST_FILENAME} \.(php|html)$
RewriteRule .* - [R=404,L]

Utilice la función, también es ejemplos y puede escribir sus soluciones con mis ideas.

bueltge
fuente
0

Pila de servidor web

¡Esencialmente mantenga todas las operaciones en la memoria!

  • CPU moderna, alto ancho de banda de memoria, ya que WordPress es principalmente copia de memoria, tiempo de acceso al disco por debajo de mseg, ¡pruebe UpCloud!
  • Capa de virtualización delgada, ¡prueba UpCloud! Manténgase alejado de proveedores populares, no empresariales
  • Sistema operativo rápido: sin sistema, suficiente entropía, balance IRQ, bajo uso de memoria
  • Bloquear a los atacantes martilladores: Fail2ban, bloquear permanentemente las redes de sombra
  • Anycast DNS
  • Servidor web rápido: Apache Event MPM
  • Conexión paralela CDN con velocidades de tipo RAM (Amazon CloudFront)
  • SSL de alta velocidad: certificado ECDSA, fuente de entropía, TLS1.2, Ciphersuites para AES-NI, caché de sesión SSL, grapado OCSP, HTTP / 2
  • PHP moderno con OPcache, conectado a través de FastCGI
  • Instalación eficiente de WordPress: solo complementos mínimos y auditados
  • Redis caché de objetos en memoria
  • TokuDB (árbol fractal) Motor MariaDB
  • Optimización de recursos.
  • Cortar en JavaScripts
  • Monitoreo continuo: Pingdom, HetrixTools

Todo mi conocimiento es de código abierto https://github.com/szepeviktor/debian-server-tools

Szépe Viktor
fuente