<?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>Stetix &#187; Webentwicklung</title>
	<atom:link href="http://stetix.de/thema/webentwicklung/feed" rel="self" type="application/rss+xml" />
	<link>http://stetix.de</link>
	<description>Gedanken über Web-Development, Webdesign, Technik, Handys, Musik, Vinyl, Gadgeds und mehr..</description>
	<lastBuildDate>Thu, 12 Apr 2012 20:35:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>WordPress langsam? PHP und WordPress schneller machen mit Nginx und Fast-CGI!</title>
		<link>http://stetix.de/wordpress-langsam-php-und-wordpress-schneller-machen-mit-nginx-und-fast-cgi.html</link>
		<comments>http://stetix.de/wordpress-langsam-php-und-wordpress-schneller-machen-mit-nginx-und-fast-cgi.html#comments</comments>
		<pubDate>Mon, 07 Mar 2011 23:27:05 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[webserver]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=932</guid>
		<description><![CDATA[Das der nginx-Webserver schneller und performanter als z.B. der Apache ist, hatte ich in meinem letzten Blogbeitrag zur Installation und Konfiguration von nginx bereits geschrieben. Wenn WordPress oder PHP auf dem Apache mit mod_php generell zu langsam werden, macht auch hier die Überlegung Sinn, auf einen anderen Webserver umzusteigen. In Sachen Performance und Performance-Optimierung nicht [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>Das der <a href="http://nginx.org/" target="_blank">nginx-Webserver</a> schneller und performanter als z.B. der Apache ist, hatte ich in meinem letzten Blogbeitrag zur <a href="/nginx-eine-echte-apache-alternative.html">Installation und Konfiguration von nginx</a> bereits geschrieben. Wenn WordPress oder PHP auf dem <a href="http://httpd.apache.org/">Apache</a> mit <a href="http://php.net/manual/de/security.apache.php">mod_php</a> generell zu langsam werden, macht auch hier die Überlegung Sinn, auf einen anderen Webserver umzusteigen. In Sachen Performance und Performance-Optimierung nicht nur für WordPress und PHP ist nginx aktuell die erste Wahl. </p>
<p><img src="http://stetix.de/wp-content/uploads/2011/03/nginx-php-rocket.jpg" alt="nginx php rocket Wordpress langsam? PHP und Wordpress schneller machen mit Nginx und Fast CGI!" title="nginx-php-rocket" width="494" height="442" class="size-full wp-image-1795" /></p>
<p>Bei den meisten Installationen unter Apache läuft PHP als Modul. Das heisst, für das Ausführen von PHP muß kein neuer Prozess gestartet werden, sondern die Verarbeitung bzw. Parsen der PHP-Dateien übernimmt das beim Start des Apachen geladene PHP-Modul. Für nginx gibt es solch ein Modul nicht, weshalb wir auf die CGI-Version von PHP zurückgreifen müssen. Dies ist nicht weiter tragisch, da die Performance &#8211; eine halbwegs schnelle CPU vorausgesetzt &#8211; aus Erfahrung nicht darunter leidet. Doch wie konfiguriert man nginx, um ihn für das Ausliefern von dynamischen PHP-Scripts vorzubereiten? </p>
<p><span id="more-932"></span></p>
<h4>Installation von PHP5-CGI</h4>
<p>Zuallererst benötigen wir nun die CGI-Version von PHP. Falls sie noch nicht installiert ist, können wir sie entweder selbst kompilieren oder verwenden von der Linux-Distribution bestehende Pakete. Für Ubuntu ist die Installation hier mit einer Zeile erledigt:</p>
<p><code># apt-get install php5-cgi</code></p>
<p>Sofern man für WordPress zum Beispiel noch mehr Module wie MySQL oder GD benötigt, könnte die Zeile auch so aussehen:</p>
<p><code># apt-get install php5-cgi php5-dev php5-gd php5-mysql</code></p>
<h4>Die Verbindung zu nginx: Sockets für PHP</h4>
<p>Damit wir PHP mit nginx nutzen können, benötigen wir sogenannte <a href="http://de.wikipedia.org/wiki/Socket_%28Software%29">Sockets</a> unter denen das PHP auf Anfragen von nginx wartet, wahlweisse als TCP- oder UNIX-Domain-Socket. Da ein Socket ständig auf neue Verbindungen wartet, muß ein neuer Prozess erzeugt werden, der diese Arbeit übernimmt. Dieser Prozess erzeugt weitere Unterprozesse und leitet die PHP-Anfragen dann an diese weiter.</p>
<p>Es gibt nun mehrere Möglichkeiten die PHP-Prozesse zu starten. Die Aufgabe ist hier, die Prozesse als Daemon und unter einem anderen User laufen zu lassen, sowie die Standard- und Fehler-Ausgaben umzuleiten.<br />
Zwei Möglichkeiten möchte ich hier aufzeigen: Zum einen kann man die Prozesse ganz normal per Startscript starten, auf Ubuntu zum Beispiel mit dem start-stop-daemon. Zum anderen gibt es Tools wie spawn-fcgi, mit dem ich jedoch nicht so gute Erfahrungen gemacht habe, da es bei mir öfters, teilweisse sogar mit <a href="http://de.wikipedia.org/wiki/Schutzverletzung" target="_blank">Segfaults</a>, unter Last abstürzte. Da ich aber keine Zeit hatte, dem Grund auf die Spur zu gehen und PHP mit dem start-stop-daemon bei mir ziemlich gut läuft, möchte ich euch spawn-fcgi der Vollständigkeithalber nicht vorenthalten. Sicher auch hilfreich für andere Linux-Distributionen.</p>
<h4>PHP im FASTCGI-Modus mit Startscript</h4>
<p>Die in PHP mitgelieferte CGI-Version php5-cgi erledigt im <a href="http://de.wikipedia.org/wiki/FastCGI" target="_blank">FastCGI</a>-Modus die Socketbindung und das Erzeugen von neuen Prozessen selbstständig und sehr zuverlässig.  Zum Starten benötigen wir ein Startscript, welches wir unter /etc/init.d/fastcgi anlegen:</p>
<p><code># vi /etc/init.d/fastcgi</code></p>
<p>Inhalt:</p>
<p><code>#!/bin/bash<br />
BIND=127.0.0.1:8088<br />
USER=www<br />
PHP_FCGI_CHILDREN=15<br />
PHP_FCGI_MAX_REQUESTS=1000<br />
PHP_CGI=/usr/bin/php5-cgi<br />
<br />
PHP_CGI_NAME=`basename $PHP_CGI`<br />
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"<br />
RETVAL=0<br />
<br />
start() {<br />
&nbsp;&nbsp;&nbsp;  echo -n "Starting PHP FastCGI: "<br />
&nbsp;&nbsp;&nbsp;  start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS<br />
&nbsp;&nbsp;&nbsp;  RETVAL=$?<br />
&nbsp;&nbsp;&nbsp;  echo "$PHP_CGI_NAME."<br />
}<br />
stop() {<br />
&nbsp;&nbsp;&nbsp;  echo -n "Stopping PHP FastCGI: "<br />
&nbsp;&nbsp;&nbsp;  killall -q -w -u $USER $PHP_CGI<br />
&nbsp;&nbsp;&nbsp;  RETVAL=$?<br />
&nbsp;&nbsp;&nbsp;  echo "$PHP_CGI_NAME."<br />
}<br />
<br />
case "$1" in<br />
&nbsp;&nbsp;&nbsp;start)<br />
&nbsp;&nbsp;&nbsp;  start<br />
  ;;<br />
&nbsp;&nbsp;&nbsp;stop)<br />
&nbsp;&nbsp;&nbsp;  stop<br />
  ;;<br />
&nbsp;&nbsp;&nbsp;restart)<br />
&nbsp;&nbsp;&nbsp;  stop<br />
&nbsp;&nbsp;&nbsp;  start<br />
  ;;<br />
&nbsp;&nbsp;&nbsp;*)<br />
&nbsp;&nbsp;&nbsp;  echo "Usage: php-fastcgi {start|stop|restart}"<br />
&nbsp;&nbsp;&nbsp;  exit 1<br />
  ;;<br />
