Qual é a melhor opção de cache para o multi-site do WordPress em hospedagem não compartilhada?

11

Qual configuração de plug-in de armazenamento em cache você recomenda e por que sob as seguintes suposições:

  • controle total da configuração do servidor
  • executando o WordPress no modo multi-site / multi-domínio
  • a maioria dos domínios não usa o prefixo www. (cookies)
  • (desejo) para poder desativar o armazenamento em cache para IPs específicos ou com base em um cookie, quando você fizer alterações no site, não precisará de armazenamento em cache.

Detalhes: estou usando o plug-in do Google Page Speed do Firefox para tentar otimizar a velocidade do site.

Por favor, não guie com diretrizes genéricas, como imagens menores.

Sejamos justos, usar mais de um plug-in de cache trará mais problemas do que resolverá, por isso, tente dar uma abordagem simples.

    
por sorin 02.10.2010 / 16:40

4 respostas

5

A resposta básica a "qual plug-in" provavelmente seria Cache total do W3 . É um dos plugins mais funcionais e ativamente desenvolvidos no momento. No entanto, a cadeia de desempenho completa é muito mais longa do que apenas o WordPress pode manipular.

  1. Configuração do servidor Web (Apache ou outra coisa) (tempo de resposta, tempo até o primeiro byte, cabeçalhos).
  2. Banco de dados (tempo gasto no processamento de consultas).
  3. PHP / WordPress (tempo de geração de páginas, consumo de memória).
  4. Desempenho de front-end (quantidade de solicitações de HTTP, largura de banda).

O bom começo seria um plugin de armazenamento em cache estático (como o W3) com cache baseado em memória opcode como APC .

Mas a partir daí há muito mais coisas (e muito mais complexas) que você poderia fazer, como redes de distribuição de conteúdo, servidores da Web alternativos, etc.

    
por Rarst 02.10.2010 / 17:08
18

Meu desempenho do WordPress e a pilha de cache

Esta é a melhor pilha de desempenho do WordPress para um servidor único ou VPS de gama baixa a média. Eu estou classificando mid range como single core com cerca de 1G de memória e drives razoavelmente rápidos.

Pilha de servidores

  • Linux - Debian Lenny ou Ubuntu
  • Nginx - Configurado como cache de arquivo estático do proxy reverso
  • Apache - O Apache manipulará o PHP transferido pelo Nginx em uma porta alternativa
  • MySql - Requerido pelo WP, verifique se você está executando a última versão estável
  • PHP - Última versão estável do ramo 5.2 ou 5.3

Cache do PHP

  • APC - Configure com memória mmap e tamanho de shm de pelo menos 128M

Pilha de plug-ins de desempenho do WordPress

  • Integrador de cache do proxy Nginx
  • W3 Total Cache - Defina o cache de páginas para disco aprimorado, diminua para disco e opte por db para APC .
    • CDN auto-hospedado - Crie 4 aliases de cname que apontam para o domínio no servidor configurado apenas para exibir arquivos estáticos

Com o W3 Total Cache, estamos usando o disco para o cache de páginas e diminuímos porque o Nginx estará atendendo nossos arquivos estáticos com muita rapidez.

Como configurar o Nginx para servir arquivos estáticos e passar o PHP para o Apache

O problema em usar o Apache sozinho é que ele abre uma conexão e atinge o php em todas as solicitações, mesmo para arquivos estáticos. Isso desperdiça conexões porque o Apache as manterá abertas e, quando houver muito tráfego, suas conexões ficarão atoladas, mesmo que não estejam sendo usadas.

Por padrão, o Apache atende solicitações na porta 80, que é a porta da web padrão. Primeiro, faremos alterações nos arquivos de hosts conf e virtuais do Apache para escutar na porta 8080.

Configuração do Apache

enlace

defina KeepAlive como off

ports.conf

NameVirtualHost *:8080
Listen 8080

Por host virtual do site

<VirtualHost 127.0.0.1:8080>
     ServerAdmin info@yoursite.com
     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>

Você também deve instalar o mod_rpaf para que seus registros contenham os endereços IP reais de seus visitantes. Se não, seus registros terão 127.0.0.1 como o endereço IP de origem.

