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

11

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

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

Detalles: Estoy usando el plugin Firefox Google Page Speed para tratar de 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é te traerá más problemas de los que resolverá, así que intenta dar un enfoque simple.

    
pregunta sorin 02.10.2010 - 16:40

4 respuestas

5

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

  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 empleado en 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 un complemento de almacenamiento en caché estático (como W3) con un caché basado en memoria de código de operación como APC .

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

    
respondido por el Rarst 02.10.2010 - 17:08
18

Mi pila de rendimiento y almacenamiento en caché de WordPress

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

Pila de servidores

  • Linux: ya sea Debian Lenny o Ubuntu
  • Nginx: configurado como caché de archivo estático de proxy inverso
  • Apache: Apache manejará el PHP descargado por Nginx en un puerto alternativo
  • MySql: requerido por WP, asegúrese de que está ejecutando la última versión estable
  • PHP - La última versión estable de 5.2 o 5.3 rama

PHP Cache

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

Pila de complementos de rendimiento de WordPress

  • integrador de caché de proxy Nginx
  • Caché total de W3 : configure el caché de la página en el disco mejorado, minimizar en el disco, y el objeto y la base de datos en APC .
    • CDN auto hospedado: crea 4 alias cname que apuntan al dominio en el servidor configurado solo para servir archivos estáticos

Con W3 Total Cache, estamos usando el disco para la página de caché y minimizamos 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 afecta a php en cada solicitud, incluso para archivos estáticos. Esto desperdicia las conexiones porque Apache las mantendrá abiertas y cuando tengas mucho tráfico, tus 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 realizar cambios en nuestros archivos de configuración y hosts virtuales de Apache para escuchar en el puerto 8080.

Configuración de Apache

enlace

establece KeepAlive en off

ports.conf

NameVirtualHost *:8080
Listen 8080

Host virtual por 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.

Config. Nginx

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

Ejecute los siguientes comandos para importar la clave de backports.org para verificar los 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.

Config. nginx conf y archivos de servidor

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 tendrá que configurar su alojamiento virtual Nginx. Me gusta usar el método habilitado para sitios con cada símbolo de v host 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 la memoria caché estática en los siguientes archivos solo funcionará si el complemento integrador de memoria 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;
}

Por WordPress site conf (Para el sitio múltiple, 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;
        }

        }

CDN auto hospedado

Para su propia configuración de CDN alojada, solo necesita configurarlo para que sirva 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 puede en teoría atender 1833.56 solicitudes por segundo

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

    
respondido por el Chris_O 03.10.2010 - 08:08
4

Use un espacio web con un mínimo de 64MB de RAM para Multisite y use APC y Memcached en el Apache, caché no estático y puede usar todas las funciones WP sin problemas. Usted escanea a través de PageSpeed, lea también otras opciones, no fue codificado en el tema. Un caché puede hacer un gran trabajo, pero no puede reparar un tema o un complemento defectuoso. 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 establezca nuevas funciones en las funciones.php del tema o escriba un complemento para reemplazar el contenido estático de la ruta de acceso a 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 la plantilla y la ruta de la 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 la velocidad de la página en las URL de CDN estáticas frontend sin cookies.

También agregue la fuente de seguimiento a .htaccess para el contenido dublicate del bloque:

##
# 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 hay ejemplos y puede escribir sus soluciones con mis ideas.

    
respondido por el bueltge 02.10.2010 - 20:54
0

Pila de servidores 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 ms, intente 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 de martilleo: Fail2ban, bloquear permanentemente las redes de sombra
  • Anycast DNS
  • Servidor web rápido: Apache Event MPM
  • CDN de conexión paralela con velocidades similares a las de la RAM (Amazon CloudFront)
  • SSL de alta velocidad: certificado ECDSA, origen de la entropía, TLS1.2, sistemas de cifrado para AES-NI, caché de sesión SSL, grapado OCSP, HTTP / 2
  • PHP moderno con OPcache, conectado a través de FastCGI
  • Instalación de Lean WordPress: solo complementos mínimos y auditados
  • Redis caché de objetos en memoria
  • Motor MariaDB de TokuDB (árbol fractal)
  • Optimización de recursos
  • Cortar en JavaScripts
  • Monitoreo continuo: Pingdom, HetrixTools

Todo mi conocimiento es de código abierto enlace

    
respondido por el Szépe Viktor 10.04.2017 - 01:18

Lea otras preguntas en las etiquetas