<?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; Linux</title>
	<atom:link href="http://stetix.de/tag/linux/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>Wed, 31 Aug 2011 14:16:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</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 [...]


&Auml;hnliche Artikel:<ol><li><a href='http://stetix.de/nginx-eine-echte-apache-alternative.html' rel='bookmark' title='Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.'>Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.</a></li>
</ol>]]></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>&Auml;hnliche Artikel:<ol><li><a href='http://stetix.de/nginx-eine-echte-apache-alternative.html' rel='bookmark' title='Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.'>Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.</a></li>
</ol></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. [...]


&Auml;hnliche Artikel:<ol><li><a href='http://stetix.de/wordpress-langsam-php-und-wordpress-schneller-machen-mit-nginx-und-fast-cgi.html' rel='bookmark' title='WordPress langsam? PHP und WordPress schneller machen mit Nginx und Fast-CGI!'>WordPress langsam? PHP und WordPress schneller machen mit Nginx und Fast-CGI!</a></li>
</ol>]]></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>&Auml;hnliche Artikel:<ol><li><a href='http://stetix.de/wordpress-langsam-php-und-wordpress-schneller-machen-mit-nginx-und-fast-cgi.html' rel='bookmark' title='WordPress langsam? PHP und WordPress schneller machen mit Nginx und Fast-CGI!'>WordPress langsam? PHP und WordPress schneller machen mit Nginx und Fast-CGI!</a></li>
</ol></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>Ubuntu auf einem Netbook Samsung N210 Plus installieren</title>
		<link>http://stetix.de/ubuntu-auf-einem-netbook-samsung-n210-installieren.html</link>
		<comments>http://stetix.de/ubuntu-auf-einem-netbook-samsung-n210-installieren.html#comments</comments>
		<pubDate>Wed, 16 Feb 2011 14:25:18 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[n210]]></category>
		<category><![CDATA[netbook]]></category>
		<category><![CDATA[samsung]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1673</guid>
		<description><![CDATA[Für alle, die auf einem Samsung Netbook die Linux Distribution Ubuntu, genauer die Ubuntu Netbook Edition, installieren möchten, hier eine Kurzübersicht mit den einzelnen Installationsschritten. Die Schwierigkeit ist bei Netbooks, das kein CD-ROM Laufwerk vorhanden ist. Durch bootfähige USB-Sticks allerdings kein Thema. Bei meinem Samsung N210 Plus hat dies wunderbar und gleich beim ersten Versuch [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2011/02/ubuntu.jpg" alt="ubuntu Ubuntu auf einem Netbook Samsung N210 Plus installieren" title="ubuntu" width="250" height="263" class="alignright size-full wp-image-1680" />Für alle, die auf einem Samsung Netbook die Linux Distribution <a href="http://www.ubuntu.com/">Ubuntu</a>, genauer die Ubuntu Netbook Edition, installieren möchten, hier eine Kurzübersicht mit den einzelnen Installationsschritten. Die Schwierigkeit ist bei Netbooks, das kein CD-ROM Laufwerk vorhanden ist. Durch bootfähige USB-Sticks allerdings kein Thema. Bei meinem <a href="http://www.samsung.de/de/Privatkunden/Mobil/Notebooks/Mobil/n210maviplus/NP-N210-JP02DE/detail.aspx">Samsung N210 Plus</a> hat  dies wunderbar und gleich beim ersten Versuch geklappt. Ich muß sagen, Windows 7 durch Ubuntu zu ersetzen, war eine sehr gute Entscheidung. Auch wenn es bei mir aktuell noch das ein oder andere Problem mit der Bedienung von Ubuntu gibt, da ich Windows und Mac OS gewohnt bin, ist Ubuntu sehr viel performanter als das vorinstallierte Windows 7. Für Web-Entwickler lohnt es sich noch mehr, da man hier natürlich alle Tools und Dienste die man so benötigt (Apache, Svn, PHP, Ruby usw.) wie unter Linux gewohnt easy installieren kann. Falls du also noch an einer Entscheidung nagst: Go for it!</p>
<p><big><br />
<strong>1. Ubuntu Netbook Edition downloaden</strong><br />
<a href="http://www.ubuntu.com/netbook/get-ubuntu/download" target="_blank">http://www.ubuntu.com/netbook/get-ubuntu/download</a></p>
<p>&nbsp;<br />
<strong>2. USB-Stick mit mindestens 800 MB besorgen</strong></p>
<p>&nbsp;<br />
<strong>3. Universal USB Installer für Windows downloaden</strong><br />
<a href="http://www.pendrivelinux.com/downloads/Universal-USB-Installer/Universal-USB-Installer.exe" target="_blank">http://www.pendrivelinux.com/downloads/Universal-USB-Installer/Universal-USB-Installer.exe</a></p>
<p>&nbsp;<br />
<strong>4. .iso mit dem Universal USB Installer auf den USB-Stick installieren</strong></p>
<p>&nbsp;<br />
<strong>5. Das Netbook von USB booten: Escape gedrückt halten, USB als Boot-Device auswählen</strong></p>
<p>&nbsp;<br />
<strong>6. Ubuntu installieren</strong></p>
<p>&nbsp;<br />
</big></p>
<p>Das war&#8217;s schon. Ansich wirklich kein Thema, wenn man sowas noch nie gemacht hat, ist so eine Kurzanleitung sicher ganz hilfreich.</p>
<p>Da die Funktions-Tasten (Screen-Beleuchtung, Lautstärke etc.) von Anfang an bei Ubuntu nicht funktionieren, hat mir <a href="http://www.absurde-zeiten.de/ubuntu-samung-p210-backlight-problem/">diese Anleitung</a> geholfen sie in Gang zu bekommen.</p>
<p>Viel Spaß!</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/ubuntu-auf-einem-netbook-samsung-n210-installieren.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Howto: Xen Loop Disk Image vergrössern</title>
		<link>http://stetix.de/howto-xen-loop-disk-image-vergroessern.html</link>
		<comments>http://stetix.de/howto-xen-loop-disk-image-vergroessern.html#comments</comments>
		<pubDate>Tue, 06 Jul 2010 09:56:24 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[e2fsck]]></category>
		<category><![CDATA[filesystem]]></category>
		<category><![CDATA[KVM]]></category>
		<category><![CDATA[Loop Device]]></category>
		<category><![CDATA[QEMU]]></category>
		<category><![CDATA[resite2fs]]></category>
		<category><![CDATA[Virtualbox]]></category>
		<category><![CDATA[VServer]]></category>
		<category><![CDATA[Win4lin]]></category>
		<category><![CDATA[xen]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1467</guid>
		<description><![CDATA[Win4lin, KVM, QEMU, Virtualbox und Xen sind viel genutze Techniken zur Server Virtualisierung. Oft wird bei virtuellen Servern, auch genannt VServer, ein sogenantes Loop Filesystem mit einer etwas kleineren Grösse genutzt. 1 GB ist groß für eine einzelne Datei, aber nicht groß genug, wenn die Datei als ein ganzes Filesystem dienen soll. Schnell merkt man [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2010/07/hdd.jpg" alt="hdd Howto: Xen Loop Disk Image vergrössern" title="hdd" width="128" height="128" class="alignright size-full wp-image-1470" />Win4lin, KVM, QEMU, Virtualbox und Xen sind viel genutze Techniken zur Server Virtualisierung. Oft wird bei virtuellen Servern, auch genannt VServer, ein sogenantes <a href="http://de.wikipedia.org/wiki/Loop_device">Loop Filesystem</a> mit einer etwas kleineren Grösse genutzt. 1 GB ist groß für eine einzelne Datei, aber nicht groß genug, wenn die Datei als ein ganzes Filesystem dienen soll.</p>
<p>Schnell merkt man das die Größe der Festplatte nicht mehr ausreicht und der freie Speicherplatz wird immer geringer. Was also tun? Zum Glück kann man ein Loop Device problemlos vergrössern. Die folgende Anleitung beschreibt, wie man auf Linux-Systemen ein solches Loop Disk Image vergrössern kann, sofern man das <a href="http://de.wikipedia.org/wiki/Ext2">ext2</a> oder <a href="http://de.wikipedia.org/wiki/Ext3">ext3 Filesystem</a> nutzt (Unter <a href="http://de.wikipedia.org/wiki/Ext4">ext4</a> sollte dies ebenso laufen, wurde allerdings noch nicht getestet).</p>
<p><big><strong>1.</strong></big> Virtuellen Server stoppen, der das zu vergrößernde Loop Device nutzt</p>
<p><big><strong>2.</strong></big> Falls genügend Platz vorhanden ist, Backup des aktuellen Loop Devices erstellen mit:</p>
<p><code># cp loop_image_file loop_image_file.backup</code></p>
<p><big><strong>3.</strong></big> Folgenden Befehl zum Vergrössern des Loop Devices bzw. der Loop Disk Image nutzen:</p>
<p><code># dd if=/dev/zero bs=1024k count=1024 >> loop_image_file</code></p>
<p>Anstatt &#8220;loop_image_file&#8221; den Pfad zu Eurem Loop Disk Image nutzen. der Befehl fügt dem Image 1 GB Platz hinzu. Möchte man mehr Platz hinzufügen, ändert man einfach den count-Paremeter entsprechend des gewünschten Platzes. Unbedingt sicher gehen, das der zweifache (also hinzufügende) Redirector >> genutzt wird und nicht der einfache >. Sonst würde das File einfach überschrieben werden (deshalb auch zur Sicherheit unser Backup :-).</p>
<p><big><strong>4.</strong></big> Plattencheck auf das neue vergrösserte Filesystem ausführen:</p>
<p><code># e2fsck -f loop_image_file</code></p>
<p><big><strong>5.</strong></big> Filesystem mit folgendem Befehl vergrössern bzw. auf die Grösse anpassen</p>
<p><code># resize2fs loop_image_file</code></p>
<p><big><strong>6.</strong></big> Virtuellen Server starten.</p>
<p>Jetzt sollte auf dem VServer beim Ausführen von &#8220;df&#8221; mehr Platz zur Verfügung stehen. </p>
<p>Das ist eine Übersetzung des Original-Posts &quot;<a href="http://mediakey.dk/~cc/howto-resize-xen-loop-disk-image/">Howto: Resize Xen Loop Disk Image</a>&quot;.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/howto-xen-loop-disk-image-vergroessern.html/feed</wfw:commentRss>
		<slash:comments>0</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>0</slash:comments>
		</item>
		<item>
		<title>3 Linux-Befehle um Performance-Probleme in Ruby on Rails Applikationen zu finden</title>
		<link>http://stetix.de/3-linux-befehle-um-performance-probleme-in-ruby-on-rails-applikationen-zu-finden.html</link>
		<comments>http://stetix.de/3-linux-befehle-um-performance-probleme-in-ruby-on-rails-applikationen-zu-finden.html#comments</comments>
		<pubDate>Fri, 08 Jan 2010 11:42:04 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1214</guid>
		<description><![CDATA[Passend zu meinem Artikel zum Zählen und summieren in Logfiles unter Linux, gibt es einen interessanten Artikel von Effectif.com, in dem beschrieben wird, wie man Performance-Probleme in Ruby on Rails eingrenzen bzw. finden kann: 3 Unix commands for finding performance problems &#196;hnliche Artikel:Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux [...]


&Auml;hnliche Artikel:<ol><li><a href='http://stetix.de/nginx-eine-echte-apache-alternative.html' rel='bookmark' title='Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.'>Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Passend zu meinem Artikel zum <a href="/2009/08/31/linux-bash-snippet-eintraege-in-logfiles-zaehlen.html">Zählen und summieren in Logfiles unter Linux</a>, gibt es einen <a href="http://effectif.com/articles/finding-performance-problems">interessanten Artikel von Effectif.com</a>, in dem beschrieben wird, wie man Performance-Probleme in Ruby on Rails eingrenzen bzw. finden kann:</p>
<p><a href="http://effectif.com/articles/finding-performance-problems">3 Unix commands for finding performance problems</a></p>


<p>&Auml;hnliche Artikel:<ol><li><a href='http://stetix.de/nginx-eine-echte-apache-alternative.html' rel='bookmark' title='Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.'>Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/3-linux-befehle-um-performance-probleme-in-ruby-on-rails-applikationen-zu-finden.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie sehen Linux, Mac und Windows-Freaks die Betriebssysteme der Anderen?</title>
		<link>http://stetix.de/wie-sehen-linux-mac-und-windows-freaks-die-betriebssysteme-der-anderen.html</link>
		<comments>http://stetix.de/wie-sehen-linux-mac-und-windows-freaks-die-betriebssysteme-der-anderen.html#comments</comments>
		<pubDate>Thu, 17 Dec 2009 14:36:49 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Fun]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[os]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1126</guid>
		<description><![CDATA[Ohne Worte. Via Caschy. No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2009/12/howfanboysseeoperatingsystems.jpg" alt="howfanboysseeoperatingsystems Wie sehen Linux, Mac und Windows Freaks die Betriebssysteme der Anderen?" title="howfanboysseeoperatingsystems" width="588" height="430" class="alignnone size-full wp-image-1127" /></p>
<p>Ohne Worte. Via <a href="http://stadt-bremerhaven.de/fanboys-so-sehen-wir-betriebssysteme">Caschy</a>.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/wie-sehen-linux-mac-und-windows-freaks-die-betriebssysteme-der-anderen.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>rsync error: remote command not found</title>
		<link>http://stetix.de/rsync-error-remote-command-not-found.html</link>
		<comments>http://stetix.de/rsync-error-remote-command-not-found.html#comments</comments>
		<pubDate>Tue, 13 Oct 2009 11:51:29 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[rsync]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1046</guid>
		<description><![CDATA[Möchte man ein Verzeichnis auf einen anderen Server übertragen, nutzt man hierfür unter Linux den Befehl rsync. Rsync muß auf beiden Servern, also den lokalen und entfernten Maschinen, vorhanden sein. Ist rsync auf dem Remote-Server nicht installiert, kommt eine solche oder ähnliche Fehlermeldung: bash: line 1: rsync: command not found rsync: connection unexpectedly closed (0 [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>Möchte man ein Verzeichnis auf einen anderen Server übertragen, nutzt man hierfür unter Linux den Befehl <a href="http://de.wikipedia.org/wiki/Rsync">rsync</a>. <a href="http://de.wikipedia.org/wiki/Rsync">Rsync</a> muß auf beiden Servern, also den lokalen und entfernten Maschinen, vorhanden sein. Ist <a href="http://de.wikipedia.org/wiki/Rsync">rsync</a> auf dem Remote-Server nicht installiert, kommt eine solche oder ähnliche Fehlermeldung:</p>
<p><p><code>bash: line 1: rsync: command not found<br />
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]<br />
rsync error: remote command not found (code 127) at io.c(453) [receiver=x.x.x]<br />
</code></p>
</p>
<p>Hat man keinen Root-Zugriff auf dem Remote Server, so stellt dies kein Problem dar. Rsync kann auch ganz leicht im eigenen Home-Verzeichnis installiert werden. Hierfür geht man einfach auf die <a href="http://samba.anu.edu.au/rsync/">rsync-Webseite</a> unter <a href="http://samba.anu.edu.au/rsync/">http://samba.anu.edu.au/rsync/</a> und lädt sich die aktuelle rsync-Version (in diesem Beispiel 3.0.6) herunter, entpackt und kompiliert diese:</p>
<p><code>wget http://samba.anu.edu.au/ftp/rsync/src/rsync-3.0.6.tar.gz<br />
tar -xvzf rsync-3.0.6.tar.gz<br />
cd rsync-3.0.6<br />
./configure --prefix=/pfad/zu/deinem/homedir<br />
make<br />
</code></p>
<p>Und schon hat man eine lauffähige rsync-Version installiert und muß nun noch in der .bashrc oder .cshrc den entsprechenden Pfad hinzufügen:</p>
<p><code>vi ~/.bashrc<br />
</code></p>
<p>Folgende Zeile einfügen:</p>
<p><code>export PATH=$PATH:/pfad/zu/deinem/homedir/rsync-3.0.6</code></p>
<p>Anstatt /pfad/zu/deinem/homedir natürlich den Pfad zu deinem Homeverzeichnis.</p>
<p>Jetzt kann man ganz normal vom entfernten Rechenr den rsync starten</p>
<p><code>rsync -e ssh -avzr remoteserver:~/wasauchimmer/ /lokaler/pfad/wasauchimmer/</code></p>
<p>Das funktioniert natürlich nicht nur mit rsync, sondern auch mit anderen Tools, die ansich kein Root-Recht zum installieren benötigen.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/rsync-error-remote-command-not-found.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lustige Linux Kommandos &amp; Befehle</title>
		<link>http://stetix.de/lustige-linux-kommandos-befehle.html</link>
		<comments>http://stetix.de/lustige-linux-kommandos-befehle.html#comments</comments>
		<pubDate>Tue, 29 Sep 2009 10:26:33 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Fun]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=948</guid>
		<description><![CDATA[Als Linux-Sysadmin hat man viel mit Befehlen zu tun. Befehlsempfänger ist eine sogenannte Shell, auf der man in einer Eingabezeile die Kommandos eingeben kann. Ab und zu laufen einem lustige Befehle über den Weg, die oft auch als Eselsbrücke dienen. Eine kleine Auflistung möchte ich hier starten. Hast du auch lustige Befehle? Bitte schicke Sie [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2009/09/terminal-smiley.png" alt="terminal smiley Lustige Linux Kommandos & Befehle" title="terminal-smiley" width="128" height="128" class="alignright size-full wp-image-978" />Als Linux-Sysadmin hat man viel mit Befehlen zu tun. Befehlsempfänger ist eine sogenannte <a href="http://de.wikipedia.org/wiki/Unix-Shell">Shell</a>, auf der man in einer Eingabezeile die <a href="http://de.wikipedia.org/wiki/Unix-Kommandos">Kommandos</a> eingeben kann.<br />
Ab und zu laufen einem lustige Befehle über den Weg, die oft auch als Eselsbrücke dienen. Eine kleine Auflistung möchte ich hier starten. </p>
<p><strong>Hast du auch lustige Befehle?</strong><br />
Bitte schicke Sie mir oder schreib Sie in die Kommentare, ich werde Sie dann der Liste hinzufügen. Vielen Dank!</p>
<h3>Liste lustiger Linux/Unix-Kommandos</h3>
<p>Durch die Blume:</p>
<p><code>bash:~# netstat -tulpen</code></p>
<p>Wenn man hungrig ist:</p>
<p><code>bash:~# ps haxen</code></p>
<p>Linux will keine Liebe machen:</p>
<p><code>bash:~# make love<br />
make: *** No rule to make target `love'.  Stop.</code></p>
<p>Krieg zum Glück auch nicht:</p>
<p><code>bash:~# make war<br />
make: *** No rule to make target `war'.  Stop.</code></p>
<p>Ohne Widerrede dagegen wird folgendes ausgeführt:</p>
<p><code>bash:~# touch me</code></p>
<p>Versaut geht es gar nicht:</p>
<p><code>bash:~# %blow<br />
-bash: fg: %blow: no such job</code></p>
<p>Keine Anleitung für Frauen.</p>
<p><code>bash:~# nice man woman<br />
No manual entry for woman</code></p>
<p>Funny</p>
<p><code>bash:~# \(-<br />
-bash: (-: command not found</code></p>
<p>Ne Runde schlafen:</p>
<p><code>bash:~# while true; do sleep 1; done</code></p>
<p>Und weg:</p>
<p><code>bash:~# ex - und hopp<br />
2 Dateien zur Bearbeitung</code></p>
<p>Einfach mal Klamotten zählen:</p>
<p><code>bash:~# socklist</code></p>
<p>Linux ist auch kein Geldesel:</p>
<p><code>bash:~# find money<br />
find: money: No such file or directory</code></p>
<p>Wichtige Befehlsfolge:</p>
<p><code>unzip, strip, touch, finger, grep, mount, fsck, more, yes, fsck, fsck, fsck, umount, sleep</code></p>
<p>Quellen:<br />
<a href="http://www.linuxfocus.org/Deutsch/July1999/article104.html">http://www.linuxfocus.org/Deutsch/July1999/article104.html</a><br />
<a href="http://www.tbi.univie.ac.at/~ronke/FUN/unix.html">http://www.tbi.univie.ac.at/~ronke/FUN/unix.html</a></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/lustige-linux-kommandos-befehle.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Linux Bash Snippet: Einträge in Logfiles zählen und summieren</title>
		<link>http://stetix.de/linux-bash-snippet-eintraege-in-logfiles-zaehlen.html</link>
		<comments>http://stetix.de/linux-bash-snippet-eintraege-in-logfiles-zaehlen.html#comments</comments>
		<pubDate>Mon, 31 Aug 2009 16:51:56 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Befehle & Snippets]]></category>
		<category><![CDATA[einzeiler]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=680</guid>
		<description><![CDATA[Heute ein kleines Sysadmin-Helferlein aus der Kategorie &#8220;Hilfreiche Befehle für Linux, Bash und Co&#8220;. Hier möchte ich in Zukunft nützliche Kommandos, Einzeiler und Snippets für die tägliche Arbeit mit Linux als Sysadmin posten. Grund-Kenntnisse in Linux über z.B. Pipes usw. sollten vorhanden sein. Viel Spaß! Oft ist es notwendig aus einem System-Logfile, Daten wie Befehle, [...]


&Auml;hnliche Artikel:<ol><li><a href='http://stetix.de/nginx-eine-echte-apache-alternative.html' rel='bookmark' title='Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.'>Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Heute ein kleines Sysadmin-Helferlein aus der Kategorie &#8220;<a href="http://stetix.de/category/linux/snippets">Hilfreiche Befehle für Linux, Bash und Co</a>&#8220;. Hier möchte ich in Zukunft nützliche Kommandos, Einzeiler und Snippets für die tägliche Arbeit mit Linux als Sysadmin posten. Grund-Kenntnisse in <a href="http://de.wikipedia.org/wiki/Linux">Linux</a> über z.B. <a href="http://de.wikipedia.org/wiki/Pipe_%28Informatik%29">Pipes</a> usw. sollten vorhanden sein. Viel Spaß!</p>
<p>Oft ist es notwendig aus einem System-<a href="http://de.wikipedia.org/wiki/Logfile">Logfile</a>, Daten wie Befehle, Dateinamen, User-Agents, Zeiten oder was auch immer zu zählen, zu summieren und zu sortieren. Möchte man zum Beispiel wissen, welcher Befehl auf einem Webserver am meissten aufgerufen wurde, reicht ein Einzeiler:</p>
<p>
<code>cat access_log  | awk '{print $6}' | sort | uniq -c | sort -nr | less<br />
</code><br />
</p>
<p>Was hier passiert, möchte ich kurz erklären:</p>
<p><span id="more-680"></span></p>
<p>
<code>cat access_log<br />
</code>Hier öffnen wir die Datei access_log und leiten den Inhalt an den Standard-Output &#8211; hier unsere Konsole &#8211; zur Ausgabe weiter.
</p>
<p>
<code>awk '{print $6}'<br />
</code>Mit <a href="http://de.wikipedia.org/wiki/Awk">Awk</a> können wir uns einfach Teile einer Ausgabe aus einem Text herausfiltern. Hier die 6. Stelle &#8211; der Befehl. Das Standard-Trennzeichen von awk ist das Leerzeichen, was aus diesem Grund nicht mit angegeben werden muss.
</p>
<p>
<code>sort<br />
</code>Diese Befehl sortiert die aktuelle Ausgabe.
</p>
<p>
<code>uniq -c<br />
</code>Hier werden gleich zwei Sachen erledigt. Es werden doppelte Einträge entfernt und gleichzeitig die Anzahl der Vorkommnisse als Prefix vor jede Zeile gesetzt.
</p>
<p>
<code>sort -nr<br />
</code>Sortiert diese Ausgabe nochmals, jetzt jedoch nach Nummern und rekursiv, so dass der Eintrag mit dem meißten Ergebnissen oben steht.
</p>
<p>
<code>less<br />
</code>Hier kann wahlweisse auch tail verwendet werden. Sollte klar sein. Less lässt uns die ersten Zeilen in normaler Geschwindigkeit lesen, in dem es die Ausgabe nach vollem Bildschirm anhält.
</p>
<p>
Die Ausgabe des ganzen Befehles sollte nun ungefähr so aussehen:
</p>
<p>
<code> 528162 "GET<br />
   8583 "POST<br />
    242 "HEAD<br />
     15 "OPTIONS<br />
      2 "PUT<br />
</code>
</p>
<p>
Wir können hiermit nun beliebig benötigte Daten zählen und uns schnell einen Überblick über die Anzahl der jeweiligen Vorkommnisse anzeigen lassen. Eine kleine Linux-Live-Statistik sozusagen.</p>


<p>&Auml;hnliche Artikel:<ol><li><a href='http://stetix.de/nginx-eine-echte-apache-alternative.html' rel='bookmark' title='Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.'>Nginx: Eine echte Apache Alternative! Vorteile, Installation und Konfiguration des Webservers unter Linux erklärt.</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/linux-bash-snippet-eintraege-in-logfiles-zaehlen.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