Configuração Nginx

No Debian você pode usar os repositórios para instalar, mas eles só contêm a versão 0.6.33. Para instalar uma versão posterior, você precisa adicionar os pacotes de backports lenny

$ nano /etc/apt/sources.list

Adicione esta linha ao arquivo deb http://www.backports.org/debian lenny-backports main

$ nano /etc/apt/preferences

Adicione o seguinte ao arquivo:

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

Emita os seguintes comandos para importar a chave do backports.org para verificar os pacotes e atualizar o banco de dados de pacotes do seu sistema:

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

Agora instale com o apt-get

apt-get install nginx

Isso é muito mais fácil do que compilar a partir da fonte.

Nginx conf e configuração dos arquivos do 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/*;
}

Agora, você precisará configurar sua hospedagem virtual Nginx. Eu gosto de usar o método habilitado para sites com cada v sym host ligado a um arquivo no diretório de sites disponíveis.

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

As configurações de cache estático nos arquivos a seguir só funcionarão se o plug-in do integrador de cache do proxy Nginx estiver ativado.

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 conf conf do site WordPress (Para o multi site você só precisa de um 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 auto-hospedado

Para seu CDN hospedado sozinho você só precisa configurá-lo para servir arquivos estáticos sem o passe 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;
        }

    }

Agora inicie os servidores

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

Os resultados de referência

No Apache Bench, esta configuração pode, teoricamente, atender a 1833,56 solicitações por segundo

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

    
por Chris_O 03.10.2010 / 08:08
4

Use um espaço da Web com um mínimo de 64 MB de RAM para o Multisite e use o APC e o Memcached no Apache, o cache não estático e você pode usar todas as funções do WP sem problemas. Você escaneia via PageSpeed leia também outras opções, lá foi codificado no tema. Um cache pode fazer um ótimo trabalho, mas não pode reparar um tema ou plug-in inválido. Uma outra solução é usar subdomínios sem cookies como CDN no WordPress. Adicione isto ao wp-config.php para os Cookies apenas no domínio, não no subdomínio.

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

Agora, defina novas funções no arquivo functions.php do tema ou escreva um plug-in para substituir o conteúdo estático do caminho em seus subdomínios, seu 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 );
}

agora a função para modelo e caminho de folha 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' );

Agora leia a Velocidade de Página nas URLs CDN estáticas front-end sem cookies.

Adicione também a seguinte fonte ao .htaccess para o conteúdo do bloco dublicado:

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

Por favor, use a função, também é exemplos e você pode escrever suas soluções com minhas idéias.

    
por bueltge 02.10.2010 / 20:54
0

Pilha do servidor da web

Essencialmente, mantenha todas as operações na memória!

  • CPU moderna, alta memória de largura de banda, pois o WordPress é principalmente cópia de memória, tempo de acesso ao disco de sub-ms, tente usar o UpCloud!
  • Camada de virtualização fina, experimente o UpCloud! Mantenha-se longe de provedores populares e não corporativos
  • Sistema operacional rápido: sem systemd, entropia suficiente, equilíbrio de IRQ, baixo uso de memória
  • Bloquear invasores de martelagem: Fail2ban, bloquear permanentemente as redes de sombra
  • DNS Anycast
  • Webserver rápido: Apache Event MPM
  • Conexão paralela CDN com velocidades semelhantes à RAM (Amazon CloudFront)
  • SSL de alta velocidade: certificado ECDSA, fonte Entropy, TLS1.2, Ciphersuites para AES-NI, cache de sessão SSL, grampeamento OCSP, HTTP / 2
  • PHP moderno com OPcache, conectado por meio do FastCGI
  • Instalação do WordPress: somente plugins mínimos e auditados
  • Cache de objetos na memória do Redis
  • Mecanismo MariaDB do TokuDB (árvore fractal)
  • Otimização de recursos
  • Corte em JavaScripts
  • Monitoramento contínuo: Pingdom, HetrixTools

Todo o meu conhecimento é de código-fonte aberto enlace

    
por Szépe Viktor 10.04.2017 / 01:18