it-swarm.com.de

Was ist die beste Caching-Option für WordPress Multi-Site auf nicht gemeinsam genutzten Hosting?

Welche Caching-Plugin-Konfiguration empfehlen Sie und warum unter folgenden Voraussetzungen:

  • volle Kontrolle über die Serverkonfiguration
  • ausführen von WordPress im Multi-Site/Multi-Domain-Modus
  • die meisten Domains verwenden kein www.-Präfix (Cookies).
  • (Wunsch) in der Lage zu sein, das Caching für bestimmte IPs oder basierend auf einem Cookie zu deaktivieren, wenn Sie Änderungen an der Site vornehmen, die Sie nicht zwischenspeichern müssen.

Details: Ich verwende das Google Page Speed-Plugin von Firefox, um die Geschwindigkeit der Website zu optimieren.

Bitte orientieren Sie sich auch nicht an allgemeinen Richtlinien wie kleineren Bildern.

Seien wir fair, wenn Sie mehr als ein Caching-Plugin verwenden, werden Sie mehr Probleme haben, als es lösen kann. Versuchen Sie also, einen einfachen Ansatz zu finden.

13
sorin

Grundlegende Antwort auf "welches Plugin" wäre wahrscheinlich W3 Total Cache . Es ist derzeit eines der funktionalsten und aktivsten Plugins. Die gesamte Leistungskette ist jedoch viel länger, als das WordPress-Plugin alleine aushält.

  1. Konfiguration des Webservers (Apache oder etwas anderes) (Antwortzeit, Zeit bis zum ersten Byte, Header).
  2. Datenbank (Zeitaufwand für die Bearbeitung von Abfragen).
  3. PHP/WordPress (Seitenerstellungszeit, Speicherverbrauch).
  4. Front-End-Leistung (Anzahl der HTTP-Anforderungen, Bandbreite).

Ein guter Anfang wäre ein statisches Caching-Plugin (wie W3) mit einem auf Opcode-Speicher basierenden Cache wie APC .

Aber von da an gibt es viel mehr (und viel komplexere) Dinge, die Sie tun könnten, wie Content-Verteilungsnetzwerke, alternative Webserver usw.

4
Rarst

Mein WordPress Performance und Caching Stack

Dies ist der beste WordPress-Performance-Stack für einen Single Server oder VPS mit niedriger bis mittlerer Reichweite. Ich klassifiziere Midrange als Single Core mit ca. 1 GB Speicher und relativ schnellen Laufwerken.

Server Stack

  • Linux - Entweder Debian Lenny oder Ubuntu
  • Nginx - Konfiguriert als Cache für statische Reverse-Proxy-Dateien
  • Apache - Apache verarbeitet das von Nginx ausgelagerte PHP auf einem alternativen Port
  • MySql - Erforderlich für WP, stellen Sie sicher, dass Sie die neueste stabile Version ausführen
  • PHP - Neueste stabile Version von 5.2 oder 5.3 Branch

PHP Cache

  • APC - Konfigurieren Sie es mit MMAP-Speicher und einer Shm-Größe von mindestens 128 MB

WordPress Performance Plugin Stack

  • Nginx Proxy-Cache-Integrator
  • W3 Total Cache - Setzt den Seiten-Cache auf "Disk Enhanced", "Minify" auf "Disk" und "Object" und "DB" auf "APC".
    • Self Hosted CDN - Erstellen Sie 4 cname-Aliase, die auf die Domäne auf dem Server verweisen, der nur für die Bereitstellung statischer Dateien eingerichtet wurde

Mit W3 Total Cache verwenden wir die Festplatte als Seiten-Cache und minimieren sie, da Nginx unsere statischen Dateien sehr schnell bereitstellt.

So konfigurieren Sie Nginx für die Bereitstellung statischer Dateien und übergeben PHP an Apache

Das Problem bei der Verwendung von Apache alleine ist, dass es eine Verbindung aufbaut und bei jeder Anfrage auf PHP trifft, auch bei statischen Dateien. Dies verschwendet Verbindungen, weil Apache sie offen hält und wenn Sie viel Verkehr haben, werden Ihre Verbindungen blockiert, selbst wenn sie nicht verwendet werden.

Standardmäßig wartet Apache auf Anfragen an Port 80, dem Standard-Web-Port. Zuerst nehmen wir Änderungen an unseren Apache Conf- und Virtual Hosts-Dateien vor, um Port 8080 abzuhören.

Apache Config

httpd.conf

setze KeepAlive auf off

ports.conf

NameVirtualHost *:8080
Listen 8080

Virtueller Host pro Standort

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

Sie sollten auch mod_rpaf installieren, damit Ihre Protokolle die realen IP-Adressen Ihrer Besucher enthalten. Wenn nicht, haben Ihre Protokolle 127.0.0.1 als Ursprungs-IP-Adresse.

Nginx Konfig

