<?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>PHP / MySQL / Linux Stories &#187; Webserver</title>
	<atom:link href="http://xfragger.de/category/webserver/feed" rel="self" type="application/rss+xml" />
	<link>http://xfragger.de</link>
	<description>Mein Erfahrungen in der Webentwicklerwelt</description>
	<lastBuildDate>Thu, 15 Jul 2010 12:14:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>WordPress 3 MU auf lighttpd und das &#8220;langsame Bilder&#8221;-Problem</title>
		<link>http://xfragger.de/257/wordpress-3-mu-auf-lighttpd-und-das-langsame-bilder-problem</link>
		<comments>http://xfragger.de/257/wordpress-3-mu-auf-lighttpd-und-das-langsame-bilder-problem#comments</comments>
		<pubDate>Fri, 25 Jun 2010 19:32:54 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Webserver]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[blogs.php]]></category>
		<category><![CDATA[langsam]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[ms-files.php]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wordpress 3]]></category>
		<category><![CDATA[wordpress mu]]></category>

		<guid isPermaLink="false">http://xfragger.de/?p=257</guid>
		<description><![CDATA[Dieser und der ein oder andere Blog, welche hauptsächlich von meiner Frau betrieben werden, läuft nun auf WordPress 3, weil es mir auf den Geist ging immer x Blogs aktuell zu halten, laufen nun alle mit aktiviertem MU. Da auf meinem Websever lighttpd und nicht apache läuft, konnte ich mich nicht 100%ig an die Anleitung [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://xfragger.de/wp-content/uploads/2010/06/wordpress-300x299.png" rel="lightbox[257]"><img class="alignleft size-thumbnail wp-image-259" title="wordpress-300x299" src="http://xfragger.de/wp-content/uploads/2010/06/wordpress-300x299-150x150.png" alt="" width="150" height="150" /></a>Dieser und der ein oder andere Blog, welche hauptsächlich von meiner Frau betrieben werden, läuft nun auf WordPress 3, weil es mir auf den Geist ging immer x Blogs aktuell zu halten, laufen nun alle mit aktiviertem MU.</p>
<p>Da auf meinem Websever lighttpd und nicht apache läuft, konnte ich mich nicht 100%ig an die Anleitung auf der WP MU Seite halten.</p>
<p><span id="more-257"></span>In lighttpd gibt es kein .htaccess, also müssen die Rewriteregeln (ich nutze Subdomains, keine Unterverzeichnisse), in die lighttpd-config. Das ganze sieht so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$HTTP</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;host&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span>~ <span style="color: #0000ff;">&quot;^((.*).?example\.de)$&quot;</span> <span style="color: #009900;">&#123;</span>
  server<span style="color: #339933;">.</span>document<span style="color: #339933;">-</span>root <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/var/www/.../wp3/&quot;</span>
  server<span style="color: #339933;">.</span>error<span style="color: #339933;">-</span>handler<span style="color: #339933;">-</span><span style="color: #cc66cc;">404</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/index.php&quot;</span>  <span style="color: #666666; font-style: italic;">#hierdurch erspart man sich rewrite regeln für schöne permalinks
</span>  url<span style="color: #339933;">.</span>rewrite<span style="color: #339933;">-</span>once <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">&quot;^/(.*/)?files/$&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;/index.php&quot;</span><span style="color: #339933;">,</span>
   <span style="color: #0000ff;">&quot;^/(.*/)?files/(.*)&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;/wp-content/blogs.php?file=<span style="color: #006699; font-weight: bold;">$2</span>&quot;</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">&quot;^/([_0-9a-zA-Z-]+/)?(wp-.*)&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;/<span style="color: #006699; font-weight: bold;">$2</span>&quot;</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">&quot;^/([_0-9a-zA-Z-]+/)?(.*\.php)$&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;/<span style="color: #006699; font-weight: bold;">$2</span>&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Der Rest lief einwandfrei nach offizieller Anleitung, da in einigen der anderen Blogs allerdings recht viele Bilder sind, viel mir sofort die mangelnde Performance diesbezüglich auf. Der Grund war schnell gefunden, gab es 40 Bilder auf einer Seite, bedeutete dies, aufgrund der zweiten Rewriteregel, jeweils einen Aufruf eines PHP Skriptes, welches einen ganzen Schweif an includes inkl. Datenbankverbindungen und Queries mit sich bringt.</p>
<p>Die Lösung war, mit ein wenig Linuxwissen, aber schnell gefunden: Symlinks für jeden einzelnen Blog. Erfordert zwar ein wenig mehr Verwaltungsaufwand, spart aber das Umleiten über ein PHP Skript, um Bilder anzuzeigen. Die Regel muss dann so aussehen:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">    <span style="color: #0000ff;">&quot;^/(.*/)?files/(.*)$&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;/wp-content/blogs.dir/%0/files/<span style="color: #006699; font-weight: bold;">$2</span>&quot;</span><span style="color: #339933;">,</span></pre></div></div>

<p>Das %0 funktioniert so nur, weil die Hostdefinition (Zeile 1 im oberen Code) als Pattern definiert ist!</p>
<p>Im, laut Anleitung angelegten, blogs.dir Verzeichnis müssen nun Symlinks angelegt werden:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">ln <span style="color: #339933;">-</span>s <span style="color: #339933;">/</span><span style="color: #000000; font-weight: bold;">var</span><span style="color: #339933;">/</span>www<span style="color: #339933;">/.../</span>wp3<span style="color: #339933;">/</span>wp<span style="color: #339933;">-</span>content<span style="color: #339933;">/</span>blogs<span style="color: #339933;">.</span><span style="color: #990000;">dir</span><span style="color: #339933;">/</span><span style="color: #009900;">&#91;</span>BlogID<span style="color: #009900;">&#93;</span> <span style="color: #339933;">/</span><span style="color: #000000; font-weight: bold;">var</span><span style="color: #339933;">/</span>www<span style="color: #339933;">/.../</span>wp3<span style="color: #339933;">/</span>wp<span style="color: #339933;">-</span>content<span style="color: #339933;">/</span>blogs<span style="color: #339933;">.</span><span style="color: #990000;">dir</span><span style="color: #339933;">/</span><span style="color: #009900;">&#91;</span>subdomain<span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span>example<span style="color: #339933;">.</span>de</pre></div></div>

<p>Falls jemand eine elegantere Lösung kennt, als für jeden Blog einen Symlink anzulegen, als her damit!</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/257/wordpress-3-mu-auf-lighttpd-und-das-langsame-bilder-problem/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>APC statt eaccelerator oder XCache</title>
		<link>http://xfragger.de/160/apc-statt-eaccelerator-oder-xcache</link>
		<comments>http://xfragger.de/160/apc-statt-eaccelerator-oder-xcache#comments</comments>
		<pubDate>Mon, 15 Jun 2009 19:44:41 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux allgemein]]></category>
		<category><![CDATA[Webserver]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[eaccelerator]]></category>
		<category><![CDATA[lenny]]></category>
		<category><![CDATA[opcode cacher]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xcache]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=160</guid>
		<description><![CDATA[Lange plagten wir uns mit dem Problem, dass die Webserver nach ein paar Tagen Betrieb 500er warfen (500 &#8211; Internal Server Error). Dies ging dann ein paar Sekunden so (nur 2-3) und danach lief alles wieder glatt. Das ganze passierte wahllos mal auf diesem, mal auf einem anderen Webserver. Mit der Zeit fanden wir heraus, [...]]]></description>
			<content:encoded><![CDATA[<p>Lange plagten wir uns mit dem Problem, dass die Webserver nach ein paar Tagen Betrieb 500er warfen (500 &#8211; Internal Server Error). Dies ging dann ein paar Sekunden so (nur 2-3) und danach lief alles wieder glatt. Das ganze passierte wahllos mal auf diesem, mal auf einem anderen Webserver.<span id="more-160"></span></p>
<p>Mit der Zeit fanden wir heraus, dass dies wohl am <a href="http://eaccelerator.net/">eaccelerator</a> liegt, worauf wir <a href="http://xcache.lighttpd.net/">XCache</a> versuchten, was anfangs einen besseren Eindruck machte. Nach 2-3 Tagen Betrieb unter Hochlast, trat wieder das selbe Problem auf.</p>
<p>Nach langem Suchen durch diverse Foren und Blogs, fand ich heraus, dass dies keine unbekannten Probleme sind, die einfach auf Bugs in diesen Opcode Cachern (eaccelerator und XCache) zurückzuführen sind und man solle doch <a href="http://de.php.net/apc">APC (Alternative PHP Cache)</a> nutzen.</p>
<p>Freudig stellte ich fest, dass APC nicht mehr bei jedem Update selbst kompiliert werden musste (phpize, configure, make, make install), sondern einfach via apt-get zu beziehen ist (unter Debian/Lenny, noch nicht unter Etch), das Paket nennt sich &#8220;php-apc&#8221;. Nicht, dass ich das Selbstbauen scheue, aber bei über 20 Webservern, die teilweise 32, teilweise 64 Bit Kernel haben, ist man froh, wenn man sich diese Arbeit sparen kann.</p>
<p>Nun läuft APC auch noch seit Wochen ziemlich stabil, ab und zu tritt noch ein 500er auf, aber dies hat andere Gründe (lighttpd backend overloaded), an denen wir arbeiten. Die APC-Config basiert auf den Standardwerten, abgesehen von &#8220;apc.stat_ctime&#8221;, welches auf 1 gesetzt ist, da der Cacher sonst nicht mit Dateiaktualsierungen via SVN klarkommt.<br />
Performancetechnisch ist bis jetzt kein Nachteil gegenüber den beiden Konkurrenzprodukten festzustellen.<br />
Weiterhin spricht die Tatsache, dass es offiziell von den PHP-Entwicklern supportet wird, ebenfalls für APC.</p>
<p>Fazit: Was spricht gegen APC? Warum werden so oft eaccelerator und XCache genutzt, obwohl es sich bei beiden noch um Beta-Versionen handelt (Version &lt; 1)?</p>
<p>Hintergrundinfo (alles Lenny Pakete):<br />
- php-apc Version: 3.0.19-2<br />
- php-cgi Version: 5.2.6.dfsg.1-1+lenny2<br />
- lighttpd Version: 1.4.19-5</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/160/apc-statt-eaccelerator-oder-xcache/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>lighttpd restart Probleme</title>
		<link>http://xfragger.de/71/lighttpd-restart-probleme</link>
		<comments>http://xfragger.de/71/lighttpd-restart-probleme#comments</comments>
		<pubDate>Fri, 07 Nov 2008 22:40:52 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Webserver]]></category>
		<category><![CDATA[lighty lighttpd restart php-cgi problem]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=71</guid>
		<description><![CDATA[Setzt man auf einem Webserver sehr viele php-cgi Prozesse ein (allerdings nur mit einem Thread, da der eaccelerator sonst verrückt spielt), gibt es unter hoher Last diverse Probleme beim einfachen /etc/init.d/lighttpd restart 1. Problem: es werden nicht alle php-cgi Prozesse beendet, bevor der lighty sich wieder startet 2. Problem (daraus resultierend): die &#8220;alten&#8221; php-cgis greifen [...]]]></description>
			<content:encoded><![CDATA[<p>Setzt man auf einem Webserver sehr viele php-cgi Prozesse ein (allerdings nur mit einem Thread, da der eaccelerator sonst verrückt spielt), gibt es unter hoher Last diverse Probleme beim einfachen <strong>/etc/init.d/lighttpd restart</strong><br />
<span id="more-71"></span><br />
1. Problem:<br />
es werden nicht alle php-cgi Prozesse beendet, bevor der lighty sich wieder startet</p>
<p>2. Problem (daraus resultierend):<br />
die &#8220;alten&#8221; php-cgis greifen gemeinsam mit den neuen auf den eaccelerator cache zu. Wird dieser dann noch geleert, wird er aus irgendeinem Grund nicht mehr aufgebaut und der Webserver läuft ohne eaccelerator und wirft in regelmäßigen Abständen 500er Fehler.</p>
<p>Alles in allem, nicht sehr schön. Nun haben wir aber eine Lösung gefunden:</p>
<p>Die lightys werden nicht neugestartet, sondern erst gestoppt, dann wird ein <strong>killall -9 php-cgi</strong> ausgeführt, 2 Sekunden gewarten, dann nochmal den killall Befehl abgesetzt und zuletzt wird lighty wieder gestartet.</p>
<p>Bis jetzt sind wir mit dieser Lösung recht zufrieden, auch wenn es ein wenig länger dauert, alle 18 lightys durchzustarten.</p>
<p>Würde gerne wissen, warum lighty nicht in der Lage ist, alle php-cgi Prozesse zu killen, bevor er sich wieder startet.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/71/lighttpd-restart-probleme/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP 5.2.6 und eAccelerator 0.9.5.3</title>
		<link>http://xfragger.de/67/php-526-und-eaccelerator-0953</link>
		<comments>http://xfragger.de/67/php-526-und-eaccelerator-0953#comments</comments>
		<pubDate>Fri, 24 Oct 2008 23:18:41 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Webserver]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[eaccelerator]]></category>
		<category><![CDATA[lighttpd]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=67</guid>
		<description><![CDATA[WIr nutzen diese Konstellation schon recht lange, doch seit ein paar Wochen, meint ein Teil der Webserver plötzlich nur noch 500er Fehler auszuspucken. Nach einem stoppen des Lighty, killen der übrigen php-cgi Prozesse, leeren des eAccelerator Caches und starten des Lighty, lief alles wieder einwandfrei. eAccelerator ist ein sogenannter Opcode-Cacher, er kompiliert die PHP Skripts [...]]]></description>
			<content:encoded><![CDATA[<p>WIr nutzen diese Konstellation schon recht lange, doch seit ein paar Wochen, meint ein Teil der Webserver plötzlich nur noch 500er Fehler auszuspucken. Nach einem stoppen des Lighty, killen der übrigen php-cgi Prozesse, leeren des eAccelerator Caches und starten des Lighty, lief alles wieder einwandfrei.</p>
<p><span id="more-67"></span></p>
<p>eAccelerator ist ein sogenannter Opcode-Cacher, er kompiliert die PHP Skripts beim ersten Aufruf und legt die Binaries in seinen Cache. Beim nächsten Aufruf muss nun nicht mehr neu kompiliert werden (wie es normalerweise üblich wäre für PHP), sondern es kann auf den Cache zurückgegriffen werden.</p>
<p>Zuletzt trat der Fehler erst gestern Abend auf, 6 Stunden nachdem eine Änderung des Codes erfolgte (eine Codeänderung führt auch gleichzeitig zu einem Neustart der Lightys). Nach längerer Loganalyse konnten wir diesen Fehler im error.log von lighttpd finden:</p>
<blockquote><p>EACCELERATOR: PHP crashed on opline 10 of getNamespaceByKey() at /var/www/(&#8230;)/memcache_manager.php:431</p></blockquote>
<p>Auf anderen Weberservern trat dieser Fehler ebenfalls zum gleichen Zeitpunkt hunderfach auf (teilweise an anderen Codestellen).  Im syslog trat gleichzeitig ein anderer Fehler auf:</p>
<blockquote><p>php-cgi: PHP Fatal error: Call to undefined function MemcacheManager::() in /var/www/(&#8230;)/memcache_manager.php on line 375</p></blockquote>
<p>Da wir nicht nachvollziehen können, warum dieser Fehler auftritt, gibt es nun 2 Workarounds. Das erste verhindert schlimmeres, indem alle lightys vor der Peaktime der Seite einfach durchgestartet werden (inkl. Cacheleerung).</p>
<p>Das zweite ist ein Cronjob, der jede Minuten das lighty-error-log parsed und nach entsprechenden Stellen in der letzten Minute sucht, trat tatsächlich ein solcher Fehler auf, wird der lighty durchgestartet und wir per Mail informiert.</p>
<p>Solange ich keine Antwort auf der eAccelerator Mailingliste bekomme und keine neue Version von eAccelerator erscheint, müssen wir wohl vorerst auf diese Workarounds zurückgreifen, auch wenns nicht wirklich schön ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/67/php-526-und-eaccelerator-0953/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upgrade auf Lenny und das PHP-Memcache Problem</title>
		<link>http://xfragger.de/51/upgrade-auf-lenny-und-das-php-memcache-problem</link>
		<comments>http://xfragger.de/51/upgrade-auf-lenny-und-das-php-memcache-problem#comments</comments>
		<pubDate>Sat, 11 Oct 2008 20:21:36 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux allgemein]]></category>
		<category><![CDATA[Webserver]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[eaccelerator]]></category>
		<category><![CDATA[lenny]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[php-memcache]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=51</guid>
		<description><![CDATA[Seit kurzem laufen alle unsere Webserver mit Debian Lenny. Im Vorfeld testeten wir das ganze auf einem Testserver, wobei auffiel, dass Memcache einige Keys nicht mehr fand und sich allgemein sehr komisch verhielt. Nach langer Recherche im Internet und überprüfung der Paketversionen, viel auf, dass das PHP-Memcache Paket eine komplette Versionsnummer weiter war (statt 2.x [...]]]></description>
			<content:encoded><![CDATA[<p>Seit kurzem laufen alle unsere Webserver mit Debian Lenny. Im Vorfeld testeten wir das ganze auf einem Testserver, wobei auffiel, dass Memcache einige Keys nicht mehr fand und sich allgemein sehr komisch verhielt.</p>
<p>Nach langer Recherche im Internet und überprüfung der Paketversionen, viel auf, dass das PHP-Memcache Paket eine komplette Versionsnummer weiter war (statt 2.x nun 3.x).<br />
In der Dokumentation bzw. dem Changelog fand ich dann zwei Gründe, für unsere Probleme.<br />
<span id="more-51"></span></p>
<ol>
<li>Memcache nutzt eine Hashingmethode, um die abgelegten Keys auf den diversen Instanzen wiederzufinden (bei uns laufen insgesamt 14 Instanzen mit je 3GB auf zwei verschiendenen Servern). In Version 3 der API, hat sich dieses Verfahren standardmäßig geändert und musste via Configeintrag wieder auf &#8220;standard&#8221; gesetzt werden. (in der php.ini oder php5/conf.d/memcache.ini).</li>
<li>Die neue Memcache Version unterstützt zwar noch das alte Objekt &#8220;Memcache&#8221;, aber es wird empfohlen, das neue Objekt &#8220;MemcachePool&#8221; zu benutzen, welches die bekannten plus noch ein paar neue Methoden besitzt.</li>
</ol>
<p>Nachdem beides geändert wurde, lief es auf dem Testserver optimal, selbiges wurde dann noch auf den Produktivservern umgesetzt. Nachdem wir dann, anhand überdurchschnittlicher CPU Load,  bemerkten, dass der Opcode-Cacher eaccelerator noch neu Kompiliert werden musste (logisch eigentlich), lief alles wieder einwandfrei.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/51/upgrade-auf-lenny-und-das-php-memcache-problem/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
