[x] Caching - PageSpeedPlus/easyengine-2 GitHub Wiki

Verwenden von Ramdisk (tmpfs) für zwischengespeicherten Inhalt

Dieser Schritt ist optional. Sie müssen Nginx einen Ordner fastcgi_cache Inhalt geben. Ich werde empfehlen, /var/run auf Ubuntu zu verwenden, da es als tmpfs (im RAM) gemountet ist. Wenn Sie nicht genügend RAM haben, können Sie jeden anderen Ort auswählen.

Wenn Sie mit RAM arbeiten, überprüfen Sie die Größe des Ordners /var/run. Es ist in der Regel 20% Ihrer gesamten RAM-Größe.

Um dies zu überprüfen, führen Sie den Befehl df -h /var/run aus. Sie sehen die Ausgabe wie folgt:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs           6.3G  364K  6.3G   1% /run

Es sieht so aus, als hätten wir mehr als 6 GB zur Verfügung! Unser Server hat übrigens 32 GB RAM, also sind 6,3 GB fast 20%

Nginx Config

Egal wie Sie WordPress verwenden, d. H. Single oder Multisite (mit Unterverzeichnis/Subdomain/Domain-Mapping) fastcgi_cache ähnliche Konfiguration wird ähnlich bleiben.

Nehmen Sie nun Änderungen an /etc/nginx/sites-available/example.com vor, so dass es wie folgt aussieht:

#move next 4 lines to /etc/nginx/nginx.conf if you want to use fastcgi_cache across many sites 
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
server {
	server_name example.com www.example.com;

	access_log   /var/log/nginx/example.com.access.log;
	error_log    /var/log/nginx/example.com.error.log;

	root /var/www/example.com/htdocs;
	index index.php;

	set $skip_cache 0;

	# POST requests and urls with a query string should always go to PHP
	if ($request_method = POST) {
		set $skip_cache 1;
	}   
	if ($query_string != "") {
		set $skip_cache 1;
	}   

	# Don't cache uris containing the following segments
	if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
		set $skip_cache 1;
	}   

	# Don't use the cache for logged in users or recent commenters
	if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
		set $skip_cache 1;
	}

	location / {
		try_files $uri $uri/ /index.php?$args;
	}    

	location ~ \.php$ {
		try_files $uri =404; 
		include fastcgi_params;
		fastcgi_pass 127.0.0.1:9000;

		fastcgi_cache_bypass $skip_cache;
	        fastcgi_no_cache $skip_cache;

		fastcgi_cache WORDPRESS;
		fastcgi_cache_valid  60m;
	}

	location ~ /purge(/.*) {
	    fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
	}	

	location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
		access_log off;	log_not_found off; expires max;
	}

	location = /robots.txt { access_log off; log_not_found off; }
	location ~ /\. { deny  all; access_log off; log_not_found off; }
}

Die Zeile fastcgi_cache_use_stale macht das Caching auf der Nginx-Seite einzigartig. Diese Zeile weist Nginx an, die alte (veraltete) zwischengespeicherte Version der Seite zu verwenden, wenn PHP abstürzt. Dies ist mit WordPress Caching Plugins nicht möglich.

Testen Sie Ihre Nginx-Konfiguration

Testen Sie Ihre Nginx-Konfiguration immer und laden Sie sie dann erneut. Alle Änderungen an Nginx config müssen mit folgenden Befehlen ausgeführt werden:

nginx -t && service nginx reload

WooCommerce Window Shopping Caching Technik

Dieser Artikel beschreibt eine sehr aggressive ganzseitige Caching-Techniken für Woo-Commerce-Stores.

Wir verwenden diese Technik seit langer Zeit und haben sogar darüber auf dem WordCamp Mumbai 2016 gesprochen. Folien unten:

Scaling WooCommerce - WordCamp Mumbai 2016

Nginx-Konfiguration

Unten ist fast vollständige Nginx-Konfiguration. Da es viele verschiedene Möglichkeiten gibt, die Nginx-Konfiguration zu schreiben, mag Ihnen Folgendes seltsam erscheinen.

# WPSINGLE BASIC NGINX CONFIGURATION
server {

	server_name example.com www.example.com;

	access_log   /var/log/nginx/example.com.access.log rt_cache;
	error_log    /var/log/nginx/example.com.error.log ;

	root /var/www/example.com/htdocs;
	index index.php index.htm index.html;

	fastcgi_cache_use_stale error timeout invalid_header http_500;

	set $skip_cache 0;

	# POST requests and urls with a query string should always go to PHP
	if ($request_method = POST) {
		set $skip_cache 1;
	}   
	if ($query_string != "") {
		set $skip_cache 1;
	}   

	if ( $cookie_woocommerce_items_in_cart = "1" ){
		 set $skip_cache 1;
	}

	# Don't cache uris containing the following segments
	if ($request_uri ~* "(/shop.*|/cart.*|/my-account.*|/checkout.*|/addons.*|/wp-admin/|/xmlrpc.php|wp-.*.php|index.php") {
		set $skip_cache 1;
	}   

	# Don't use the cache for logged in users or recent commenters
	if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
		set $skip_cache 1;
	}
	location / {
		try_files $uri $uri/ /index.php?$args;
	}   

	
 
	location ~ \.php$ {
	 	set $rt_session "";
	 	
		if ($http_cookie ~* "wp_woocommerce_session_[^=]*=([^%]+)%7C") {
               		set $rt_session wp_woocommerce_session_$1;
       		}	
	
		if ($skip_cache = 0 ) {
			more_clear_headers "Set-Cookie*";
			set $rt_session "";
		}
		
	        fastcgi_cache_key "$scheme$request_method$host$request_uri$rt_session";

		try_files $uri =404;
		include fastcgi_params;
		fastcgi_pass php;

		fastcgi_cache_bypass $skip_cache;
	        fastcgi_no_cache $skip_cache;

		fastcgi_cache WORDPRESS;
		fastcgi_cache_valid  60m;
	}

	include /etc/nginx/common/wpcommon.conf;
	include /etc/nginx/common/locations.conf;

}

