Quelle est la meilleure option de mise en cache pour WordPress multi-site sur l'hébergement non partagé?


13

Quelle configuration de plug-in de mise en cache recommandez-vous et pourquoi sous les hypothèses suivantes:

  • contrôle total de la configuration du serveur
  • exécuter WordPress en mode multi-site / multi-domaine
  • la plupart des domaines n'utilisent pas de www.préfixe (cookies)
  • (désir) de pouvoir désactiver la mise en cache pour des adresses IP spécifiques ou sur la base d'un cookie, lorsque vous effectuez des modifications sur le site, vous n'avez pas besoin de mise en cache.

Détails: J'utilise le plugin Firefox Google Page Speed ​​pour essayer d'optimiser la vitesse du site Web.

Veuillez également ne pas guider avec des directives génériques, comme des images plus petites.

Soyons honnêtes, l'utilisation de plus d'un plugin de mise en cache vous posera plus de problèmes qu'il n'en résoudra, veuillez donc essayer de donner une approche simple.

Réponses:


4

La réponse de base à "quel plugin" serait probablement W3 Total Cache . C'est l'un des plugins les plus fonctionnels et les plus développés actuellement. Cependant, la chaîne de performance complète est beaucoup plus longue que le plugin WordPress seul peut gérer.

  1. Configuration du serveur Web (Apache ou autre chose) (temps de réponse, temps au premier octet, en-têtes).
  2. Base de données (temps consacré au traitement des requêtes).
  3. PHP / WordPress (temps de génération de page, consommation de mémoire).
  4. Performances frontales (quantité de requêtes HTTP, bande passante).

Un bon début serait un plugin de mise en cache statique (comme W3) avec un cache basé sur la mémoire d'opcode comme APC .

Mais à partir de là, vous pouvez faire des choses beaucoup plus (et beaucoup plus complexes), comme les réseaux de distribution de contenu, des serveurs Web alternatifs, etc.


le cache wp le plus rapide bat le cache total w3, même sans cache d'objets.
Ярослав Рахматуллин

19

Mes performances WordPress et pile de cache

Il s'agit de la meilleure pile de performances WordPress pour un serveur unique bas de gamme ou VPS. Je classe le milieu de gamme comme un seul cœur avec environ 1 Go de mémoire et des disques assez rapides.

Pile de serveur

  • Linux - Soit Debian Lenny ou Ubuntu
  • Nginx - Configuré comme cache de fichiers statiques de proxy inverse
  • Apache - Apache gérera le PHP déchargé par Nginx sur un autre port
  • MySql - Requis par WP, assurez-vous que vous utilisez la dernière version stable
  • PHP - Dernière version stable de la branche 5.2 ou 5.3

Cache PHP

  • APC - Configurez-le avec une mémoire mmap et une taille shm d'au moins 128 Mo

Pile de plug-in de performance WordPress

  • Intégrateur de cache proxy Nginx
  • W3 Total Cache - Définissez le cache de page sur le disque amélioré, réduisez le volume sur le disque et l'objet et la base de données sur APC.
    • CDN auto-hébergé - Créez 4 alias cname qui pointent vers le domaine sur le serveur configuré juste pour servir un fichier statique

Avec W3 Total Cache, nous utilisons le disque pour le cache de pages et la réduction car Nginx servira nos fichiers statiques très rapidement.

Comment configurer Nginx pour servir des fichiers statiques et passer PHP à Apache

Le problème avec l'utilisation d'Apache seul est qu'il ouvre une connexion et frappe php à chaque demande, même pour les fichiers statiques. Cela gaspille les connexions car Apache les gardera ouvertes et lorsque vous avez beaucoup de trafic, vos connexions seront bloquées même si elles ne sont pas utilisées.

Par défaut, Apache écoute les demandes sur le port 80 qui est le port Web par défaut. D'abord, nous allons apporter des modifications à nos fichiers Apache conf et virtual hosts à écouter sur le port 8080.

Apache Config

httpd.conf

désactiver KeepAlive

ports.conf

NameVirtualHost *:8080
Listen 8080

Hôte virtuel par 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>

Vous devez également installer mod_rpaf afin que vos journaux contiennent les adresses IP réelles de vos visiteurs. Sinon, vos journaux auront 127.0.0.1 comme adresse IP d'origine.

Nginx Config

Sur Debian, vous pouvez utiliser les référentiels pour installer, mais ils ne contiennent que la version 0.6.33. Pour installer une version ultérieure, vous devez ajouter les packages de rétroportages de Lenny

$ nano /etc/apt/sources.list

