Qual é a melhor opção de cache para vários sites do WordPress em hospedagem não compartilhada?


13

Qual configuração de plug-in de cache você recomenda e por que, de acordo com as seguintes premissas:

  • controle total da configuração do servidor
  • executando o WordPress no modo de vários sites / vários domínios
  • a maioria dos domínios não usa www.prefixo (cookies)
  • (desejo) poder desativar o cache de IPs específicos ou com base em um cookie. Quando você faz alterações no site, não precisa de cache.

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

Além disso, não o guie com diretrizes genéricas, como imagens menores.

Sejamos honestos, o uso de mais de um plug-in de cache trará mais problemas do que resolverá; portanto, tente fazer uma abordagem simples.

Respostas:


4

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

  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ágina, consumo de memória).
  4. Desempenho de front-end (quantidade de solicitações HTTP, largura de banda).

Um bom começo seria o plug-in de cache estático (como o W3) com o cache baseado em memória do opcode, como a APC .

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


O cache mais rápido do wp supera o cache total do w3, mesmo sem o cache do objeto.
Ярослав Рахматуллин

19

Minha pilha de desempenho e cache do WordPress

Esta é a melhor pilha de desempenho do WordPress para um servidor único ou VPS de faixa baixa a média. Estou classificando a faixa intermediária como núcleo único, com cerca de 1G de memória e unidades relativamente rápidas.

Pilha de servidor

  • Linux - Debian Lenny ou Ubuntu
  • Nginx - configurado como cache de arquivo estático de proxy reverso
  • Apache - O Apache manipulará o PHP descarregado pelo Nginx em uma porta alternativa
  • MySql - Requerido pelo WP, verifique se você está executando a versão estável mais recente
  • Versão estável mais recente da ramificação 5.2 ou 5.3

Cache PHP

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

Pilha de plug-ins de desempenho do WordPress

  • Integrador de cache proxy Nginx
  • W3 Total Cache - Defina o cache da página para o disco aprimorado, reduza para o disco e o objeto e db para APC.
    • CDN auto-hospedado - Crie 4 aliases de cname que apontam para o domínio no servidor configurado apenas para servir arquivos estáticos

Com o W3 Total Cache, estamos usando o disco para o cache da página e o minify, porque o Nginx servirá nossos arquivos estáticos muito rapidamente.

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

O problema de 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 você tiver muito tráfego, suas conexões serão bloqueadas, mesmo que não estejam sendo usadas.

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

Configuração do Apache

httpd.conf

defina KeepAlive como desativado

ports.conf

NameVirtualHost *:8080
Listen 8080

Host virtual por 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 logs contenham os endereços IP reais de seus visitantes. Caso contrário, seus logs terão 127.0.0.1 como o endereço IP de origem.

Nginx Config

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

$ 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 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 do código-fonte.

Configuração dos arquivos conf e servidor Nginx

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 ativado por sites com cada sy do host v vinculado 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 funcionarão apenas se o plug-in do integrador de cache 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 do site WordPress (Para sites múltiplos, você precisará apenas 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 sua conf CDN auto-hospedada, você só precisa configurá-la para veicular arquivos estáticos sem a passagem 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, essa configuração pode atender teoricamente 1833,56 solicitações por segundo

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

texto alternativo


1
+ Uau, isso foi impressionante, mas no momento vou preferir pular a configuração do nginx porque isso tornaria a configuração do servidor muito complexa.
sorin

Quero seguir suas instruções em minha hospedagem VPS. Mas tenho medo de que ocorra algum problema, se fizer algo errado.
user391

1
Obrigado. Seriamente útil. Eu vou tentar isso. Eu gostaria de poder mod isso mais de uma vez :)
Nasir

4

Use um espaço na web com RAM mínima de 64 MB para Multisite e use APC e Memcached no Apache, cache não estático e você pode usar todas as funções WP sem problemas. Você digitaliza via PageSpeed ​​e também lê outras opções, não foi codificado no tema. Um cache pode fazer um ótimo trabalho, mas não pode reparar um tema ou plug-in incorreto. Uma outra solução é usar subdomínios sem cookies como CDN no WordPress. Adicione isso 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 functions.php do tema ou escreva um plug-in para substituir o caminho do conteúdo estático dos seus subdomínios, sua CDN personalizada.

// 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 template e stylesheet-path

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 Velocidade da página nos URLs estáticos da CDN do front-end sem cookies.

Adicione também a seguinte fonte ao arquivo .htaccess para bloquear a publicação de conteúdo:

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


0

Pilha de servidor da Web

Mantenha essencialmente todas as operações na memória!

  • CPU moderna, alta largura de banda de memória, pois o WordPress é principalmente cópia de memória, tempo de acesso ao disco sub-ms, tente o UpCloud!
  • Camada fina de virtualização, tente o UpCloud! Afaste-se de fornecedores populares, não empresariais
  • Sistema operacional rápido: sem sistema, entropia suficiente, balanço de IRQ, baixo uso de memória
  • Bloqueie atacantes que atacam: Fail2ban, bloqueia permanentemente redes de sombra
  • Anycast DNS
  • Servidor rápido: Apache Event MPM
  • CDN de conexão paralela com velocidades semelhantes à RAM (Amazon CloudFront)
  • SSL de alta velocidade: certificado ECDSA, fonte de entropia, TLS1.2, Ciphersuites para AES-NI, cache de sessão SSL, grampeamento OCSP, HTTP / 2
  • PHP moderno com OPcache, conectado através do FastCGI
  • Instalação Lean WordPress: apenas plugins mínimos e auditados
  • Redis cache de objetos na memória
  • Mecanismo MariaDB TokuDB (árvore fractal)
  • Otimização de recursos
  • Recortar em JavaScripts
  • Monitoramento contínuo: Pingdom, HetrixTools

Todo o meu conhecimento é de código aberto https://github.com/szepeviktor/debian-server-tools

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.