esac<br />
exit $RETVAL<br />
</code></p>
<p>Die ersten fünf Variablen werden zur Konfiguration benötigt und bedeuten folgendes:</p>
<p>BIND:  IP-Adresse und Port,  unter denen auf Verbindungen gewartet wird<br />
USER: Benutzer, unter dem die Prozesse laufen<br />
PHP_FCGI_CHILDREN: Anzahl der zu forkenden bzw. erstellenden Prozesse<br />
PHP_FCGI_MAX_REQUESTS: Anzahl von Requests, nach denen der Prozess stirbt (neue werden automatisch erstellt)<br />
PHP_CGI: Pfad zu php5-cgi</p>
<p>Evtl. muß nun noch der Pfad zu php5-cgi und der Benutzer angepasst werden und wir können das Script nach einem chmod ausführen:</p>
<p><code># chmod 700 /etc/init.d/fastcgi<br />
# /etc/init.d/fastcgi start<br />
</code></p>
<p>Mit dem Befehl &#8220;ps ax&#8221; sollten wir nun in der Prozessliste unsere PHP-Prozesse laufen sehen und gehen jetzt  zur <a href="#nginx-config">nginx-Konfiguration</a> über.</p>
<h4>Fast-CGI mit spawn-fcgi</h4>
<p><a href="http://redmine.lighttpd.net/projects/spawn-fcgi" target="_blank">spawn-fcgi</a> macht eigentlich auch nichts anderes als das Startscript unter Ubuntu. Es erstellt einen TCP/Unix-Domain-Socket und die gewünschte Anzahl von Prozessen unter einem bestimmten Benutzer und leitet die Ausgaben ensprechend um. Zur Installation benötigen wir natürlich die aktuellen Sourcen von spawn-fcgi, deren Link wir auf der <a href="http://redmine.lighttpd.net/projects/spawn-fcgi/news" target="_blank">News-Seite des Projektes</a> erhalten. Download, Entpacken und ins Verzeichnis wechseln:</p>
<p><code># wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz<br />
# tar -xvzf spawn-fcgi-1.6.3.tar.gz<br />
# cd spawn-fcgi-1.6.3<br />
</code></p>
<p>Nun folgt das bekannte Zweiergespann zum Kompilieren. spawn-fcgi besitzt keine Install-Routine, weshalb wir dies selbst vornehmen müssen:</p>
<p><code># ./configure<br />
# make<br />
# cp ./src/spawn-fcgi /usr/bin/spawn-fcgi<br />
</code></p>
<p>Nun können wir das Tool das erste mal starten.</p>
<p><code>/usr/bin/spawn-fcgi -a 127.0.0.1 -p 8088 -F 3 -u www -f /usr/bin/php5-cgi</code></p>
<p>Die Bedeutung der Optionen:</p>
<pre>
-a    IP-Adresse, an der auf Verbindungen gewartet wird
-p    Port, an dem auf Verbindungen gewartet wird
-w    User unter dem die Prozesse laufen sollen
-f    Pfad zum PHP-CGI
-F    Anzahl der Prozesse, die geforkt werden sollen
</pre>
<p style="margin-top: 10px;">
<p><a name="nginx-config"></a></p>
<h3>Konfiguration des nginx für PHP mit Fast-CGI</h3>
<p>Wenn wir bereits einen fertigen nginx am Laufen haben, sind nur wenige Zeilen in der Konfiguration zu ergänzen. Ansonsten lies bitte zuerst meine <a href="/nginx-eine-echte-apache-alternative.html">Anleitung zur Installation und Konfiguration des nginx</a>.</p>
<p>Innerhalb des Vhosts, also innerhalb von server {} fügen wir eine neue Location-Direktive für PHP-Files hinzu:</p>
<p><code>&nbsp;&nbsp;&nbsp;location ~ .*\.php$ {<br />
&nbsp;&nbsp;&nbsp;  root /var/www/meinedomain.de/htdocs;<br />
&nbsp;&nbsp;&nbsp;  fastcgi_pass  127.0.0.1:8088;<br />
&nbsp;&nbsp;&nbsp;  fastcgi_index index.php;<br />
&nbsp;&nbsp;&nbsp;  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;<br />
&nbsp;&nbsp;&nbsp;  include fastcgi_params;<br />
&nbsp;&nbsp;&nbsp;}<br />
</code></p>
<p>Hier darauf achten, das die Angaben in fastcgi_pass mit denen der vorhin konfigurierten übereinstimmen. include fastcgi_params inkludiert eine Datei, die bei der nginx-Installation enthalten ist, möchte Sie hier jedoch abbilden für den Fall das&#8230;</p>
<p><code>fastcgi_param  QUERY_STRING       $query_string;<br />
fastcgi_param  REQUEST_METHOD     $request_method;<br />
fastcgi_param  CONTENT_TYPE       $content_type;<br />
fastcgi_param  CONTENT_LENGTH     $content_length;<br />
<br />
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;<br />
fastcgi_param  REQUEST_URI        $request_uri;<br />
fastcgi_param  DOCUMENT_URI       $document_uri;<br />
fastcgi_param  DOCUMENT_ROOT      $document_root;<br />
fastcgi_param  SERVER_PROTOCOL    $server_protocol;<br />
<br />
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;<br />
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;<br />
<br />
fastcgi_param  REMOTE_ADDR        $remote_addr;<br />
fastcgi_param  REMOTE_PORT        $remote_port;<br />
fastcgi_param  SERVER_ADDR        $server_addr;<br />
fastcgi_param  SERVER_PORT        $server_port;<br />
fastcgi_param  SERVER_NAME        $server_name;<br />
<br />
# PHP only, required if PHP was built with --enable-force-cgi-redirect<br />
fastcgi_param  REDIRECT_STATUS    200;<br />
</code></p>
<p>Damit nginx auch beim Aufruf der Domain ohne Dateiname in der <a href="http://de.wikipedia.org/wiki/Uniform_Resource_Locator" target="_blank">URL</a> die Startseite als PHP ausführt, müssen wir zwei Parts in der bestehenden Konfiguration unter server {} anpassen bzw neu einsetzen:</p>
<p>Als erstes machen wir die Datei index.php zur ersten Wahl beim Aufruf ohne Dateiname:</p>
<p><code>index   index.php index.html index.htm;<br />
</code></p>
<p>Alles andere was nicht gefunden wird, leiten wir ebenfalls auf index.php weiter:</p>
<p><code>        # this sends all non-existing file or directory requests to index.php<br />
        if (!-e $request_filename) {<br />
            rewrite . /index.php last;<br />
        }<br />