Ajoutez cette ligne au fichier deb http://www.backports.org/debian lenny-backports main

$ nano /etc/apt/preferences

Ajoutez ce qui suit au fichier:

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

Exécutez les commandes suivantes pour importer la clé de backports.org pour vérifier les packages et mettre à jour la base de données de packages de votre système:

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

Installez maintenant avec apt-get

apt-get install nginx

C'est beaucoup plus facile que de compiler à partir de la source.

Config Nginx et configuration des fichiers serveur

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/*;
}

Vous devez maintenant configurer votre hébergement virtuel Nginx. J'aime utiliser la méthode des sites activés avec chaque sym hôte v lié à un fichier dans le répertoire des sites 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

Remarque:

Les paramètres de cache statique dans les fichiers suivants ne fonctionneront que si le plug-in d'intégrateur de cache de proxy Nginx est activé.

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

Par site conf WordPress (pour les sites multiples, vous n'aurez besoin que d'un seul hôte)

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

        }

Configuration CDN auto-hébergée

Pour votre configuration CDN auto-hébergée, vous n'avez qu'à la configurer pour servir des fichiers statiques sans le proxy pass

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

    }

Maintenant, démarrez les serveurs

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

Les résultats de référence

Sur Apache Bench, cette configuration peut théoriquement servir 1833,56 requêtes par seconde

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

texte alternatif


1
+ Wow, c'était impressionnant mais pour le moment je préférerais ignorer la configuration de nginx car cela rendrait la configuration du serveur trop complexe.
Sorin du

Je veux suivre vos instructions sur mon hébergement VPS.Mais je crains qu'un problème ne se produise, si je fais quelque chose de mal.Je ne l'ai pas fait plus tôt.Un utilisateur comme moi peut-il le faire?
user391

1
Merci. Sérieusement utile. Je vais essayer ça. J'aimerais pouvoir modifier cela plus d'une fois :)
Nasir

4

Utilisez un espace Web avec 64 Mo de RAM minimum pour multisite et utilisez APC et Memcached sur Apache, le cache n'est pas statique et vous pouvez utiliser toutes les fonctions WP sans problème. Vous numérisez via PageSpeed ​​lire également d'autres options, il y avait codé dans le thème. Un cache peut faire un excellent travail, mais ne peut pas réparer un mauvais thème ou plugin. Une autre solution consiste à utiliser des sous-domaines sans cookies en tant que CDN dans WordPress. Ajoutez ceci au wp-config.php pour les cookies uniquement sur le domaine, pas le sous-domaine.

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

Maintenant, définissez de nouvelles fonctions dans le fichier functions.php du thème ou écrivez un plugin pour remplacer le chemin d'accès du contenu statique vers vos sous-domaines, votre CDN personnalisé.

// 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 );
}

maintenant la fonction pour le modèle et le chemin de feuille de style

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' );

Lisez maintenant Page Speed ​​sur les URL CDN statiques frontales sans cookies.

Ajoutez également la source suivante au fichier .htaccess pour bloquer le contenu en double:

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

Veuillez utiliser la fonction, est également des exemples et vous pouvez écrire vos solutions avec mes idées.


0

Pile de serveur Web

Gardez essentiellement chaque opération en mémoire!

  • CPU moderne, bande passante mémoire élevée car WordPress est principalement une copie de la mémoire, temps d'accès au disque inférieur à msec, essayez UpCloud!
  • Couche de virtualisation fine, essayez UpCloud! Tenez-vous à l'écart des fournisseurs populaires non professionnels
  • Système d'exploitation rapide: pas de système, assez d'entropie, équilibre IRQ, faible utilisation de la mémoire
  • Bloquez les attaquants: Fail2ban, bloquez définitivement les filets cachés
  • DNS Anycast
  • Serveur Web rapide: Apache Event MPM
  • CDN de connexion parallèle avec des vitesses de type RAM (Amazon CloudFront)
  • SSL haute vitesse: certificat ECDSA, source d'entropie, TLS1.2, Ciphersuites pour AES-NI, cache de session SSL, agrafage OCSP, HTTP / 2
  • PHP moderne avec OPcache, connecté via FastCGI
  • Installation Lean WordPress: plugins minimaux et audités uniquement
  • Cache d'objet en mémoire Redis
  • Moteur TokuDB (arbre fractal) MariaDB
  • Optimisation des ressources
  • Couper sur JavaScripts
  • Surveillance continue: Pingdom, HetrixTools

Toutes mes connaissances sont open-source https://github.com/szepeviktor/debian-server-tools

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.