Reverse proxy caching

Transcrição

Reverse proxy caching
Performance durch Caching
Fabrizio Branca
System Developer bei AOE media
Mail:
mail (at) fabrizio (minus) branca (dot) de
Twitter:
@fbrnc
http://www.fabrizio-branca.de
Blog:
Agenda
Einführung
Probleme und
Optimierungen
Reverse Proxy
Caching
mit Varnish
Agenda
Einführung
Probleme und
Optimierungen
Reverse Proxy
Caching
mit Varnish
Funktionsweise Cache
Mage::app()->getCacheInstance()
Mage_Core_Model_Cache
Mage::app()->getCache() oder
Mage::app()->getCacheInstance()->getFrontend()
Varien_Cache_Core
… extends
Zend_Cache_Backend
Two-Level Cache
Mehr Details:
http://www.fabrizio-branca.de/magento-caching-internals.html
Agenda
Einführung
Probleme und
Optimierungen
Reverse Proxy
Caching
mit Varnish
Alte Cache-Einträge entfernen
• Problem: Abgelaufene Cache-Einträge werden
nicht gelöscht und sammeln sich an.
• Je größer der Cache, desto langsamer der
Zugriff
Alte Cache-Einträge entfernen
• Lösung: Regelmäßig Cache aufräumen
Mage::app()->getCache()->clean(Zend_Cache::CLEANING_MODE_OLD);
• Modul: Aoe_CacheCleaner
http://www.fabrizio-branca.de/magento-automatic-cachecleaner.html
• Github:
https://github.com/fbrnc/Aoe_CacheCleaner
Alte Cache-Einträge entfernen
Alte Cache-Einträge entfernen
Probleme im Database Cache Backend:
• Fehlerhaftes SQL
– Einige „?“ fehlen
• Tags werden nicht gelöscht
– In 0.8.22 wurde ein Foreign-Key eingefügt, der die
Tags „on delete“ löscht. In 0.8.27 wurde der Key
wieder entfernt.
• Patch:
https://gist.github.com/971318
Problem: Tag-Basiertes Löschen
• Wird innerhalb Magento sehr oft verwendet
• Wird vom APC Backend nicht unterstützt
• Kann extrem lange dauern, wenn das File
Backend verwendet wird.
– Lösung: Cache-Commands abfangen, in eine
Queue schreiben und asynchron abarbeiten.
– Beschleunigt außerdem auch den ImportVorgang
– http://www.fabrizio-branca.de/magentoasynchronous-cache.html
– https://github.com/fbrnc/Aoe_AsyncCache
Bug: 1st-Level Cache Priorität
Bug: 1st-Level Cache Priorität
Bug: 1st-Level Cache Priorität
$priority = 10
class Varien_Cache_Core extends Zend_Cache_Core {
[…]
public function save($data, $id = null, $tags = array(),
$specificLifetime = false, $priority = 8) {
$tags = $this->_tags($tags);
return parent::save($data, $id, $tags, $specificLifetime, $priority);
}
[…]
}
class Zend_Cache_Backend_TwoLevels […] {
private function _getFastLifetime($lifetime, $priority, $maxLifetime = null) {
[…]
$fastLifetime = (int) ($lifetime / (11 - $priority));
[…]
return $fastLifetime;
}
}
Bug: 1st-Level Cache Priorität
• Patch:
https://gist.github.com/971320
Weitere Probleme
• Fast cache wird immer neu geschrieben
auto_refresh_fast_cache = true
=> auto_refresh_fast_cache = false
• Kann inzwischen konfiguriert werden (default: false)
• Verzeichnistiefe des File Cache
hashed_directory_level = 1
=> hashed_directory_level = 3
• APC-Parameter (Größe, apc.stat, apc.ttl)
http://www.fabrizio-branca.de/wenn-der-apc-cachevolllaeuft.html
Agenda
Einführung
Probleme und
Optimierungen
Reverse Proxy
Caching
mit Varnish
Reverse proxy caching
Request
Magento
Browser
Response
(Apache + PHP + Mysql)
Reverse proxy caching
Browser
Varnish
Magento
(Apache + PHP + Mysql)
Reverse proxy caching
Browser
Nginx
-Verschlüsselung /
Entschlüsselung (SSL)
-Kompression
Varnish
Magento
(Apache + PHP + Mysql)
Reverse proxy caching
Browser
Nginx
Varnish
Magento
(Apache + PHP + Mysql)
Varnish
HTTP
Accelerator
Caching
Reverse Proxy
Load
Balancer
Failover
system
„Varnish makes websites fly“
Varnish
• Entwickelt von Poul-Henning Kamp
• Varnish Configuration Language (VCL)
– DSL, wird intern in C Code übersetzt und
dann compiliert
• Varnish überlässt die Thread- und
Speicherverwaltung dem Betriebssystem
• Weitere Tools: varnishtop, varnishlog,…
• Online-Dokumentation:
http://www.varnish-cache.org/docs/2.1/
Installation
• In Ubuntu:
sudo apt-get install varnish
sudo vi /etc/default/varnish
START=yes
sudo /etc/init.d varnish start
• Wird in Zukunft automatisch gestartet
• Läuft per default auf Port 6081
• Verwendet per default 127.0.0.1:8080 als
Backend
• /etc/varnish/default.vcl
Request Lifecycle (vereinfacht)
Kompletter Workflow: http://www.varnish-cache.org/trac/wiki/VCLExampleDefault
Cachebare Seiten
•
•
•
•
cms_index_index (Startseite)
cms_page_view (CMS Seiten)
catalog_product_view (Produkt-Singleviews)
catalog_category_view (Produkt-Listen)
(Muss ggf. an die Anforderungen und Besonderheiten des Shops angepasst
werden)
aller Page-Requests
(geschätzt)
Dynamische
(benutzerspezifische)
Inhalte
Platzhalter für dynamische Teile
<layout>
<default>
<reference name="right">
<block type="core/text" name="ph_cart" before="-">
<action method="setText"><param><![CDATA[
<div id="cart_sidebar" class="placeholder"
rel="cart_sidebar">Placeholder Cart</div>
]]></param></action>
</block>
<action method="unsetChild"><param>cart_sidebar</param></action>
</reference>
</default>
</layout>
Modul „Aoe_Static“
• Sendet HTTP Header um Varnish zu
steuern.
• Bindet JavaScript ein, das die
dynamischen Inhalte holt und die
Platzhalter ersetzt.
• Controller, der die dynamischen Inhalte
ausliefert.
• https://github.com/fbrnc/Aoe_Static
• https://github.com/fbrnc/Aoe_StaticDemo
Ablauf cachebare Seiten
Browser
Varnish
Seite anfordern (HTTP Request)
Statische Seite wird
ausgeliefert
Seite wird
gerendert
Magento
Seite anfordern
Statische Seite wird ausgeliefert.
Platzhalter für dynamische Teile.
Cache-Control Header
Ajax Request fordert dynamische Inhalte an
und übermittelt gerade angesehenes Produkt
JSON Response mit dynamischen Inhalten
Platzhalter werden ersetzt
Session Cookie wird geschrieben
Ablauf nicht-cachebare Seiten
Browser
Varnish
Seite anfordern (HTTP Request)
Seite wird ausgeliefert
Seite wird
gerendert
Magento
Seite anfordern
VCL
sub vcl_recv {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For ", " client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT"
&& req.request != "POST" && req.request != "TRACE"
&& req.request != "OPTIONS" && req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass);
}
return (lookup);
}
VCL
sub vcl_hash {
set req.hash += req.url;
if (req.http.host) {
set req.hash += req.http.host;
} else {
set req.hash += server.ip;
}
return (hash);
}
VCL
sub vcl_fetch {
if (beresp.status == 302 || beresp.status == 301 || beresp.status == 418) {
return (pass);
}
if (beresp.http.aoestatic == "cache") {
remove beresp.http.Set-Cookie;
remove beresp.http.X-Cache;
remove beresp.http.Server;
remove beresp.http.Age;
set beresp.grace = 2m;
set beresp.http.X_AOESTATIC_FETCH = "Removed cookie in vcl_fetch";
}
if (!beresp.cacheable) {
return (pass);
}
return (deliver);
}
VCL
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
set resp.http.Server = "Varnish (HIT)";
} else {
set resp.http.X-Cache = "MISS";
set resp.http.Server = "Varnish (MISS)";
}
}
Demo
Benchmarks
0,85
Seiten/Sekunde
Magento
ohne Cache
416,67
Seiten/Sekunde
2,4
Seiten/Sekunde
Magento mit
APC+File Cache
Magento
mit Varnish
Erweitert
• Anstatt AJAX:
Edge Side Includes „ESI“ (W3C)
<esi:include src="phone/call/getBlock/id/cart_sidebar" />
– Nachteil: langsamer, aufwendiger
• Caching dynamischer Inhalte unter
Berücksichtigung der Session-Id
– Nachteil: weniger Cache Hits
• „Purge“ um geänderte Inhalte zu
aktualisieren
Weitere Informationen
• Varnish (inkl. Dokumentation)
http://www.varnish-cache.org
• Poul-Henning Kamp über Varnish
http://vimeo.com/16676188
• http://www.fabrizio-branca.de
• https://github.com/fbrnc
Fragen?
Mail:
Twitter:
Blog:
mail (at) fabrizio (minus) branca (dot) de
@fbrnc
http://www.fabrizio-branca.de

Documentos relacionados