Wie es funktioniert?

Cache Produktseiten

Die folgende Zeile hat keine /products.*-Seite. Dies weist Nginx an, standardmäßig alle Produktseiten zwischenzuspeichern. Stellen Sie sicher, dass Ihre Store-URL nicht von Nginx Cache BYPASS ist.

Schnell ladende Produktseiten verbessern die Skalierbarkeit eines Shops und auch die Konvertierung.

# Don't cache uris containing the following segments
if ($request_uri ~* "(/shop.*|/cart.*|/my-account.*|/checkout.*|/addons.*|/wp-admin/|/xmlrpc.php|wp-.*.php|index.php") {
    set $skip_cache 1;
}

Stoppen Sie das Caching, sobald ein Besucher etwas zum Warenkorb hinzufügt

WooCommerce verwendet einen Cookie woocommerce_items_in_cart, um zu verfolgen, ob etwas zum Warenkorb hinzugefügt wurde. Es ist standardmäßig 0 (Null). Der Wert ändert sich auf "1" (eins), sobald ein Besucher das erste Produkt in den Warenkorb legt. Der Wert bleibt "1", auch wenn ein Benutzer mehr Artikel zum Warenkorb hinzufügt. Der Cookie wird als Binärflag verwendet.

if ( $cookie_woocommerce_items_in_cart = "1" ){
     set $skip_cache 1;
}

Das obige Code-Snippet beginnt, den Cache zu überspringen, sobald das erste Element zum Warenkorb hinzugefügt wird.

Verhindern Sie einzigartige WooCommerce-Session für "Schaufensterbummler"

WooCommerce legt standardmäßig einen Sitzungscookie für jeden neuen Besucher fest.

Wenn ein Cookie-Header im FastCgi-Cache von Nginx zwischengespeichert wird, wird dieser Cookie an alle Besucher gesendet, die "Session-Konflikt" oder "Cart-Konflikt" erstellen.

In einfachen Worten, er kümmert sich nicht um Cookies, Gegenstände, die von einem Besucher hinzugefügt wurden, könnten in einem anderen Besucher-Einkaufswagen erscheinen.

Also müssen wir Cookies für "Schaufensterkäufer" verhindern.

more_clear_headers ist ein NGINX-Modul, das den Set-Cookie Header von der PHP / WordPress-HTTP-Antwort vor dem Upstream löscht.

if ($skip_cache = 0 ) {
    more_clear_headers "Set-Cookie*";
    set $rt_session "";
}

Verfolgen Sie WooCommerce-Sessions für "echte Käufer"

Die dritte Zeile im obigen Codeblock hat eine Variable $rt_session. Dies ist eine benutzerdefinierte NGINX-Variable, die den gleichen Wert hat, wenn zwischengespeicherte Seiten bedient werden sollen.

Derselbe Wert ist akzeptabel, da alle zwischengespeicherten Seiten gleich aussehen. Die benutzerdefinierte Variable wird innerhalb von NGINX fastcgi-cache key in der Zeile verwendet:

fastcgi_cache_key "$scheme$request_method$host$request_uri$rt_session";

Die benutzerdefinierte Variable $rt_session wird weiterhin verwendet, um für jede Einkaufssitzung einen eindeutigen Wert festzulegen. Dies ist erforderlich, da verschiedene Benutzer unterschiedliche Einkaufswageninhalte haben können. Sie dürfen also den Cache des anderen nicht sehen.

Dies geschieht durch folgende Zeilen:

if ($http_cookie ~* "wp_woocommerce_session_[^=]*=([^%]+)%7C") {
        set $rt_session wp_woocommerce_session_$1;
}

Oben setzen Sie $rt_session im Wesentlichen auf wp_woocommerce_session_ id.

Diese Variable wird bei jeder Anfrage gesetzt, aber die Zeilenmenge $ rt_session ""; Im vorherigen Schritt stellen wir sicher, dass wir keinen eindeutigen Cache-Schlüssel für "Schaufensterkäufer" haben. Dies vermeidet eine Cache-Fragmentierung.

Anmerkungen

Diese Technik könnte einige WooCommerce Addons zerstören, die von Anfang an von wp_woocommerce_session abhängig sind. In Wirklichkeit habe ich noch kein einziges Addon gesehen. Aber wir haben kaum ein Dutzend WooCommerce-Addons getestet.

Links: