<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SysEleven - Hosting für Fortgeschrittene &#187; Cache</title>
	<atom:link href="http://www.syseleven.de/tag/cache/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.syseleven.de</link>
	<description></description>
	<lastBuildDate>Tue, 24 Jan 2012 16:33:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Lastverteilung und Caching mit Nginx</title>
		<link>http://www.syseleven.de/blog/1756/lastverteilung-und-caching-mit-nginx/</link>
		<comments>http://www.syseleven.de/blog/1756/lastverteilung-und-caching-mit-nginx/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 09:49:03 +0000</pubDate>
		<dc:creator>Andreas Mauf</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Lastverteilung]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Proxy]]></category>

		<guid isPermaLink="false">http://www.syseleven.de/?p=1756</guid>
		<description><![CDATA[Nginx (sprich "engine x") ist ein sogenannter Reverse Proxy. Dieser kann sowohl die Last auf mehrere Anwendungsserver verteilen, aber auch Dateien zwischenspeichern und diese selbst an den Browser ausliefern.]]></description>
			<content:encoded><![CDATA[<p>Nginx (sprich &#8220;engine x&#8221;) ist ein sogenannter Reverse Proxy. Dieser kann sowohl die Last auf mehrere Anwendungsserver verteilen, aber auch Dateien zwischenspeichern und diese selbst an den Browser ausliefern.</p>
<h2>Lastverteilung</h2>
<p>Als klassischer Loadbalancer wird <a href="http://wiki.nginx.org/Main">Nginx</a> an vorderster Front der Serverarchitektur eingesetzt und erhält somit alle eingehenden Anfragen der Webseitenbesucher. Die Verteilung auf die dahinter liegenden Anwendungsserver erfolgt im Rundlauf-Verfahren (<a href="http://de.wikipedia.org/wiki/Round_Robin_(Informatik)">Round Robin</a>) oder unter Berücksichtigung von Parametern wie der Gewichtung. </p>
<pre class="brush: plain; title: ; notranslate">
upstream appserver {
  server app1.webseite.tld weight=5;
  server app2.webseite.tld weight=5;
}

location / {
  proxy_pass http://appserver;
}
</pre>
<h2>Zwischenspeicherung</h2>
<p>Die Anwendungsserver sind meist mit PHP-Modulen dick bepackt und haben daher einen großen Speicher-Fußabdruck. 20 bis 30 MB sind da keine Seltenheit. Der Nginx im Vergleich dazu hat meist nur rund 5 MB. Es macht daher Sinn vor allem statische Dateien wie Bilder, CSS und Javascripte für mind. 24 Stunden zwischenzuspeichern und die Anwendungsserver damit zu entlasten. Über die <code>location</code>-Anweisung kann gesteuert werden, welcher Teil der Webseite wie gecached werden soll.</p>
<pre class="brush: plain; title: ; notranslate">
proxy_cache_key $host$request_uri;
proxy_cache_path /var/www/cache/images  levels=1:2 keys_zone=images:500m;

location /images {
  proxy_cache images;
  proxy_cache_valid 24h;
  proxy_pass http://appserver;
}
</pre>
<p>Möchte man einen Eintrag im Zwischenspeicher vorzeitig löschen, etwa um eine neue CSS-Datei zu veröffentlichen, benutzt man entweder Versionsnummern, die an die URL per GET angehängt werden, oder das &#8220;<a href="http://labs.frickle.com/nginx_ngx_cache_purge/">ngx_cache_purge</a>&#8220;-Modul und eine spezielle Lösch-URL nach dem Schema &#8220;http://www.webseite.tld/cache-purge/?url=www.webseite.tld/images/bild1.jpg&#8221;.</p>
<pre class="brush: plain; title: ; notranslate">
location ^~ /cache-purge/ {
  allow 127.0.0.1;
  deny all;
  proxy_cache_purge images $arg_url;
}
</pre>
<h2>Auswertung</h2>
<p>Um eine <em>Hit Rate</em>, also die Anzahl der Anfragen, die direkt aus dem Zwischenspeicher bedient werden konnten, im Verhältnis zur Summe aller Anfragen zu berechnen, sollte das Protokoll im Nginx aktiviert und weitere Infos ergänzt werden: Konnte die Anfrage aus dem Cache bedient werden? Welcher Anwendungsserver hat die Anfrage verarbeitet und wie lange hat er dafür benötigt.</p>
<pre class="brush: plain; title: ; notranslate">
log_format proxy '[$time_local] Cache: $upstream_cache_status $upstream_addr $upstream_response_time $status $bytes_sent $proxy_add_x_forwarded_for $request_uri';

access_log /var/log/nginx/webseite.tld.access_log proxy;
</pre>
<div id="attachment_1795" class="wp-caption aligncenter" style="width: 430px"><a href="http://www.syseleven.de/wp-content/uploads/2011/06/nginx-hits.png"><img src="http://www.syseleven.de/wp-content/uploads/2011/06/nginx-hits-420x93.png" alt="" title="Nginx, Cache-Hits pro Sekunde" width="420" height="93" class="size-medium wp-image-1795" /></a><p class="wp-caption-text">Nginx, Cache-Hits pro Sekunde</p></div>
<h2>Schmankerl</h2>
<p>Nutzt die Webseite SSL macht es Sinn auch diesen Prozess in den Proxy auszulagern. So entfällt auf allen Anwendungsserver die SSL-Konfiguration, das Laden des SSL-Moduls und natürlich auch der Aufwand durch die Aushandlung der SSL-Verbindung.</p>
<pre class="brush: plain; title: ; notranslate">
ssl on;
ssl_certificate /etc/ssl/private/webseite.tld.crt
ssl_certificate_key /etc/ssl/private/webseite.tld.key;
</pre>
<p>Die Komprimierung von Text-Dateien spart erheblich Übertragungszeit und Netzwerktraffic, belastet allerdings auch den Prozessor und sollte daher ebenfalls auf den Proxy ausgelagert werden. Denn dieser benötigt selbst kaum Rechenleistung.</p>
<pre class="brush: plain; title: ; notranslate">
gzip on
gzip_types text/plain application/xml;
gzip_disable &quot;MSIE [1-6]\.&quot;
</pre>
<div id="attachment_1810" class="wp-caption aligncenter" style="width: 430px"><a href="http://www.syseleven.de/wp-content/uploads/2011/06/nginx-cpu.png"><img src="http://www.syseleven.de/wp-content/uploads/2011/06/nginx-cpu-420x141.png" alt="" title="Nginx, CPU-Auswertung, 2x Xeon @ 2.33GHz" width="420" height="141" class="size-medium wp-image-1810" /></a><p class="wp-caption-text">Nginx, CPU-Auswertung, 2x Xeon @ 2.33GHz</p></div>
<h2>Fazit</h2>
<p>Der Nginx hat sich als bei SysEleven als Proxy bewährt. Er ist robust und vielseitig konfigurierbar. Statische Dateien kann er leicht und effektiv zwischenspeichern und selbst ausliefern. Mit weiteren Modulen wie FastCGI, Memcached und SSI kann er zum wahren Multi-Talent werden. Doch dazu später mehr.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.syseleven.de/blog/1756/lastverteilung-und-caching-mit-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>APC: Turbo für PHP Webseiten</title>
		<link>http://www.syseleven.de/blog/1009/apc-turbo-fur-php-webseiten/</link>
		<comments>http://www.syseleven.de/blog/1009/apc-turbo-fur-php-webseiten/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 09:25:46 +0000</pubDate>
		<dc:creator>Thomas Lohner</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.syseleven.de/?p=1009</guid>
		<description><![CDATA[Die Geschwindigkeit einer PHP basierten Webseite lässt mich mit einfachen Mitteln verbessern. Wordpress zum Beispiel wird mit APC viermal schneller.]]></description>
			<content:encoded><![CDATA[<p>Im Gegensatz zu anderen Programmiersprachen werden PHP-Skripte während des Aufrufs kompiliert, d.h. in eine ausführbare Form übersetzt und ausgeführt. Dieser Prozess wird bei jedem einzelnen Aufruf der Datei wiederholt. Das ist wenig effizient und lässt sich mit verschiedenen Mitteln leicht ändern.</p>
<p><a href="http://de.php.net/manual/de/book.apc.php">APC</a> ist ein so genannter &#8220;Opcode Cache&#8221;. Die Aufgabe von APC ist es, sich den aufwendigen Kompiliervorgang für spätere Zugriffe zu merken, damit dieser nur einmal ausgeführt werden muss. Bei jedem weiteren Aufruf der Datei liegt diese bereits vorkompiliert im Arbeitsspeicher.</p>
<h2>Wie viel schneller wird meine Webseite?</h2>
<p>Als Beispiel habe ich die Performance <del>einer</del> unserer WordPress-Installationen gemessen. Mit dem Tool Apache Bench (alternativ http_load oder jmeter) kann man ermitteln wie oft eine Webseite in einem festgelegten Zeitraum aufgerufen werden kann. Daraus ergibt sich die Geschwindigkeit der Webseite in der Einheit &#8220;Aufrufe pro Sekunde&#8221; (Requests per second). Je höher diese Zahl, desto schneller ist die Webseite. Oder anders herum, desto mehr Anfragen können je Zeiteinheit bearbeitet werden.</p>
<p><br/><b>Test 1: WordPress mit standard PHP</b><br />
<div class="special-outer"><div class="special-inner"><code>ab -t 60 -c 20 http://SysEleven.de/</p>
<p>Time taken for tests:   60 seconds<br />
Complete requests:      341<br />
Requests per second:    5.66 [#/sec]<br />
</code><br />
</div></div></p>
<p><br/><b>Test 2: WordPress mit aktiviertem APC</b><br />
<div class="special-outer"><div class="special-inner"><code>ab -t 60 -c 20 http://SysEleven.de/</p>
<p>Time taken for tests:   60 seconds<br />
Complete requests:      1294<br />
Requests per second:    21.57 [#/sec]<br />
</code><br />
</div></div></p>
<h2>Ein Fazit</h2>
<p>WordPress ist mit APC knapp <b>viermal schneller</b> als ohne. Aber: Wie viel schneller eine Webseite tatsächlich wird, hängt von der verwendeten Software ab. <b>Wichtig:</b> Nicht jede Software ist kompatibel zu APC, aber ein Versuch lohnt sich allemal. </p>
<p>Die Auslastung des Caches und die Erfolgsquote (Hits/Misses) ist, stellt APC in Diagrammen dar:</p>
<p><img src="http://www.syseleven.de/wp-content/uploads/2010/03/apc_status.gif" alt="" title="apc_status" width="425" height="224" class="aligncenter size-full wp-image-1031" /></p>
<h2>Alternativen</h2>
<p>Neben APC gibt es noch <a href="http://eaccelerator.net/">eAccelerator</a> und <a href="http://xcache.lighttpd.net/">XCache</a>. Performancemäßig nehmen die drei sich wenig, welche Software man einsetzt ist eher Geschmacksache bzw. eine Frage der Kompatibilität &#8211; was mit dem einen Cache nicht kompatibel ist, wird mit einem anderen vielleicht doch funktionieren. Das hartnäckige Gerücht, <a href="http://www.zend.com/de/products/guard/zend-optimizer">Zend Optmizer</a> gehöre auch dazu, ist übrigens falsch. Zend Optimizer &#8220;optimiert&#8221; zwar den Quellcode, ist aber kein Cache und merkt sich diese Verbesserungen nicht. Im Gegenteil: Die gleiche Arbeit wird bei jedem Aufruf erneut ausgeführt. Aus Sicht der Performance ist das wenig förderlich, weil es durch die ständige Mehrarbeit die Ausführung von PHP sogar noch verlangsamen kann.</p>
<h1>Links</h1>
<p><a href="http://de.php.net/manual/de/book.apc.php">http://de.php.net/manual/de/book.apc.php</a><br />
<a href="http://www.zend.com/de/community/php">http://www.zend.com/de/community/php</a><br />
<a href="http://eaccelerator.net/">http://eaccelerator.net/</a><br />
<a href="http://xcache.lighttpd.net/">http://xcache.lighttpd.net/</a><br />
<a href="http://httpd.apache.org/docs/2.2/programs/ab.html">http://httpd.apache.org/docs/2.2/programs/ab.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.syseleven.de/blog/1009/apc-turbo-fur-php-webseiten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