</code></p>
<p>Das komplett Konfigfile könnte nun so aussehen:</p>
<p><code>server {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# IP-Adresse und Port, an denen für Web-Zugriffe gelauscht wird<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listen&nbsp;&nbsp;&nbsp;&nbsp;   1.2.3.4:80;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Domains, auf die dieser Server hören soll<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name  www.meinedomain.de meinedomain.de;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Hauptverzeichnis für Dokumente<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/www/meinedomain.de/htdocs;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Ort des Access-Logfiles<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access_log /var/www/meinedomain.de/logs/access_log vhosts;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Definition des Index-Files (Startseite, für Anfragen ohne Dateiname)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index index.php index.html index.htm;;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Wenn Zugriff auf andere als Standarddomain,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# auf diese per 301 permanent weiterleiten<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($host != 'www.meinedomain.de' ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rewrite  ^/(.*)$  http://www.meinedomain.de/$1  permanent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Für Bilder und einige andere Dateitypen Access-Log ausschalten und<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Expire-Zeit  auf 7 Tage erhöhen (sendet den entspr. Expire-Header)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location ~* ^.+\.(js|css|jpg|jpeg|gif|png|pdf|zip|rar)$ {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  access_log   off;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  expires&nbsp;&nbsp;&nbsp;&nbsp;  7d;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location / {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # Nützlich für SSL und evtl. später hinzukommende Scriptsprachen<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_set_header  X-Real-IP  $remote_addr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_set_header Host $http_host;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_redirect off;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # Wenn die angeforderete statische Datei existiert, diese ausliefern<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # ohne die anderen Regeln weiter unten zu beachten<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (-f $request_filename) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # this sends all non-existing file or directory requests to index.php<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (!-e $request_filename) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rewrite . /index.php last;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location ~ .*.php$ {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  root /var/www/meinedomain.de/htdocs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  fastcgi_pass 127.0.0.1:8088;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  fastcgi_index index.php;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  include fastcgi_params;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
</code></p>
<p>Jetzt heißt es den nginx mit <code>/etc/init.d/nginx restart</code> neu starten und PHP ist einsatzbereit.</p>
<p>WordPress kann nun ganz normal installiert und verwendet werden.</p>
<p>Insofern man ein Cache-Modul wie <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP-Super-Cache</a> nutzt, sollte man noch die entsprechenden RewriteRules für die statischen HTML-Dateien setzen. Für WP-Super-Cache beispielsweisse einfach folgende Zeilen innerhalb location / {} und vor der Einstellung für die .php-Dateien kopieren:</p>
<p><code>      if (-f $document_root/cache$fastcgi_script_name) {<br />
        rewrite (.*) /cache$1 break;<br />
      }<br />
      if (-f $document_root/cache/$fastcgi_script_name/index.html) {<br />
        rewrite (.*) /cache/$1/index.html break;<br />
      }<br />
      if (-f $document_root/cache$fastcgi_script_name.html) {<br />
        rewrite (.*) /cache$1.html break;<br />
      }<br />
</code></p>
<p>Geschafft! Jetzt haben wir nginx mit PHP laufen und können uns über die bessere Performance freuen. Wenn du noch weitere Beispiele für Konfigurationen, auch für andere Sprachen und Einsatzmöglichkeiten suchst, empfiehlt sich ein Blick auf die <a href="http://wiki.nginx.org/Configuration" target="_blank">Configuration-Seite von nginx</a>.</p>
<p>Sicher folgen noch einige Artikel mehr über den nginx, um meine Begeisterung kund zu tun ;-) Solltest Du also Fragen, Wünsche, Vorschläge oder sonstiges haben, ab damit in die Kommentare, ich freue mich!</p>
<p style="margin-top: 40px;">
<strong>Credits:</strong></p>
<p>Original-Foto <a href="http://www.flickr.com/photos/jurvetson/2261734491/" target="_blank">Strap-On Video Rocket</a> unter Creative Commons von <a href="http://www.flickr.com/photos/jurvetson" target="_blank">jurvetson auf Flickr</a>. Danke!</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/wordpress-langsam-php-und-wordpress-schneller-machen-mit-nginx-und-fast-cgi.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.</title>
		<link>http://stetix.de/nginx-eine-echte-apache-alternative.html</link>
		<comments>http://stetix.de/nginx-eine-echte-apache-alternative.html#comments</comments>
		<pubDate>Tue, 01 Mar 2011 16:25:22 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1087</guid>
		<description><![CDATA[Der Apache-Webserver ist das Non Plus Ultra in Sachen Webserver-Software. Seit mehr als 15 Jahren führt der Platzhirsch die Liste der meist genutzen Webserver an. Aktuell, im Februar 2011, werden bei Netcraft 171,195,554 Hostnamen mit Installationen des Apachen gemessen. Das sind 60.10% aller Webserver-Installationen weltweit. Marktanteile Top-Server über alle Domains Aug. 1995 &#8211; Feb. 2011. [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>Der <a href="http://httpd.apache.org/" target="_blank">Apache-Webserver</a> ist das Non Plus Ultra in Sachen Webserver-Software. Seit mehr als 15 Jahren führt der Platzhirsch die Liste der meist genutzen Webserver an. Aktuell, im Februar 2011, werden bei <a href="http://news.netcraft.com/" target="_blank">Netcraft</a> 171,195,554 <a href="http://de.wikipedia.org/wiki/Hostname" target="_blank">Hostnamen</a> mit Installationen des Apachen gemessen. Das sind 60.10% aller Webserver-Installationen weltweit.</p>
<p><img src="http://stetix.de/wp-content/uploads/2011/03/webserver-usage-1995-2011.png" alt="webserver usage 1995 2011 Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt." title="webserver-usage-1995-2011" width="550" height="300" class="alignnone size-full wp-image-1743" /><br />
<small style="color: #888;">Marktanteile Top-Server über alle Domains Aug. 1995 &#8211; Feb. 2011. Quelle: <a href="http://news.netcraft.com/archives/2011/02/15/february-2011-web-server-survey.html" target="_blank">netcraft.com</a></small></p>
<p>Seine weite Verbreitung, immerhin ist der Apache fast bei jedem Betriebssystem außer Windows dabei, die Anzahl der erhältlichen Erweiterungen und Module und die relativ leichte Konfiguration, auch in Massenhosting-Umgebungen, machen den Apache auch für Einsteiger zu einem Webserver der ersten Wahl. Wer jedoch mit viel Traffic zu tun hat und dabei eine <a href="http://de.wikipedia.org/wiki/Skriptsprache#Beispiele:_serverseitig" target="_blank">serverseitige Skriptsprache</a> wie PHP, Perl, Ruby oder ähnliches einsetzt, wird mit dem Apachen früher oder später an seine Grenzen stossen. Es ist mit Hilfe von Reduzierung auf wesentliche Module, <a href="http://httpd.apache.org/docs/2.0/misc/perf-tuning.html" target="_blank">Performance-Tuning</a> und Tuning des Linux Systems natürlich sehr viel raus zu holen, doch irgendwann steht die Frage nach einer Alternative im Raum.</p>
<p><span id="more-1087"></span></p>
<p><img src="http://stetix.de/wp-content/uploads/2011/03/nginx-logo.jpg" alt="nginx logo Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt." title="nginx-logo" width="640" height="139" class="alignnone size-full wp-image-1732" /></p>
<h3>Der Webserver nginx</h3>
<p>Hier war bis vor wenigen Jahren gerade im Linux-Bereich der Webserver <a href="http://www.lighttpd.net/" target="_blank">lighttpd</a> auf dem Weg eine echte Alternative zu werden, wurde jedoch im Jahr 2008 sehr schnell von einem Webserver Namens <a href="http://nginx.org/" target="_blank">nginx</a> überholt. nginx hat aktuell eine Verbreitung von 7.57% auf 21,570,463 Hosts. Tendenz startk steigend.<br />
Der von Igor Sysoev ursprünglich für die russische Suchmaschine <a href="http://www.rambler.ru/" target="_blank">Rambler</a> entwickelte nginx-Webserver, der auch als Reverse Proxy und E-Mail-Proxy verwendet werden kann, zeichnet sich durch seine hohe Performance und leichte Konfiguration aus. Gerade in Sachen Performance hat er den Apache schon einige Male <a href="http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/" target="_blank">in</a> <a href="http://www.pcdoctor-community.com/blog/posts/2008/05/15/Nginx-vs.-Apache2-in-Rails-Running-Death-Match/" target="_blank">die</a> <a href="http://turnkeye.com/blog/2010/05/nginx-vs-litespeed-magento-benchmark-tests/" target="_blank">Ecke</a> <a href="http://www.elbcoast.net/?p=77" target="_blank">verwiesen</a>. nginx wird auch bereits von vielen High-Traffic-Seiten wie beispielsweise <a href="http://www.golem.de/" target="_blank">Golem.de</a>, <a href="http://wordpress.com/" target="_blank">WordPress.com</a>, <a href="http://t3n.de/" target="_blank">t3n.de</a>, <a href="https://github.com/" target="_blank">GitHub</a> und vielen weiteren mehr eingesetzt. Auch als zusätzliche Software zum Beispiel als Load-Balancer, Proxy, SSL-Proxy oder für das Ausliefern von reinen statischen Inhalten wie Grafiken, Stylesheets oder Videos eignet sich nginx durch seine kurzen Responce-Zeiten sehr gut.</p>
<h3>nginx: Die Installation</h3>
<p>Die Software zu installieren ist im Prinzip nicht weiter schwierig, sofern man Linux-Grundkenntnisse mitbringt. Download, Configure, Make, Install, Konfigurationsfiles anpassen und fertig ist die nginx-Installation. Doch eins nach dem anderen und auch für Einsteiger etwas langsamer erklärt. Ich möchte hier an einem Beispiel aufzeigen, wie man den nginx-Webserver installiert, konfiguriert und für das Ausliefern von statischen Webseiten vorbereitet.</p>
<h4>Download des nginx</h4>
<p>Die aktuelle stabile Version erhalten wir auf der <a href="http://nginx.org/" target="_blank">Webseite des nginx</a>. Aktuell ist die Version 0.8.54 vom 14.12.2010, die man unter folgenden URL downloaden kann:<br />
<a href="http://nginx.org/download/nginx-0.8.54.tar.gz">http://nginx.org/download/nginx-0.8.54.tar.gz</a><br />
Mit Linux macht man das am besten mit <a href="http://www.gnu.org/software/wget/" target="_blank">wget</a>:</p>
<p><code># wget http://nginx.org/download/nginx-0.8.54.tar.gz<br />
</code></p>
<p>Jetzt muß man den Tarball nur noch entpacken und es kann zur Installation übergehen.</p>
<p><code># tar -xvzf nginx-0.8.54.tar.gz<br />
</code></p>
<h4>Installation des nginx</h4>
<p>Jetzt wechseln wir in das entpackte Verzeichnis. Um den nginx mit Standard-Modulen zu installieren reicht ein einfaches configure aus.</p>
<p><code># cd nginx-0.8.54<br />
# ./configure<br />
</code></p>
<p>Dies bereitet die Kompilierung des nginx in das Verzeichnis /usr/local/nginx mit Standard-Modulen wie dem HTTP-Kernmodul, HTTP-Upstreammodul, HTTP-Zugriffsmodul, HTTP-Authentifizierungsmodul und Fastcgi-Modul vor. Die Ausgabe der Zusammenfassung sollte so oder so ähnlich aussehen:</p>
<p><code>Configuration summary<br />
  + using system PCRE library<br />
  + OpenSSL library is not used<br />
  + md5: using system crypto library<br />
  + sha1 library is not used<br />
  + using system zlib library<br />
<br />
  nginx path prefix: "/usr/local/nginx"<br />
  nginx binary file: "/usr/local/nginx/sbin/nginx"<br />
  nginx configuration prefix: "/usr/local/nginx/conf"<br />
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"<br />
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"<br />
  nginx error log file: "/usr/local/nginx/logs/error.log"<br />
  nginx http access log file: "/usr/local/nginx/logs/access.log"<br />
  nginx http client request body temporary files: "client_body_temp"<br />
  nginx http proxy temporary files: "proxy_temp"<br />
  nginx http fastcgi temporary files: "fastcgi_temp"<br />
  nginx http uwsgi temporary files: "uwsgi_temp"<br />
  nginx http scgi temporary files: "scgi_temp"<br />
</code></p>
<p>Im nächsten Schritt heisst es kompilieren und installieren:</p>
<p><code># make<br />
# make install<br />
</code></p>
<p>Sollten diese beiden Make-Befehle ohne Fehler ausgeführt werden ist nginx nun unter dem Verzeichnis /usr/local/nginx installiert.</p>
<h3>nginx: Die Konfiguration</h3>
<p>Beginnen wir nun mit der Konfiguration. Im Prinzip können die Standard-Einstellungen übernommen werden, da sie für das Ausliefern von statischen Webseiten völlig ausreichend sind. Dennoch möchten wir hier einige Einstellungen variieren und jeweils noch die gewünschten Server bzw. Domains anlegen. Die Konfiguration befindet sich in der Datei /usr/local/nginx/conf/nginx.conf, die wir mit dem Editor unserer Wahl, in meine Fall der <a href="http://de.wikipedia.org/wiki/Vi">vi-Editor</a>, öffnen:</p>
<p><code># vi /usr/local/nginx/conf/nginx.conf</code></p>
<h4>Globale Server-Einstellungen</h4>
<p>An erster Stelle finden wir die globalen Einstellungen. Hier können Werte definiert werden, die für den gesamten Server gelten. Dazu gehören der User und die Gruppe unter der die Server-Prozesse laufen, Logfiles, Pidfile und Angaben zu Prozessen und MaxClients.</p>
<p><code># User und Gruppe unter der der nginx läuft<br />
user www www;<br />
<br />
# Anzahl der Worker-Prozesse<br />
worker_processes  2;<br />
<br />
# Anzahl der maximalen Worker-Connections<br />
events {<br />
    worker_connections  512;<br />
}<br />
<br />
# Ort und LogLevel der ErrorLog-Datei<br />
error_log  logs/error.log notice;<br />
<br />
# Ort des Pidfiles<br />
pid        logs/nginx.pid;<br />
</code></p>
<p>Standardmässig läuft der nginx unter dem <a href="http://wiki.nginx.org/CoreModule#user" target="_blank"><strong>User</strong></a> nobody, was wir je nach Belieben anpassen können. Allerdings sollte man einen Werbserver niemals unter dem Benutzer root laufen lassen, um eventuellen Sicherheitslücken vorzubeugen.</p>
<p>Die Anzahl der <a href="http://wiki.nginx.org/CoreModule#worker_processes" target="_blank"><strong>Worker-Prozesse</strong></a> gibt an, wieviele Prozesse gestartet werden sollen. Der nginx startet einen Master-Prozess, der die Verwaltung übernimmt und die in der Konfiguration angegebene Anzahl von Worker-Prozessen. Diese Worker-Prozesse sind für die Verbindungen zum Benutzer und das Ausliefern der Webseite zuständig. 2 Worker-Prozesse sollten für den Anfang ausreichend sein.</p>
<p>Die Anzahl der <a href="http://wiki.nginx.org/EventsModule#worker_connections" target="_blank"><strong>Worker-Connections</strong></a> bestimmt die maximale Anzahl von gleichzeitigen Verbindungen, die ein Worker-Prozess verarbeiten kann. Aus beiden Werten von worker_processes und worker_connections ergibt sich hier also die maximale Anzahl von gleichzeitigen Verbindungen für den gesamten Webserver, der so genannten auch aus der Apache-Konfiguration bekannten Variable <strong>MaxClients</strong>. Die Formel hierfür ist </p>
<p><strong><em>max_clients = worker_processes * worker_connections</em></strong></p>
<p>In unserem Fall 2 * 512 = 1024. 1024 Verbindungen sollten für den Anfang mehr als ausreichend sein und können bei Ressourcenmangel ruhig auch bis 250 minimiert werden.</p>
<p>Den Ort und LogLevel der ErrorLog-Datei, sowie den Ort des Pidfiles können wir getrost so übernehmen. </p>
<h4>HTTP Server-Einstellungen</h4>
<p>Jetzt kommen wir zur Konfiguration des HTTP-Services und der einzelnen Server. Die Standard-Einstellungen sollten angepasst werden und wurden von mir für optimale und performante Auslieferung mit Hilfe von Gzip, Cache-Einstellungen usw. optimiert. Nehmen wir als Beispiel die IP 1.2.3.4 und eine Domain Namens www.meinedomain.de mit statischen HTML-Seiten, Bildern, Stylesheets und einigen Download-Dateien im Verzeichnis /var/www/meinedomain.de/htdocs, welches natürlich vorhanden sein sollte. Auch an SEO sollten wir gleich denken, die Domain wirklich nur unter einer Domain erreichbar machen und alles andere auf diese per <a href="http://stetix.de/301-weiterleitung-einer-website-per-mod-rewrite.html">301-Weiterleitung</a> weiterleiten.</p>
<p><code>http {<br />
&nbsp;&nbsp;&nbsp;&nbsp;# die Konfiguration der Content-Typen aus conf/mime.types inkludieren<br />
&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;&nbsp;&nbsp;&nbsp;   mime.types;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;# Der Standard-Content-Typ<br />
&nbsp;&nbsp;&nbsp;&nbsp;default_type  application/octet-stream;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;# Support für größere Dateien<br />
&nbsp;&nbsp;&nbsp;&nbsp;sendfile&nbsp;&nbsp;&nbsp;&nbsp;   on;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;# HTTP Response-Header in einem Paket senden<br />
&nbsp;&nbsp;&nbsp;&nbsp;tcp_nopush&nbsp;&nbsp;&nbsp;&nbsp; on;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;# Sekunden, in denen auf eine erneute Verbindung vom<br />
&nbsp;&nbsp;&nbsp;&nbsp;# gleichen Client gewartet wird<br />
&nbsp;&nbsp;&nbsp;&nbsp;keepalive_timeout  65;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;# Disable Nagle's buffer algorithm<br />
&nbsp;&nbsp;&nbsp;&nbsp;tcp_nodelay&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;# Gzip aktivieren, sendet komprimierte Daten zum Client<br />
&nbsp;&nbsp;&nbsp;&nbsp;gzip  on;<br />
&nbsp;&nbsp;&nbsp;&nbsp;gzip_comp_level 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;gzip_proxied any;<br />
&nbsp;&nbsp;&nbsp;&nbsp;gzip_types&nbsp;&nbsp;&nbsp;&nbsp;  text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;# Definition des Logfile-Formats<br />
&nbsp;&nbsp;&nbsp;&nbsp;log_format vhosts '$http_host $remote_addr - $remote_user [$time_local]  '<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '"$request" $status $body_bytes_sent '<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '"$http_referer" "$http_user_agent"';<br />
<br />
# VHost-Konfiguration<br />
server {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# IP-Adresse und Port, an denen für Web-Zugriffe gelauscht wird<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listen&nbsp;&nbsp;&nbsp;&nbsp;   1.2.3.4:80;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Domains, auf die dieser Server hören soll<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name  www.meinedomain.de meinedomain.de;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Hauptverzeichnis für Dokumente<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/www/meinedomain.de/htdocs;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Ort des Access-Logfiles<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access_log /var/www/meinedomain.de/logs/access_log vhosts;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Definition des Index-Files (Startseite, für Anfragen ohne Dateiname)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index   index.html;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Wenn Zugriff auf andere als Standarddomain,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# auf diese per 301 permanent weiterleiten<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($host != 'www.meinedomain.de' ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rewrite  ^/(.*)$  http://www.meinedomain.de/$1  permanent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Für Bilder und einige andere Dateitypen Access-Log ausschalten und<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Expire-Zeit  auf 7 Tage erhöhen (sendet den entspr. Expire-Header)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location ~* ^.+\.(js|css|jpg|jpeg|gif|png|pdf|zip|rar)$ {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  access_log   off;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  expires&nbsp;&nbsp;&nbsp;&nbsp;  7d;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location / {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # Nützlich für SSL und evtl. später hinzukommende Scriptsprachen<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_set_header  X-Real-IP  $remote_addr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_set_header Host $http_host;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_redirect off;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # Wenn die angeforderete statische Datei existiert, diese ausliefern<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # ohne die anderen Regeln weiter unten zu beachten<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (-f $request_filename) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # index.html für Unterverzeichnisse<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (-f $request_filename/index.html) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rewrite (.*) $1/index.html break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
}<br />
</code></p>
<p>Die Konfiguration besteht aus dem Part http mit Definitionen für diesen Service. Hier wird zuerst die Mime-Konfiuration geladen, Einstellungen zum Connection-Verhalten gesetzt, das Gzip-Modul zum komprimieren der Daten aktiviert und die Definition des Logfile-Formates vorgenommen. Weiter finden wir innerhalb des http-Parts den server-Part, die Konfiguration der einzelnen Websites, auch genannt VHosts. Ich habe auch hier die einzelnen Direktiven oben kommentiert, weshalb ich auf weitere detailiertere Beschreibung verzichte. Im Prinzip ist alles selbsterklärend. Will man weitere Domains bzw. Server hinzufügen muß man lediglich den Part server {} kopieren. Dabei ist darauf zu achten, daß jede Konfiguration nacheinander innerhalb von http {} steht. Ab zwei Servern lohnt es sich schon, für jeden Server ein eigenes Konfigurationsfile anzulegen. Hierfür erstellt man innerhalb des conf-Verzeichnisses ein Unterverzeichnis, zum Beispiel &#8220;sites&#8221; und inkludiert die darin enthaltenen Files einfach innerhalb des http-Parts:</p>
<p><code>include /usr/local/nginx/conf/sites/*;<br />
</code></p>
<p>Jetzt kann man sich für jede Domain ein eigenes Konfigurationsfile anlegen, was wesentlich übersichtlicher ist.</p>
<h3>Das nginx Startscript</h3>
<p>Was uns jetzt noch fehlt ist, den nginx das erste Mal zu starten. Hierfür benötigen wir ein sogenanntes Startskript, welches wir z.B. <a href="https://gist.github.com/33062#file_nginx.sh" target="_blank">hier für Ubuntu</a> bekommen und unter /etc/init.d/nginx ablegen. Alternativ kann es hier kopiert und für evtl. andere Distributionen angepasst werden:</p>
<p><code>#!/bin/sh<br />
<br />
#This is a start script for nginx. Tested on Unbuntu Edge.<br />
#Should work on Ubuntu, Debian and probably a few other Linux distros.<br />
#Change DAEMON and CONFIG_FILE  if neccessary<br />
<br />
PATH=/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
#Location of nginx binary. Change path as neccessary<br />
DAEMON=/usr/local/nginx/sbin/nginx<br />
#Location of configuration file. Change path as neccessary<br />
CONFIG_FILE=/usr/local/nginx/conf/nginx.conf<br />
<br />
DAEMON_OPTS="-c $CONFIG_FILE"<br />
NAME=nginx<br />
DESC="web server"<br />
PIDFILE=/var/run/$NAME.pid<br />
SCRIPTNAME=/etc/init.d/$NAME<br />
<br />
#only run if binary can be found<br />
test -x $DAEMON || exit 0<br />
<br />
set -e<br />
<br />
#import init-functions<br />
. /lib/lsb/init-functions<br />
<br />
case "$1" in<br />
start)<br />
log_daemon_msg "Starting $DESC" $NAME<br />
if ! start-stop-daemon --start --quiet\<br />
	--pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS ; then<br />
	log_end_msg 1<br />
	else<br />
	log_end_msg 0<br />
fi<br />
;;<br />
stop)<br />
log_daemon_msg "Stopping $DESC" $NAME<br />
if start-stop-daemon --quiet --stop --oknodo --retry 30\<br />
	--pidfile $PIDFILE --exec $DAEMON; then<br />
	rm -f $PIDFILE<br />
	log_end_msg 0<br />
	else<br />
	log_end_msg 1<br />
fi<br />
;;<br />
reload)<br />
log_daemon_msg "Reloading $DESC configuration" $NAME<br />
if start-stop-daemon --stop --signal 2 --oknodo --retry 30\<br />
	--quiet --pidfile $PIDFILE --exec $DAEMON; then<br />
	if start-stop-daemon --start --quiet  \<br />
		--pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS ; then<br />
		log_end_msg 0<br />
		else<br />
		log_end_msg 1<br />
	fi<br />
	else<br />
	log_end_msg 1<br />
fi<br />
;;<br />
restart|force-reload)<br />
$0 stop<br />
sleep 1<br />
$0 start<br />
;;<br />
*)<br />
echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&#038;2<br />
exit 1<br />
;;<br />
esac<br />
<br />
exit 0<br />
</code></p>
<p>Jetzt noch mit <a href="http://de.wikipedia.org/wiki/Chmod" target="_blank">chmod</a> das Ausführen der Datei erlauben:</p>
<p><code># chmod 700 /etc/init.d/nginx</code></p>
<p>Nun können wir uns freuen und den nginx das erste Mal starten:</p>
<p><code># /etc/init.d/nginx start</code></p>
<p>Ist alles korrekt und das Konfigurationsfile ohne Fehler, sollte der nginx starten und die Webseite unter der konfigurierten Domain erreichbar sein.</p>
<h4>nginx Autostart</h4>
<p>Damit der nginx auch beim nächsten Server-Neustart automatisch startet, benötigen wir einen Eintrag bzw. einen <a href="http://de.wikipedia.org/wiki/Symbolische_Verkn%C3%BCpfung" target="_blank">symbolischen Link</a> im Runlevel-Startverzeichnis, hier als Beispiel für <a href="http://www.ubuntu.com/" target="_blank">Ubuntu</a>:</p>
<p><code>ln -s /etc/init.d/nginx /etc/rc2.d/S99nginx</code></p>
<p>Somit startet nginx beim nächsten Neustart des Servers im Runlevel 2 automatisch. Falls ein anderes Runlevel läuft (ersichtlich mit dem Befehl &#8220;runlevel&#8221;), einfach den Link im jeweiligen Verzeichnis erstellen.</p>
<h3>Und nun: Viel Spaß mit nginx!</h3>
<p>Das wars! Ich hoffe ich konnte Dir hier einen kleinen Einstieg in nginx vermitteln. Ein Artikel zur Verwendung von PHP und Installation von WordPress folgt demnächst. Bei Fragen, Verbesserungen oder Angregungen freue ich mich über Kommentare. </p>
<h4>Weiterführende Links</h4>
<p>- <a href="http://nginx.org/">nginx-Webseite</a><br />
- <a href="http://wiki.nginx.org/Main">nginx-Wiki</a><br />
- <a href="http://de.wikipedia.org/wiki/Nginx">nginx bei Wikipedia</a><br />
- <a href="http://wiki.ubuntuusers.de/nginx">nginx bei Ubuntu</a></p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/nginx-eine-echte-apache-alternative.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP-Einzeiler</title>
		<link>http://stetix.de/php-einzeiler.html</link>
		<comments>http://stetix.de/php-einzeiler.html#comments</comments>
		<pubDate>Wed, 22 Dec 2010 13:05:39 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[einzeiler]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1666</guid>
		<description><![CDATA[Ich liebe Einzeiler und in einer Zeile Code das zu machen, wofür andere oder man selbst vorher ganze 20 Zeilen oder mehr benötigte. Um sich diese Einzeiler zu merken, fange ich hier einfach mal eine Liste an, die ich ständig erweitern werde. Auch wenn die Zeichen aufgrund mangelnder Breite in meinem Layout umbrechen, sind dies [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>Ich liebe Einzeiler und in einer Zeile Code das zu machen, wofür andere oder man selbst vorher ganze 20 Zeilen oder mehr benötigte. Um sich diese Einzeiler zu merken, fange ich hier einfach mal eine Liste an, die ich ständig erweitern werde.</p>
<p>Auch wenn die Zeichen aufgrund mangelnder Breite in meinem Layout umbrechen, sind dies alles Einzeiler ;-)</p>
<h3>Zufallsstring mit PHP &#8211; Einzeiler</h3>
<h4>Variante 1</h4>
<p><code>echo substr(str_shuffle("23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"), 0, 8);<br />
</code><br />
Ja, ich kann zählen und das Alphabet auch. Unnötige und für Passwörter ungeeignete Zeichen habe ich hier weg gelassen.</p>
<h4>Variante 2</h4>
<p>Wer es noch kürzer braucht, kann auch md5 nehmen. Danke an Jonathan für den Hinweis. Aber Achtung, hier sind nur die Zeichen 0-9 und a-f enthalten.<br />
<code>echo substr(md5(time()),0,8);</code><br />
Du hast auch schöne Einzeiler, die richtig Sinn und das PHP-Entwickler-Leben leichter machen? Bitte ab damit in die Kommentare oder per E-Mail an mich. Danke!</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/php-einzeiler.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>WordPress-Plugins: Welche sind Pflicht und Must Have?!</title>
		<link>http://stetix.de/wordpress-plugins-welche-sind-pflicht-und-must-have.html</link>
		<comments>http://stetix.de/wordpress-plugins-welche-sind-pflicht-und-must-have.html#comments</comments>
		<pubDate>Fri, 17 Dec 2010 15:02:49 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1640</guid>
		<description><![CDATA[Da drüben macht sich Robert gerade nackig und erzählt uns, welche WordPress-Plugins er als Must Have&#8217;s erachtet und man unbedingt in seinem WordPress-Blog installiert haben sollte. Natürlich gibt es solche Listen schon wie Sand am Meer, ist mir aber egal, ich finde solche Listen nämlich super interessant, da man hier das ein oder andere Plugin [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2010/12/wordpress-plugins.gif" alt="wordpress plugins Wordpress Plugins: Welche sind Pflicht und Must Have?!" title="wordpress-plugins" width="412" height="166" class="alignright size-full wp-image-1647" />Da drüben <a href="http://www.robertbasic.de/2010/12/wordpress-plugins-must-have/">macht sich Robert gerade nackig</a> und erzählt uns, welche <a href="http://wordpress.org/extend/plugins/">WordPress-Plugins</a> er als Must Have&#8217;s erachtet und man unbedingt in seinem WordPress-Blog installiert haben sollte. Natürlich gibt es solche Listen schon <a href="http://www.google.de/search?hl=de&#038;lr=lang_de&#038;tbs=lr%3Alang_1de&#038;q=wichtigste+wordpress+plugins">wie Sand am Meer</a>, ist mir aber egal, ich finde solche Listen nämlich super interessant, da man hier das ein oder andere Plugin entdeckt, welches man selbst noch nicht installiert oder entdeckt hat. Zum anderen ist bei Roberts Erfahrung natürlich interessant zu sehen was er so bevorzugt. Das Plugin <a href="http://wordpress.org/extend/plugins/gurken-subscribe-to-comments/">Gurken Subscribe to Comments</a> hab ich mir zum Beispiel schon mal installiert, danke! Deshalb zieh ich hier auch mal blank und schreib euch mal meine Liste der 10+1 Must Have WordPress-Plugins nieder. Das Ganze in alphabetischer Reihenfolge, damit sich kein Plugin benachteiligt vorkommt und nachher Amok läuft ;-) (Das Redirection-Plugin hat das gestern übrigens getan und die Startseite beim Posten eines neuen Artikels immer auf diesen Artikel weitergeleitet. Nett, sowas kann bei Plugins auch passieren!) Auf die Liste los:</p>
<p><strong>1. <a href="http://www.introsites.co.uk/33~html-wordpress-permalink-on-pages-plugin.html">.html on PAGES</a></strong></p>
<p>Ich finde wichtig, das man alle Dateiendungen &#8211; sofern man welche nutzt &#8211; auf einer Webseite einheitlich hat. Da ich bei Posts die Endung .html bevorzuge, sollten auch die Seiten diese Endung haben dürfen. Man sagt es sei auch wichtig für Google.</p>
<p><strong>2. <a href="http://semperfiwebdesign.com/">All in One SEO Pack</a></strong></p>
<p>Das ultimative SEO-Plugin. Hier kann man eigentlich alles einstellen, was man an SEO benötigt. Es gibt sicher einige andere oder bessere, hab mich aber auf dieses eingeschossen.</p>
<p><strong>3. <a href="http://antispambee.de/">Antispam Bee</a></strong></p>
<p>Verhindert Spam in Kommentaren und Pings sehr zuverlässig. Ziehe ich Askimet unbedingt vor, da es dem deutsche Datenschutz gerecht wird (falls das möglich ist:) und man hier keinen API-Key benötigt und es genauso gut wenn nicht besser läuft als Askimett.</p>
<p><strong>4. <a href="http://blog.gohsy.com/topics/tag/delete-revision">Delete-Revision</a></strong></p>
<p>WordPress legt bei jedem Speichern eine Version das Posts an, d.h. pro Speichern ein Datensatz in der Datenbank. Das wird natürlich bei vielen Artikeln auch ohne akutem Zucken auf den Speichern-Button eine Menge an Daten, die später so nicht mehr benötigt werden. Das Löschen der nicht benötigten Versionen bzw. Revisionen erledigt dieses Müllschlucker-Plugin &#8220;Delete-Revision&#8221; zuverlässig. Yamyam!</p>
<p><strong>5. <a href="http://yoast.com/wordpress/permalink-redirect/">Permalink Redirect</a></strong></p>
<p>Noch ein SEO-Plugin. Entfernt alle unnötigen GET-Parameter bzw. Attribute und URL-Parts (the whole Crap!) von der URL und leitet auf die eigentliche URL weiter. Verhindert Duplicate Content. Wichtig für Google und SEO, also ein Muss.</p>
<p><strong>6. <a href="http://www.microkid.net/wordpress/permalinks-moved-permanently/">Permalinks Moved Permanently</a></strong></p>
<p>Ändert man mal den Permalink, also die URL eines Posts, muß die alte natürlich auf die neue weitergelietet werden. Das erledigt dieses nette Plugin.</p>
<p><strong>7. <a href="http://yoast.com/wordpress/robots-meta/">Robots Meta</a></strong></p>
<p>Ermöglicht pro Artikel oder Seite die Einstellung des Robots-Meta-Tag&#8217;s. Hiermit lässt sich bestimmen, welche Seiten oder Artikel im Google-Index indexiert werden sollen und wo Links verfolgt werden dürfen. Sehr nützlich für den SEO-Steuermann.</p>
<p><strong>8. <a href="http://www.prelovac.com/vladimir/wordpress-plugins/seo-friendly-images">SEO Friendly Images</a></strong></p>
<p>Fügt automatische Alt- und Title-Attribute zu Bildern hinzu. Genial, wenn man mit Bildern in Google gefunden werden will. Spart &#8216;ne Menge Arbeit.</p>
<p><strong>9. <a href="http://www.ilfilosofo.com/blog/wp-db-backup">WordPress Database Backup</a></strong></p>
<p>Hier kann man sich das Backup der WP-Datenbank in einem bestimmten Interval, beispielsweisse täglich, per Mail zusenden lassen, auf einem Rechner oder in einem Verzeichnis speichern lassen. Security first!</p>
<p><strong>10. <a href="http://ocaoimh.ie/wp-super-cache/">WP Super Cache</a></strong></p>
<p>Cached alle Inhalte als statische HTML-Seiten, was die Ladezeit um einiges veringert. Dauer und Regeln lassen sich beliebig anpassen.</p>
<p><strong>11. <a href="http://mitcho.com/code/yarpp/">Yet Another Related Posts Plugin</a></strong></p>
<p>Verlinkt passende Artikel untereinander. Klasse Plugin und Algorithmus! Bringt nicht nur dem benutzer viel Komfort, sondern auch Google und SEO.</p>
<p>Das ist sie also, meine Liste der Plugins die ich aktuell und aus den letzten 6 Jahren Erfahrung am wichtigsten erachte. </p>
<p>Nein, ein Plugin zur Integration von Twitter oder Facebook hab ich nicht, das hab ich bisher lieber selbst gemacht, da die meissten das Design zerschossen haben und das Fixing zu aufwendig gewesen wäre oder mir eben benötigte Features fehlten. Vielleicht findet sich aber noch ein brauchbares.</p>
<p>Wie sieht es bei euch aus, was habt Ihr unter der Haube? Oder haltet Ihr das ein oder andere Plugin für Käse? </p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/wordpress-plugins-welche-sind-pflicht-und-must-have.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Auf WordPress entwickeln oder lieber eigene Anwendungen z.B. in Ruby on Rails schreiben?</title>
		<link>http://stetix.de/auf-wordpress-entwickeln-oder-lieber-eigene-anwendungen-z-b-in-ruby-on-rails-schreiben.html</link>
		<comments>http://stetix.de/auf-wordpress-entwickeln-oder-lieber-eigene-anwendungen-z-b-in-ruby-on-rails-schreiben.html#comments</comments>
		<pubDate>Thu, 16 Dec 2010 15:48:13 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1613</guid>
		<description><![CDATA[Aktuell stelle ich mir oft die Frage, ob ich Software für WordPress entwickle oder eine eigene Anwendung in Ruby on Rails schreibe. Beides hat seine Vor- und Nachteile. Ich entwickle seit 10 Jahren Software in PHP, seit etwa 5 Jahren auch in Ruby on Rails, was ich aufgrund seiner vielen bekannten positiven Eigenschaften bei komplett [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2010/12/wordpress-oder-rails.jpg" alt="wordpress oder rails Auf Wordpress entwickeln oder lieber eigene Anwendungen z.B. in Ruby on Rails schreiben?" title="wordpress-oder-rails" width="351" height="186" class="alignright size-full wp-image-1622" />Aktuell stelle ich mir oft die Frage, ob ich Software für WordPress entwickle oder eine eigene Anwendung in Ruby on Rails schreibe. Beides hat seine Vor- und Nachteile. Ich entwickle seit 10 Jahren Software in PHP, seit etwa 5 Jahren auch in Ruby on Rails, was ich aufgrund seiner vielen bekannten positiven Eigenschaften bei komplett neuen Anwendungen auf jeden Fall vorziehen würde. Aus diesem Grund stellt sich mir diese Frage, obwohl Rails und WordPress auf den ersten Blick ja nicht unbedingt in der gleichen Kategorie von Tools anzusiedeln sind, auf den zweiten aber beides Frameworks mit ähnlichen Voraussetzungen sind.</p>
<p><a href="http://wordpress.org/">WordPress</a> hat eine riesige Community, viele Nutzer und einen hohen Bekanntheitsgrad. Wenn man beispielsweisse ein <a href="http://codex.wordpress.org/Plugins">WordPress-Plugin</a> schreiben möchte, kann man sich <a href="http://wordpress.org/extend/plugins/">durch schon vorhandene Plugins</a> wuseln und von bestehendem Code Anregungen holen und evtl. sogar Teile verwenden &#8211; natürlich nur unter Einhaltung des Copyrights. Möchte man dieses Plugin verkaufen, hat man mit WordPress eine sehr große und täglich wachsende Menge an potenziellen Kunden. Ein weiterer Vorteil ist die große Menge an Einsatzgebieten von WordPress. WordPress kann als Blog verwendet werden, als normale Webseite mit oder ohne CMS, als Forum, als Gallery, als Community und und und. Das meiste natürlich mit fertigen Plugins. Warum also etwas eigenes entwickeln, wenn es alles schon gibt? Zumal ja fast jede Webseite sowieso einen Blog und somit auch WordPress hat und benötigt. Die Nachteile bei WordPress liegen ganz klar bei der mangelnden Performance und &#8211; für mich persönlich &#8211; an der  etwas veralteten Scriptsprache <a href="http://de.php.net/">PHP</a>. Logisch kann man die Performance mit ein paar Tricks, passenden Plugins und besserer Server-Hardware tunen, dennoch ist WordPress den eigenen Lösungen in PHP oder Ruby On Rails klar unterlegen. Gerade wenn der Content in der Datenbank wächst &#8211; und ich meine hiermit eine Menge von 1000+ Artikeln &#8211; wird WordPress zur Slow-Motion-Bremse.</p>
<p><a href="http://rubyonrails.org/">Ruby on Rails</a> ist hingegen, wenn man es richtig anstellt, ein richtiger Turbo und Spaßfaktor. Das Coden in Ruby macht einfach einen Riesenspaß, was die Produktivität um einiges steigert. Das <a href="http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself">DRY-Prinzip</a> richtig angewendet, muß hier bei gleicher Funktionalität auch weniger Code geschrieben werden. Man kann also sagen, das mit Rails einfacher in hoher Qualität Software entwickelt werden kann. Ebenso gibt es für fast alle Belange fertige Plugins und Librarys, die man beliebig erweitern und verwenden kann. Die Menge der Entwickler ist zwar hoch und wird immer höher, aber es gibt lange noch nicht so viele wie für WordPress. Ruby On Rails wird eher von Profis eingesetzt, Hobby-Entwickler hingegen greifen schnell zu PHP und WordPress. Desweiteren benötigt man für Rails immer eine gesonderte Server-Konfiguration, weshalb die meisten bekannten Webhoster hier ausscheiden. Noch ein negativer Punkt ist, das es für Rails keine gute Blog-Software gibt. Zwar sind <a href="https://github.com/fdv/typo/wiki/">einige</a> <a href="http://radiantcms.org/">wenige</a> <a href="https://github.com/halorgium/mephisto">Versuche</a> <a href="https://github.com/xaviershay/enki">vorhanden</a>, die an WordPress jedoch bei weitem nicht heranreichen. Schade eigentlich, eine gute Blog-Software in Ruby wär was feines und sicher ein schönes Projekt.</p>
<p>Also bleibt ganz klar eines zu sagen. Möchte man Software vielen Millionen Menschen verfügbar machen oder womöglich verkaufen, empfiehlt sich der Einsatz von WordPress. Legt man jedoch Wert auf Performance,  Spaß beim Coden und hat Profis zur Hand, ist Rails eine gute Wahl. Also ist meine erste Überlegung in der Richtung ab jetzt: &#8220;Möchte ich die Software nur für mich oder auserwählte Kunden nutzen oder an tausende Kunden verkaufen?&#8221;.</p>
<p><strong>Was meint Ihr dazu?</strong> Lieber WordPress oder Rails bzw. anderen Sprachen oder Frameworks? Freu mich über Kommentare!</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/auf-wordpress-entwickeln-oder-lieber-eigene-anwendungen-z-b-in-ruby-on-rails-schreiben.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Höhe von HTML-Elementen automatisch anpassen &#8211; mit jQuery und Javascript</title>
		<link>http://stetix.de/hoehe-von-html-elementen-automatisch-anpassen-jquery-und-javascript.html</link>
		<comments>http://stetix.de/hoehe-von-html-elementen-automatisch-anpassen-jquery-und-javascript.html#comments</comments>
		<pubDate>Wed, 22 Sep 2010 20:09:40 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1550</guid>
		<description><![CDATA[Oft kommt es vor, das man zwei oder mehr Elemente, sei es nun ein Layer, Bild oder was auch immer, mit gleicher Höhe darstellen will. Das stellt bei statischen Inhalten überhaupt kein Problem dar, gibt es doch die schöne CSS-Eigenschaft height. Was aber, wenn wir dynamische Inhalte darstellen wollen und gar nicht wissen wieviel Inhalt [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2010/09/boxes1.gif" alt="boxes1 Höhe von HTML Elementen automatisch anpassen   mit jQuery und Javascript" title="boxes" width="150" height="82" class="alignright size-full wp-image-1581" />Oft kommt es vor, das man zwei oder mehr Elemente, sei es nun ein Layer, Bild oder was auch immer, mit gleicher Höhe darstellen will. Das stellt bei statischen Inhalten überhaupt kein Problem dar, gibt es doch die schöne <a href="http://de.wikipedia.org/wiki/Cascading_Style_Sheets">CSS</a>-Eigenschaft <a href="http://www.css4you.de/height.html">height</a>. </p>
<p>Was aber, wenn wir dynamische Inhalte darstellen wollen und gar nicht wissen wieviel Inhalt wir pro Element bekommen. Bei Texten, längeren Namen or whatever aus einer Datenbank ist dies oft der Fall. Durch den unterschiedlich langen Inhalt werden die Elemente nun dementsprechend anders hoch dargestellt. Das sieht bei Elementen die wir nebeneinander zeigen möchten meistens ziemlich doof aus.  </p>
<p>Hier kann das <a href="http://de.wikipedia.org/wiki/JavaScript">Javascript</a>-Framework <a href="http://jquery.com/">jQuery</a> helfen. jQuery bietet eine Funktion mit dem Namen <a href="http://api.jquery.com/height/">.height()</a>, die uns die Höhe eines Elements setzen oder auslesen kann. Hier wird nicht einfach die CSS-Eigenschaft height ausgelesen, sondern die fertig gerenderte Höhe des Elements. So braucht man mit jQuery nicht viel Mühe, um alle gewünschten Elemente zu durchlaufen, das höchste zu bestimmen und alle Elemente auf eben diese Höhe anzupassen.</p>
<p><span id="more-1550"></span></p>
<h3>Der HTML-Code</h3>
<p>Gehen wir von folgendem HTML-Code aus. CSS habe ich zu besseren Ansicht inline definiert:</p>
<pre name="code" class="html">&lt;div class="autoheight" style="float: left; width: 200px; background-color: lightgreen;"&gt;
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
&lt;/div&gt;
&lt;div class="autoheight" style="float: left; width: 200px; background-color: orange;"&gt;
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
&lt;/div&gt;
&lt;div class="autoheight" style="float: left; width: 200px; background-color: mediumblue;"&gt;
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
&lt;/div&gt;
</pre>
<h3>Das Javascript mit jQuery</h3>
<p>Zuerst müssen wir die Höhe des höchsten Div&#8217;s ausfindig machen. Wir gehen am besten alle Elemente durch und bestimmen so das höchste von allen. Dazu müssen wir uns den höchsten Wert einfach nur merken und immer vergleichen:</p>
<pre name="code" class="javascript">
/* Variable zum Merken der maximalen Höhe */
var max_height = 0;

/* alle Elemente mit der CSS-Klasse "autoheight" durchlaufen */
$('.autoheight').each(function(e) {

  /* Höhe des aktuellen Elements */
  h = $(this).height();

  /* Wenn Höhe erfolgreich bestimmt werden konnte */
  if(typeof(h) != "undefined") {

        /* Wenn aktuelle Höhe gösser unserer maximalen, Höhe merken */
        if(h > max_height) {
                max_height = h;
        }
  }
});
</pre>
<p>Nun müssen wir alle anderen Elemente höher bekommen. Wenn wir die maximale Höhe bestimmen konnten, wenden wir diese jetzt einfach auf alle Elemente an:</p>
<pre name="code" class="javascript">
if(max_height > 0) {
 $('.autoheight').height(max_height);
}
</pre>
<p>Das ganze Javascript sieht dann so aus:</p>
<pre name="code" class="javascript">
var max_height = 0;
$('.autoheight').each(function(e) {
  h = $(this).height();
  if(typeof(h) != "undefined") {
        if(h > max_height) {
                max_height = h;
        }
  }
});
if(max_height > 0) {
 $('.autoheight').height(max_height);
}
</pre>
<h3>Das fertige Ergebnis als Beispiel</h3>
<p>Das oben beschriebene Beispiel sollte dann in etwa so aussehen:</p>
<p><strong>Boxen original</strong></p>
<div style="float: left; width: 200px; background-color: lightgreen;">
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
</div>
<div style="float: left; width: 200px; background-color: orange;">
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.<br />
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.<br />
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
</div>
<div style="float: left; width: 200px; background-color: mediumblue;">
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.<br />
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
</div>
<div style="clear: left; padding: 20px 0 10px 0;">
<p><strong>Boxen mit jQuery angepasst</strong>
</div>
<div class="autoheight" style="float: left; width: 200px; background-color: lightgreen;">
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
</div>
<div class="autoheight" style="float: left; width: 200px; background-color: orange;">
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.<br />
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.<br />
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
</div>
<div class="autoheight" style="float: left; width: 200px; background-color: mediumblue;">
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.<br />
Hier steht Inhalt, der in der Länge bzw. Höhe variabel sein kann. Zum testen schreib ich hier irgendwas rein.
</div>
<p><script type="text/javascript" src="/jquery.autoheight.js"></script></p>
<div style="clear: left; padding: 20px 0 30px 0;">
Sieht doch gleich viel besser aus. Jetzt können wir das natürlich auf alle gewünschten Elemente anwenden. Optimal für tabellarische Darstellung mit Layern.
</div>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/hoehe-von-html-elementen-automatisch-anpassen-jquery-und-javascript.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Eine Liste mit URL&#8217;s auf 404 Not Found Fehler prüfen: Mit Ruby!</title>
		<link>http://stetix.de/urls-auf-404-fehler-pruefen-mit-ruby.html</link>
		<comments>http://stetix.de/urls-auf-404-fehler-pruefen-mit-ruby.html#comments</comments>
		<pubDate>Wed, 25 Aug 2010 09:19:43 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[404]]></category>
		<category><![CDATA[notfound]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1534</guid>
		<description><![CDATA[Oft kommt es als Webmaster vor, das man eine Liste mit URL&#8217;s auf Fehler prüfen muß. Um zum Beispiel eine Liste mit URL&#8217;s auf tote Links bzw. 404 Not Found Fehler zu prüfen, kann man folgendes in Ruby geschriebene Script zu Hilfe nehmen. Das Script fällt in die Kategorie Quick Hack und ist unbedingt ausbaufähig. [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>Oft kommt es als Webmaster vor, das man eine Liste mit URL&#8217;s auf Fehler prüfen muß. Um zum Beispiel eine Liste mit URL&#8217;s auf <a href="http://de.wikipedia.org/wiki/Toter_Link">tote Links</a> bzw. <a href="http://de.wikipedia.org/wiki/HTTP-Statuscode#4XX_.E2.80.93_Client-Fehler">404 Not Found Fehler</a> zu prüfen, kann man folgendes in Ruby geschriebene Script zu Hilfe nehmen. Das Script fällt in die Kategorie Quick Hack und ist unbedingt ausbaufähig.</p>
<pre name="code" class="ruby">
require 'net/http'

def check_for_notfound(url)
  uri = URI.parse(url)
  response = Net::HTTP.get_response(uri)

  case response
    when Net::HTTPNotFound:
      return true
    when Net::HTTPRedirection:
      puts check_for_notfound('http://' + uri.host + response['location'])
    else
      return nil
  end
end

File.open(ARGV[0]) do |f|
  f.each do |line|
    result = check_for_notfound(line)
    if !result.nil? and result == true
     puts line
    end
  end
end
</pre>
<p>Wer ein besseres Script hat oder etwa eine Möglichkeit weiß, wie man dies mit <a href="http://de.wikipedia.org/wiki/Wget">wget</a> lösen kann, bitte einen Kommentar hinterlassen. Danke!</p>
<p><strong>Update:</strong></p>
<p>Wie ich <a href="http://amadain.net/2007/07/22/use-wget-check-urls-a-web-site">Dank eines anderen Blogs</a> erfahren konnte, ist das mit wget natürlich auch schnell und sogar mit einem Einzeiler lösbar:</p>
<p><code>wget -r -nd --delete-after --no-parent --no-cookies --input-file=urls.txt</code></p>
<p>Ob man nun Ruby oder wget nutzt, hängt ganz davon ab, ob man es in eine Software integrieren möchte oder ob es nur einem schnellen administrativen Todo dienen soll.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/urls-auf-404-fehler-pruefen-mit-ruby.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sinatra 1.0 veröffentlicht: Ein Ruby Web Application Framework</title>
		<link>http://stetix.de/sinatra-1-0-veroffentlicht-ein-ruby-web-application-framework.html</link>
		<comments>http://stetix.de/sinatra-1-0-veroffentlicht-ein-ruby-web-application-framework.html#comments</comments>
		<pubDate>Wed, 24 Mar 2010 12:38:23 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1403</guid>
		<description><![CDATA[Sinatra hat offiziell den Landmark Release 1.0 erreicht. Das schmale Web Application Framework ist eine echte Alternative zu Ruby On Rails, insbesondere wenn man kleinere und schnellere Projekte erstellen möchte. Ich selbst habe es einige Male getestet, aber aus Zeitmangel für&#8217;s Lernen leider noch nicht im Einsatz. Eine einfache Webseite ist in Sinatra leicht geschrieben: [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sinatrarb.com/">Sinatra</a> hat offiziell den Landmark Release 1.0 erreicht. Das schmale Web Application Framework ist eine echte Alternative zu <a href="http://rubyonrails.org/">Ruby On Rails</a>, insbesondere wenn man kleinere und schnellere Projekte erstellen möchte.<br />
Ich selbst habe es einige Male getestet, aber aus Zeitmangel für&#8217;s Lernen leider noch nicht im Einsatz.</p>
<p>Eine einfache Webseite ist in <a href="http://www.sinatrarb.com/">Sinatra</a> leicht geschrieben:</p>
<p><code class="ruby">require 'rubygems'<br />
require 'sinatra'<br />
<br />
get '/hi' do<br />
  "Hello World!"<br />
end</code></p>
<p>Mehr Infos unter <a href="http://www.rubyinside.com/sinatra-1-0-released-3162.html">http://www.rubyinside.com/sinatra-1-0-released-3162.html</a>.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/sinatra-1-0-veroffentlicht-ein-ruby-web-application-framework.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Session Garbage Collection in anderen Verzeichnissen unter Ubuntu und Debian</title>
		<link>http://stetix.de/php-session-garbage-collection-in-anderen-verzeichnissen-unter-ubuntu-und-debian.html</link>
		<comments>http://stetix.de/php-session-garbage-collection-in-anderen-verzeichnissen-unter-ubuntu-und-debian.html#comments</comments>
		<pubDate>Fri, 29 Jan 2010 11:10:41 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sessions]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1371</guid>
		<description><![CDATA[Eben entdeckt: Bei Ubuntu und Debian ist in PHP standardmässig die Garbage Collection deaktiviert. Diese sorgt dafür, das die Sessionfiles für abgelaufene Sessions automatisiert gelöscht werden. Bei Ubuntu und Debian löst ein Cronjob diesen Löschvorgang. Ein Problem entsteht allerdings, wenn man eigene Verzeichnisse für die Sessionfiles definiert. Hier werden die Files dann nicht gelöscht und [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2009/10/php-icon.jpg" alt="php icon PHP Session Garbage Collection in anderen Verzeichnissen unter Ubuntu und Debian" title="php-icon" width="150" height="150" class="alignright size-full wp-image-1040" />Eben entdeckt: Bei <a href="http://www.ubuntu.com/">Ubuntu</a> und <a href="http://www.de.debian.org/">Debian</a> ist in <a href="http://php.net/index.php">PHP</a> standardmässig die <a href="http://de.wikipedia.org/wiki/Garbage_Collection">Garbage Collection</a> deaktiviert. Diese sorgt dafür, das die Sessionfiles für abgelaufene Sessions automatisiert gelöscht werden. Bei Ubuntu und Debian löst ein Cronjob diesen Löschvorgang. </p>
<p>Ein Problem entsteht allerdings, wenn man eigene Verzeichnisse für die Sessionfiles definiert. Hier werden die Files dann nicht gelöscht und bleiben bestehen, was das Verzeichnis &#8211; je nach Traffic &#8211; schnell auf ein paar Tausende Dateien anwachsen lassen kann.</p>
<p>Um die Garbage Collection in PHP zu aktivieren, muss folgender Eintrag in der php.ini (für Apache unter /etc/php5/apache2/php.ini) geändert werden:</p>
<p>VORHER</p>
<p><code>;session.gc_probability = 0<br />
session.gc_divisor     = 100</code></p>
<p>NACHHER</p>
<p><code>session.gc_probability = 1<br />
session.gc_divisor     = 100</code></p>
<p>Diese Änderung bewirkt, das bei jedem hundertsten Start einer Session die Sessionfiles gelöscht werden.</p>
<p>Zusätzlich muss dann noch der Cronjob deaktiviert werden. Hierzu einfach /etc/cron.d/php5 mit dem Editor deiner Wahl bearbeiten und die letzte Zeile auskommentieren:</p>
<p><code># /etc/cron.d/php5: crontab fragment for php5<br />
#  This purges session files older than X, where X is defined in seconds<br />
#  as the largest value of session.gc_maxlifetime from all your php.ini<br />
#  files, or 24 minutes if not defined.  See /usr/lib/php5/maxlifetime<br />
<br />
# Look for and purge old sessions every 30 minutes<br />
#09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] &#038;&#038; [ -d /var/lib/php5 ] &#038;&#038; find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm<br />
</code></p>
<p>Was der Grund für diese Deaktivierung bei Ubuntu oder Debian war konnte ich auf die Schnelle nicht herausfinden, werde es aber in einem Update nachliefern. </p>
<p>Wenn in Linux-Distributionen solche Änderungen vorgenommen werden, sollte man aber passende Toolsets liefern, um alle Variationen abzufangen. So ist das nur eine halbe Sache, wenn ich nichts übersehen habe. Der Bug wurde auch schon <a href="https://bugs.launchpad.net/ubuntu/+source/php5/+bug/316441">im Ubuntu-Bugtracker aufgenommen</a>, aber noch keinem zugeordnet.</p>
<p>Weiterführende Links:</p>
<ul style="margin-bottom: 40px;">
<li><a href="http://de.php.net/manual/de/session.configuration.php#ini.session.gc-probability">PHP Dokumenation: session.gc-probability</a></li>
<li><a href="https://bugs.launchpad.net/ubuntu/+source/php5/+bug/316441">Bug bei Ubuntu</a></li>
</ul>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/php-session-garbage-collection-in-anderen-verzeichnissen-unter-ubuntu-und-debian.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Crontab Tutorial und Syntax: Cronjobs unter Linux einrichten und verstehen</title>
		<link>http://stetix.de/cronjob-linux-tutorial-und-crontab-syntax.html</link>
		<comments>http://stetix.de/cronjob-linux-tutorial-und-crontab-syntax.html#comments</comments>
		<pubDate>Wed, 13 Jan 2010 15:05:03 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[cronjob]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1174</guid>
		<description><![CDATA[Mit Hilfe von Cronjobs können auf Unix- und Linux-Systemen Vorgänge automatisert und zu einem bestimmten Zeitpunkt immer wiederkehrend ausgeführt werden. Diese Vorgänge können einzelne Befehle, Shell-Scripts, Programme, PHP- und sonstige Scriptsprachen-Scripts oder auch eine Anreihung von Linux-Befehlen sein. Beispielsweisse werden Backups, die täglich oder sogar stündlich geschehen sollen meist per Cronjob ausgeführt. Crontab Crontab wird [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2010/01/cronjob.jpg" alt="cronjob Crontab Tutorial und Syntax: Cronjobs unter Linux einrichten und verstehen" title="cronjob" width="300" height="199" class="alignright size-full wp-image-1309" />Mit Hilfe von Cronjobs können auf Unix- und Linux-Systemen Vorgänge automatisert und zu einem bestimmten Zeitpunkt immer wiederkehrend ausgeführt werden. Diese Vorgänge können einzelne Befehle, Shell-Scripts, Programme, PHP- und sonstige Scriptsprachen-Scripts oder auch eine Anreihung von Linux-Befehlen sein. Beispielsweisse werden Backups, die täglich oder sogar stündlich geschehen sollen meist per Cronjob ausgeführt.</p>
<p><span id="more-1174"></span></p>
<h3>Crontab</h3>
<p>Crontab wird die Tabelle genannt, in der die einzelnen Cronjobs definiert und konfiguriert werden. Die Tabelle enthält pro Zeile den Zeitpunkt und die Befehlsfolge, die ausgeführt werden soll. Der Begriff Crontab setzt sich aus dem griechischen Chronos (Zeit) und lateinischen Tabula (die Tafel, das Brett) zusammen. </p>
<p>Gleichzeitig ist crontab auch das Programm, mit dessen Hilfe man die Crontabs bearbeiten kann. Um die Contab zu bearbeiten, muß folgender Befehl eingegeben werden:</p>
<p><code>crontab -e</code></p>
<h3>Crontab Syntax</h3>
<p>Jeder Cronjob hat folgendes Format:</p>
<p><code>* * * * * auszuführender Befehl<br />
┬ ┬ ┬ ┬ ┬<br />
│ │ │ │ │<br />
│ │ │ │ └──── Wochentag (0-7, Sonntag ist 0 oder 7)<br />
│ │ │ └────── Monat (1-12)<br />
│ │ └──────── Tag (1-31)<br />
│ └────────── Stunde (0-23)<br />
└──────────── Minute (0-59)<br />
</code></p>
<p>Ein Stern * bedeutet Ausführung wird immer erfolgen, also zu jeder Minute, jeder Stunde, jedem Tag, jedem Monat oder jedem Wochentag. Um die einzelnen Stellen auseinander zu halten, hilft folgendes Diagram:</p>
<p><code><strong>1 2 3 4 5 Befehl</strong><br />
<br />
1 = Minute (0-59)<br />
2 = Stunde (0-23)<br />
3 = Tag (0-31)<br />
4 = Monat (1-12)<br />
5 = Wochentag (0-7, Sonntag ist 0 oder 7)<br />
Befehl = Der auszuführende Befehl.<br />
</code></p>
<p>Für die ersten fünf Stellen, also die Zeiwerte sind folgende Optionen zusätzlich möglich:</p>
<p>* = Ausführung immer (zu jeder&#8230;)<br />
*/n = Ausführung aller n<br />
n,x,y = Ausführung um/am n, x und y</p>
<h3>Cronjob Beispiele</h3>
<p>Um zum Beispiel jede Nacht um 5 Uhr morgens das Backup auszuführen, würde man den Cronjob folgendermaßen anlegen:</p>
<p><code>0 5 * * *      /usr/bin/backup.sh<br />
</code></p>
<p>Einen Sound alle 10 Minuten Abzuspielen könnte wie folgt aussehen:</p>
<p><code>*/10 * * * *      /usr/bin/play_sound.sh<br />
</code></p>
<p>Eine Erinnerungsmail um 8 und um 17 Uhr zu verschicken geht z.B. so:</p>
<p><code>0 8,17 * * *      /usr/bin/send_reminder_mail.sh<br />
</code></p>
<h3>Ausgabe der Cronjobs</h3>
<p>Die Ausgabe der Cronjobs wird standardmässig per Mail an den jeweiligen System-User der den Cronjob eingerichtet hat gesendet. Um dies zu unterdrücken, könnte man die Ausgabe in eine Datei umleiten oder mit Umleitung zu /dev/null komplett verwerfen:</p>
<p><strong>Cronjob-Ausgabe in Logfile umleiten</strong></p>
<p><code>0 8,17 * * *      /usr/bin/script.sh >>/var/log/cron/send_reminder_mail 2>&#038;1<br />
</code></p>
<p><strong>Cronjob-Ausgabe verwerfen</strong></p>
<p><code>0 8,17 * * *      /usr/bin/script.sh >/dev/null 2>&#038;1<br />
</code></p>
<p>2>&#038;1 bedeutet, das sowohl die normale Ausgabe als auch Fehler in die vorher angegebene Datei umgeleitet werden.</p>
<h3>Cronjob-Dateien und Verzeichnisse</h3>
<p>Zusätzlich zum crontab-Befehl gibt es je nach Distribution Dateien, die systemweite Crontabs beinhalten und nur durch den User root bearbeitet werden können:</p>
<p><strong>/etc/crontab</strong></p>
<p>Die System-Crontab-Datei, in der zusätzlich noch ein System-Benutzer, der den Befehl ausführen soll, mit angegeben werden muß:</p>
<p><code><strong>1 2 3 4 5 Benutzer Befehl</strong><br />
<br />
1 = Minute (0-59)<br />
2 = Stunde (0-23)<br />
3 = Tag (0-31)<br />
4 = Monat (1-12)<br />
5 = Wochentag (0-7, Sonntag ist 0 oder 7)<br />
Benutzer = Benutzername des Benutzers, unter dem der Befehl ausgeführt wird.<br />
Befehl = Der auszuführende Befehl.<br />
</code></p>
<p>Beispiel:<br />
<code>0 8,17 * * *      root /usr/bin/script.sh >>/var/log/cron/send_reminder_mail 2>&#038;1<br />
0 3 * * *      wwwrun /usr/bin/webjobs_nighly.sh >>/var/log/cron/send_reminder_mail 2>&#038;1<br />
</code></p>
<p><strong>/etc/cron* Verzeichnisse</strong></p>
<p>Eine weitere Möglichkeit Cronjobs anzulegen sind die Verzeichnisse unter /etc/cron*, in denen alle enthaltenen Dateien zum bestimmten Zeitpunkt ausgeführt werden. Die Dateien im Einzelnen</p>
<p>/etc/cron.d/ = Erweiterungen zur /etc/crontab-Datei, gleiche Syntax.<br />
/etc/cron.daily/ = Einmal irgendwann täglich.<br />
/etc/cron.hourly/ = Einmal irgendwann stündlich.<br />
/etc/cron.monthly/ = Einmal irgendwann monatlich.<br />
/etc/cron.weekly/ = Einmal irgendwann wöchentlich.</p>
<p>Die letzten vier werden oft genutzt, wenn ein Job in einem bestimmten Interval erledigt werden muß, der genaue Zeitpunkt hierfür aber unerheblich ist.</p>
<h3>Crontab und gut?</h3>
<p><img src="http://stetix.de/wp-content/uploads/2010/01/job-selector1.jpg" alt="job selector1 Crontab Tutorial und Syntax: Cronjobs unter Linux einrichten und verstehen" title="job-selector" width="300" height="300" class="alignright size-full wp-image-1311" /></p>
<p>Ich hoffe, ich konnte einen kleinen Einblick in die Cronjobs unter Linux geben und dem ein oder anderen bei der Syntax behilflich sein. Dieser Artikel entsteht auch mit etwas Eigennutz, da ich auch oft überlegen muß, wie die genaue Reihenfolge in der Crontab nun ist.  Es gibt natürlich noch eine Menge anderer Tools wie <a href="http://linux.about.com/library/cmd/blcmdl1_at.htm">at</a>, <a href="http://anacron.sourceforge.net/">anacron</a>, <a href="http://fcron.free.fr/">fcron</a> und so weiter. Cronjob hat für mich jedoch sehr zuverlässig gearbeitet, weshalb ich andere Tools noch nicht in Betracht gezogen habe.</p>
<p>Let the crons work!</p>
<p style="clear: both; margin-bottom: 30px;">
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/cronjob-linux-tutorial-und-crontab-syntax.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using apc
Database Caching 4/60 queries in 0.016 seconds using apc
Object Caching 2366/2396 objects using apc

Served from: stetix.de @ 2012-05-22 23:15:41 -->