Unter Debian können Sie die Repositorys zum Installieren verwenden, sie enthalten jedoch nur Version 0.6.33. Um eine spätere Version zu installieren, müssen Sie die Lenny-Backports-Pakete hinzufügen

$ nano /etc/apt/sources.list

Diese Zeile zur Datei hinzufügen deb http://www.backports.org/debian lenny-backports main

$ nano /etc/apt/preferences

Fügen Sie der Datei Folgendes hinzu:

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

Geben Sie die folgenden Befehle ein, um den Schlüssel aus backports.org zu importieren, um Pakete zu überprüfen und die Paketdatenbank Ihres Systems zu aktualisieren:

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

Jetzt mit apt-get installieren

apt-get install nginx

Dies ist viel einfacher als das Kompilieren aus dem Quellcode.

Nginx conf und Serverdateien config

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

Nun müssen Sie Ihr virtuelles Nginx-Hosting einrichten. Ich verwende die sites-enabled-Methode gern für jedes v Host-Sym, das mit einer Datei im sites-available-Verzeichnis verknüpft ist.

$ 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

Hinweis:

Die Einstellungen für den statischen Cache in den folgenden Dateien funktionieren nur, wenn das Plug-in für den Nginx-Proxy-Cache-Integrator aktiviert ist.

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

Pro WordPress-Site conf (Für mehrere Sites benötigen Sie nur einen 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;
        }

        }

Selbst gehostete CDN-Konfiguration

Für Ihre selbst gehostete CDN-Konfiguration müssen Sie sie nur so einrichten, dass statische Dateien ohne den Proxy-Pass bereitgestellt werden

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

    }

Starten Sie nun die Server

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

Die Benchmark-Ergebnisse

Auf Apache Bench kann dieses Setup theoretisch 1833,56 Anforderungen pro Sekunde bedienen

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

alt text

19
Chris_O

Verwenden Sie einen Webspace mit mindestens 64 MB RAM für Multisite und verwenden Sie APC und Memcached auf dem Apache, Cache nicht statisch und Sie können alle WP-Funktionen problemlos nutzen. Sie scannen über PageSpeed, lesen Sie auch andere Optionen, da diese im Theme kodiert waren. Ein Cache kann eine großartige Arbeit leisten, aber kein schlechtes Theme oder Plugin reparieren. Eine andere Lösung ist die Verwendung von Subdomains ohne Cookies als CDN in WordPress. Fügen Sie dies der wp-config.php für die Cookies nur in der Domain hinzu, nicht in der Subdomain.

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

Stellen Sie nun neue Funktionen in die functions.php des Themas ein oder schreiben Sie ein Plugin, um den Pfad von statischen Inhalten zu Ihren Subdomains, Ihrem benutzerdefinierten CDN, zu ersetzen.

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

jetzt die Funktion für Template und Stylesheet-Pfad

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

Lesen Sie nun Page Speed ​​auf den statischen Frontend-CDN-URLs ohne Cookies.

Fügen Sie außerdem die folgende Quelle zum .htaccess für Block-Dublicate-Inhalt hinzu:

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

Bitte nutzen Sie die Funktion, ist auch Beispiele und Sie können Ihre Lösungen mit meinen Ideen schreiben.

4
bueltge

Webserver-Stack

Behalten Sie im Wesentlichen jede Operation im Gedächtnis!

  • Moderne CPU, hohe Speicher Bandbreite, da WordPress hauptsächlich Speicher kopiert, Festplattenzugriffszeit unter Millisekunden, versuchen Sie UpCloud!
  • Dünne Virtualisierungsschicht, probieren Sie UpCloud! Halten Sie sich von bekannten Anbietern fern
  • Schnelles Betriebssystem: Kein System, Genügend Entropie, IRQ-Balance, Geringer Speicherverbrauch
  • Hämmernde Angreifer blockieren: Fail2ban, Schattennetze dauerhaft blockieren
  • Anycast DNS
  • Schneller Webserver: Apache Event MPM
  • Parallelverbindungs-CDN mit RAM-ähnlichen Geschwindigkeiten (Amazon CloudFront)
  • Hochgeschwindigkeits-SSL: ECDSA-Zertifikat, Entropiequelle, TLS1.2, Ciphersuites für AES-NI, SSL-Sitzungscache, OCSP-Heftung, HTTP/2
  • Modernes PHP mit OPcache, verbunden über FastCGI
  • Lean WordPress-Installation: Nur minimale und geprüfte Plugins
  • Redis In-Memory-Objekt-Cache
  • TokuDB (Fractal Tree) MariaDB-Engine
  • Ressourcenoptimierung
  • JavaScripts einbinden
  • Kontinuierliche Überwachung: Pingdom, HetrixTools

Mein gesamtes Wissen ist Open-Source https://github.com/szepeviktor/debian-server-tools

0
Szépe Viktor