Wie man Inhalte im NGINX zwischenspeichert

NGINX ist ein konsolidierter Open-Source-, Hochleistungs-Webserver, der die Bereitstellung von Inhalten und Anwendungen beschleunigt, die Sicherheit verbessert und die Skalierbarkeit erhöht. Einer der häufigsten Anwendungsfälle von Nginx ist das Inhalts-Caching, was der effektivste Weg ist, um die Leistung einer Website zu verbessern.

Mehr lesen: 10 Top Open Source Caching Tools für Linux

Sie können NGINX verwenden, um lokale Ursprungsserver zu beschleunigen, indem Sie es so konfigurieren, dass es Antworten von Upstream-Servern zwischenspeichert, und auch um Edge-Server für Content-Delivery-Netzwerke (CDNs) zu erstellen. NGINX ist die Grundlage einiger der größten CDNs.

Bei Konfiguration als Cache wird NGINX folgendes tun:

  • statischen und dynamischen Inhalt zwischenspeichern.
  • die Leistung von dynamischem Inhalt mit Mikro-Caching verbessern.
  • veralteten Inhalt bereitstellen, während im Hintergrund eine Neuprüfung für bessere Leistung stattfindet.
  • Cache-Control-Header überschreiben oder setzen und mehr.

In diesem Artikel erfahren Sie, wie Sie NGINX als Inhalts-Caching unter Linux konfigurieren, um Ihre Webserver so effizient wie möglich zu betreiben.

Voraussetzungen:

Sie sollten NGINX auf Ihrem Linux-Server installiert haben. Wenn nicht, folgen Sie diesen Anleitungen zur Installation von Nginx:

Statische Inhalte im Nginx cachen

Statische Inhalte sind Inhalte einer Webseite, die auf allen Seiten gleich bleiben (nicht ändern). Beispiele für statische Inhalte sind Dateien wie Bilder, Videos, Dokumente; CSS-Dateien und JavaScript-Dateien.

Wenn Ihre Webseite viel statischen Inhalt verwendet, können Sie das Performanceoptimieren aktivieren, indem Sie Client-seitiges Caching aktivieren, bei dem der Browser Kopien von statischen Inhalten speichert, um schneller zugreifen zu können.

Die folgende Testkonfiguration ist eine gute Vorgehensweise, nur ersetzen Sie www.example.com mit dem URL Ihrer Webseite und passen Sie andere Pfadnamen entsprechend an.

server {
    # substitute your web server's URL for www.example.com
    server_name www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

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

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

    location ~ .php$ {
        try_files $uri =404;
        include fastcgi_params;
        # substitute the socket, or address and port, of your WordPress server
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
 	}   

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

Dynamischen Inhalt im Nginx cachen

NGINX verwendet ein persistentes Laufwerkbasiertes Cache, das irgendwo im lokalen Dateisystem liegt. Starten Sie daher mit der Erstellung des lokalen Laufwerkverzeichnisses, das zum Speichern von zwischengespeicherten Inhalten genutzt wird.
# mkdir -p /var/cache/nginx

Weiterhin setzen Sie die passende Eigentumsrechte auf dem Cacheverzeichnis. Es sollte dem NGINX-Benutzer (nginx) und der Gruppe (nginx) gehören. Fahren Sie mit dem Weiterlesen fort, um zu sehen, wie Sie dynamischen Inhalt in Nginx aktivieren können.

# chown nginx:nginx /var/cache/nginx

Jetzt gehen Sie weiter, um zu sehen, wie Sie im folgenden Abschnitt das schnelle CGI-Cache in NGINX aktivieren können.

Aktivieren des FastCGI-Caches in NGINX

FastCGI (oder FCGI) ist ein weit verbreitetes Protokoll zur Schnittstellensteuerung interaktiver Anwendungen wie PHP mit Webservern wie NGINX. Es handelt sich um eine Erweiterung der CGI (Common Gateway Interface).

Der Hauptvorteil von FCGI besteht darin, dass es mehrere CGI-Anfragen in einem einzigen Prozess verwaltet. Ohne dies müsste der Webserver für jeden Client-Anfrage einen neuen Prozess öffnen (der gesteuert, eine Anfrage verarbeiten und geschlossen werden muss), um einen Dienst bereitzustellen.

Zur Verarbeitung von PHP-Skripten in einer LEMP-Stack-Bereitstellung verwendet NGINX FPM (FastCGI Process Manager) oder PHP-FPM, eine beliebte alternative PHP FastCGI-Implementierung. Sobald der PHP-FPM-Prozess läuft, ist NGINX so konfiguriert, dass Anfragen zur Verarbeitung an ihn weitergeleitet werden. Dadurch kann NGINX auch so konfiguriert werden, dass Antworten vom Backend-Anwendungsserver PHP-FPM zwischengespeichert werden.

Unter NGINX wird der FastCGI-Inhalts-Cache mit einer Direktive namens fastcgi_cache_path im obersten http{}-Kontext innerhalb der NGINX-Konfigurationsstruktur deklariert. Sie können auch den fastcgi_cache_key hinzufügen, der einen Schlüssel (Anfragekennung) für die Zwischenspeicherung definiert.

Außerdem fügen Sie die Direktive add_header X-Cache-Status innerhalb des http{}-Kontexts hinzu – dies ist nützlich für Debugging-Zwecke.

Angenommen, die Konfigurationsdatei des Serverblocks Ihrer Website befindet sich unter /etc/nginx/conf.d/testapp.conf oder /etc/nginx/sites-available/testapp.conf (unter Ubuntu und seinen Derivaten), öffnen Sie die Datei zur Bearbeitung und fügen Sie die folgenden Zeilen oben in die Datei ein.

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHEZONE:10m; inactive=60m max_size=40m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;
Enable FastCGI Cache in NGINX

Die Direktive fastcgi_cache_path legt die Anzahl der Parameter fest, die wie folgt sind:

  • /var/cache/nginx – der Pfad zum lokalen Verzeichnis auf der Festplatte für den Cache.
  • levels – definiert die Hierarchieebenen eines Caches, es wird eine zweistufige Verzeichnishierarchie unter /var/cache/nginx eingerichtet.
  • keys_zone (name:size) – ermöglicht die Erstellung einer gemeinsamen Speicherzone, in der alle aktiven Schlüssel und Informationen über Daten (Metadaten) gespeichert werden. Beachten Sie, dass das Speichern der Schlüssel im Arbeitsspeicher den Überprüfungsprozess beschleunigt, indem es für NGINX einfacher wird festzustellen, ob es sich um einen MISS oder HIT handelt, ohne den Status auf der Festplatte zu überprüfen.
  • inactive – legt fest, nach welcher Zeitspanne zwischengespeicherte Daten, die während der angegebenen Zeit nicht abgerufen werden, unabhängig von ihrer Aktualität aus dem Cache gelöscht werden. Ein Wert von 60m in unserer Beispielkonfiguration bedeutet, dass Dateien, die nach 60 Minuten nicht abgerufen wurden, aus dem Cache entfernt werden.
  • max_size – gibt die maximale Größe des Caches an. Hier können weitere Parameter verwendet werden (lesen Sie die NGINX-Dokumentation für weitere Informationen).

Die Variablen in der Anweisung fastcgi_cache_key werden unten beschrieben.

NGINX verwendet sie zur Berechnung des Schlüssels (Identifikator) einer Anfrage. Wichtig ist, dass eine zwischengespeicherte Antwort an den Client gesendet werden kann, wenn die Anfrage den gleichen Schlüssel wie eine zwischengespeicherte Antwort hat.

  • $scheme – Anfrageschema, HTTP oder HTTPS.
  • $request_method – Anfragemethode, normalerweise „GET“ oder „POST“.
  • $host – dies kann der Hostname aus der Anforderungszeile oder der Hostname aus dem „Host“ Anforderungskopffeld oder der Servername sein, der mit einer Anfrage übereinstimmt, in der Reihenfolge der Priorität.
  • $request_uri – bedeutet die vollständige ursprüngliche Anforderungs-URI (mit Argumenten).

Außerdem wird die Variable $upstream_cache_status in der Anweisung add_header X-Cache-Status für jede Anfrage berechnet, auf die NGINX antwortet, unabhängig davon, ob es sich um ein MISS (Antwort im Cache nicht gefunden, vom Anwendungsserver erhalten) oder ein HIT (Antwort aus dem Cache bereitgestellt) oder einen der anderen unterstützten Werte handelt.

Dann verwendet die location Anweisung, die PHP-Anfragen an PHP-FPM weiterleitet, die fastcgi_cache Anweisungen, um den gerade definierten Cache zu aktivieren.

Legen Sie auch die Cache-Zeit für verschiedene Antworten mit der Anweisung fastcgi_cache_valid fest, wie gezeigt.

fastcgi_cache CACHEZONE;
fastcgi_cache_valid  60m;
Define Caching Zone and Time

Wenn nur die Zwischenspeicherzeit angegeben ist, wie in unserem Fall, werden nur 200, 301 und 302 Antworten zwischengespeichert. Sie können jedoch auch die Antworten explizit angeben oder beliebige (für beliebigen Antwortcode) verwenden:

fastcgi_cache CACHEZONE;
fastcgi_cache_valid 200  301 203 60m;
fastcgi_cache_valid 404 10m;
OR
fastcgi_cache CACHEZONE;
fastcgi_cache_valid  any 10m;

Feinabstimmung der FastCGI-Caching-Performance auf Nginx

Um die minimale Anzahl von Anfragen mit demselben Schlüssel festzulegen, die gestellt werden müssen, bevor die Antwort zwischengespeichert wird, fügen Sie die Anweisung fastcgi_cache_min_uses in den http{}-, server{}– oder location{}-Kontext ein.

fastcgi_cache_min_uses  3
Set Minimum Cache Usage

Um die Überprüfung abgelaufener Zwischenspeichereinträge mit bedingten Anfragen unter Verwendung der Headerfelder „If-Modified-Since“ und „If-None-Match“ zu aktivieren, fügen Sie die Anweisung fastcgi_cache_revalidate in den http{}-, server{}– oder location{}-Kontext ein.

fastcgi_cache_revalidate on;
Set Cache Re-validation

Sie können auch NGINX anweisen, zwischengespeicherten Inhalt auszuliefern, wenn der Ursprungsserver oder der FCGI-Server nicht erreichbar ist, indem Sie die Anweisung proxy_cache_use_stale innerhalb der location-Anweisung verwenden.

Diese Beispieleinstellung bedeutet, dass wenn NGINX einen Fehler, eine Zeitüberschreitung oder einen der angegebenen Fehler vom Upstream-Server empfängt und eine veraltete Version der angeforderten Datei im zwischengespeicherten Inhalt hat, liefert es die veraltete Datei aus.

proxy_cache_use_stale error timeout http_500;
Enable Serving of Stale Data

Eine weitere nützliche Anweisung zur Feinabstimmung der FCGI-Caching-Performance ist fastcgi_cache_background_update, die in Verbindung mit der Anweisung proxy_cache_use_stale funktioniert. Wenn sie auf „on“ gesetzt ist, weist sie NGINX an, veraltete Inhalte zu servieren, wenn Clients nach einer Datei fragen, die abgelaufen ist oder gerade aktualisiert wird.

fastcgi_cache_background_update on;
Enable Cache Background Update

Auch fastcgi_cache_lock ist nützlich zur Feinabstimmung der Cache-Performance. Wenn mehrere Clients nach demselben Inhalt fragen, der nicht im Cache vorhanden ist, leitet NGINX nur die erste Anfrage an den Upstream-Server weiter, speichert die Antwort im Cache und bedient die anderen Client-Anfragen aus dem Cache.

fastcgi_cache_lock on;
Enable Cache Lock

Nachdem Sie alle oben genannten Änderungen in der Konfigurationsdatei von NGINX vorgenommen haben, speichern und schließen Sie sie. Überprüfen Sie dann die Konfigurationsstruktur auf Syntaxfehler, bevor Sie den NGINX-Dienst neu starten.

# nginx -t
# systemctl restart nginx
Check and Start Nginx Service

Als nächstes testen Sie, ob der Cache ordnungsgemäß funktioniert, indem Sie versuchen, auf Ihre Webanwendung oder Website mit dem folgenden curl-Befehl zuzugreifen (beim ersten Mal sollte ein MISS angezeigt werden, aber nachfolgende Anfragen sollten einen HIT anzeigen, wie im Screenshot gezeigt).

# curl -I http://testapp.tecmint.com
Test FastCGI Cache

Hier ist ein weiterer Screenshot, der zeigt, wie NGINX veraltete Daten serviert.

Test Nginx Serving Stale Data

Hinzufügen von Ausnahmen, um den Cache zu umgehen.

Es ist möglich, Bedingungen festzulegen, unter denen NGINX mit der Direktive fastcgi_cache_bypass keine zwischengespeicherten Antworten an Clients senden soll. Um NGINX anzuweisen, überhaupt keine Antworten vom Upstream-Server zu zwischenspeichern, verwenden Sie die Direktive fastcgi_no_cache.

Zum Beispiel, wenn Sie möchten, dass POST Anfragen und URLs mit einer Query-String immer an PHP gesendet werden. Erstellen Sie zunächst eine if-Anweisung, um die Bedingung festzulegen, wie folgt.

set $skip_cache 0; 
if ($request_method = POST) { 
	set $skip_cache 1; 
} 

Aktivieren Sie dann die oben genannte Ausnahme in der location-Direktive, die PHP-Anfragen an PHP-FPM weiterleitet, indem Sie die Direktiven fastcgi_cache_bypass und fastcgi_no_cache verwenden.

 
fastcgi_cache_bypass $skip_cache; 
fastcgi_no_cache $skip_cache;

Es gibt viele andere Teile Ihrer Website, für die Sie möglicherweise keine Inhaltszwischenspeicherung aktivieren möchten. Die folgende Beispielkonfiguration von NGINX verbessert die Leistung einer WordPress-Website und stammt aus dem Blog nginx.com.

Um sie zu verwenden, ändern Sie die Einstellungen (wie Domain, Pfade, Dateinamen usw.), um Ihre Umgebung widerzuspiegeln.

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"; 
server { 
	server_name example.com www.example.com; 
	root /var/www/example.com; 
	index index.php; 
	access_log /var/log/NGINX/example.com.access.log; 
	error_log /var/log/NGINX/example.com.error.log; 
	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 /index.php; 
		include fastcgi_params; 
		fastcgi_pass unix:/var/run/php5-fpm.sock; 
		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|css|rss|atom|js|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; 
	} 
}

Aktivieren des Proxy-Caches in NGINX

NGINX unterstützt auch das Zwischenspeichern von Antworten anderer Proxy-Server (definiert durch die Direktive proxy_pass). In diesem Testfall verwenden wir NGINX als Reverse-Proxy für eine Node.js-Webanwendung, daher werden wir NGINX als Cache für die Node.js-Anwendung aktivieren. Alle hier verwendeten Konfigurationsdirektiven haben ähnliche Bedeutungen wie die FastCGI-Direktiven im vorherigen Abschnitt, daher werden wir sie nicht erneut erläutern.

Um die Zwischenspeicherung von Antworten eines durch einen Proxy geleiteten Servers zu aktivieren, sollten Sie die Direktive proxy_cache_path im obersten Level des http{} Kontextes einbeziehen. Um zu bestimmen, wie Anfragen zwischengespeichert werden, können Sie auch die Direktive proxy_cache_key hinzufügen, wie folgt.

proxy_cache_path /var/cache/nginx app1 keys_zone=PROXYCACHE:100m inactive=60m max_size=500m;
proxy_cache_key  "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_min_uses 3;

Weiterhin sollten Sie den Zwischenspeicher im Ortungsdirektiv aktivieren.

location / {
	proxy_pass http://127.0.0.1:3000;
	proxy_cache        PROXYCACHE;
	proxy_cache_valid 200 302 10m;
	proxy_cache_valid 404      1m;
}

Um zu definieren, unter welchen Bedingungen NGINX keinen zwischengespeicherten Inhalt sendet und keine Antwort vom Upstream-Server zwischen speichert, sollten Sie die Direktiven proxy_cache_bypass und proxy_no_cache aufnehmen.

 
proxy_cache_bypass  $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache        $http_pragma $http_authorization;

Feineinstellung der Leistung des Proxy-Zwischenspeichers

Die folgenden Direktiven sind nützlich für die Feineinstellung der Leistung des Proxy-Zwischenspeichers. Sie haben auch die gleichen Bedeutungen wie die FastCGI-Direktiven.

proxy_cache_min_uses 3;
proxy_cache_revalidate on;
proxy_cache_use_stale error timeout updating http_500;
proxy_cache_background_update on;
proxy_cache_lock on;

Weitere Informationen und Konfigurationsdirektiven für Zwischenspeicherung finden Sie in der Dokumentation der beiden Hauptmodule ngx_http_fastcgi_module und ngx_http_proxy_module.

Zusätzliche Ressourcen: NGINX-Inhaltszwischenspeicherung und Tips for Improving WordPress Performance.

Source:
https://www.tecmint.com/cache-content-with-nginx/