<?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>zer(o_0)ne &#187; Technik</title>
	<atom:link href="http://www.zero0ne.de/category/technik/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zero0ne.de</link>
	<description>Datenreisender, Cyberpunk, Sysadmin, Console Cowboy ... lebt in der Wired</description>
	<lastBuildDate>Wed, 08 Feb 2012 14:49:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Working with MacOS X</title>
		<link>http://www.zero0ne.de/2012/02/working-with-macos-x/</link>
		<comments>http://www.zero0ne.de/2012/02/working-with-macos-x/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 14:49:24 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[arbeiten]]></category>
		<category><![CDATA[cord]]></category>
		<category><![CDATA[csshx]]></category>
		<category><![CDATA[expandrive]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[terminal]]></category>
		<category><![CDATA[textwrangler]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3294</guid>
		<description><![CDATA[Komme nun schon sehr gut mit meinen Mac Mini auf Arbeit zurecht. Nachdem ich ihn mir am vergangenen Freitag und Montag erst mal richtig eingerichtet habe. Hier nun einige Tools die gefunden habe und nutze: csshX CsshX ist ganz nett auch wenn es gegenüber cssh noch einige Nachteile hat. zum Beispiel wen man mal so [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Komme nun schon sehr gut mit meinen Mac Mini auf Arbeit zurecht. Nachdem ich ihn mir am vergangenen Freitag und Montag erst mal richtig eingerichtet habe. Hier nun einige Tools die gefunden habe und nutze:<span id="more-3294"></span></p>
<p><strong>csshX</strong></p>
<p style="text-align: justify;">CsshX ist ganz nett auch wenn es gegenüber cssh noch einige Nachteile hat. zum Beispiel wen man mal so 20-30 Sessions aufbauen will. Sonst ist es aber echt gut. Benutze es auch mit dem Mac OSX Terminal zusammen und nicht mit iTerm2. Es gibt zwar auch schon eine iTerm2 Version, die funktioniert aber nicht so gut wie der für Terminal.</p>
<p><a href="http://www.zero0ne.de/blog/wp-content/uploads/2012/02/csshX.png"><img class="aligncenter size-medium wp-image-3295" title="csshX" src="http://www.zero0ne.de/blog/wp-content/uploads/2012/02/csshX-300x187.png" alt="" width="300" height="187" /></a></p>
<p><strong>Terminal</strong></p>
<p style="text-align: justify;">Der Terminal ist eigentlich auch ganz ok. Man muss sich nur das Homebrew-Theme ein wenig anpassen und die Bild-Rauf und Bild-Runter Tasten unbelegten und schon kann man damit arbeiten. Die Tasten legt man sich dann am besten so:</p>
<p>Anfang: \033[1~<br />
Ende: \033[4~<br />
Seite nach oben: \033[5~<br />
Seite nach unten: \033[6~</p>
<p><strong>TextWrangler</strong></p>
<p style="text-align: justify;">Hab einen neuen Simplen Texteditor mit Syntax Highlighting gesucht, da Smultron auf Lion nicht so gut funktioniert und ich mir nicht die 4er Version davon kaufen wollte. Wollte dann auch ein wenig was graphischeres als Vim und hab mich nun mit Textwrangler angefreundet. Ein dunkles Theme eingestellt, die Farben ein bisschen angepasst und schon geht&#8217;s. Und um dann dieses nervige Gutter zu entfernen einfach im Terminal folgendes eingeben: &#8220;defaults write com.barebones.textwrangler Editor:Gutter -bool false&#8221;. Danach ist es weg, sollte man es doch mal wieder haben wollen, nimmt man einfach den gleichen Befehl und gibt am ende &#8220;true&#8221; ein.</p>
<p><a href="http://www.zero0ne.de/blog/wp-content/uploads/2012/02/TextWrangler.png"><img class="aligncenter size-medium wp-image-3297" title="TextWrangler" src="http://www.zero0ne.de/blog/wp-content/uploads/2012/02/TextWrangler-300x164.png" alt="" width="300" height="164" /></a></p>
<p><strong>ExpanDrive</strong></p>
<p style="text-align: justify;">Mit Expandrive kann man sich SSH-Server als Laufwerke mount&#8217;n. Aber nicht nur SSH, auch FTP und sogar Amazon S3 lässt sich so leicht einbinden. Eine entsprechend schnelle Internet/Intranet-Verbindung vorrausgesetzt kann man dann schnell Zugriff auf die Dateisysteme seiner Server nehmen und muss nicht immer über den Terminal gehen. So kann man dann zB mit TextWrangler die Configs direkt auf dem Server bearbeiten.</p>
<p><a href="http://www.zero0ne.de/blog/wp-content/uploads/2012/02/ExpanDrive.png"><img class="aligncenter size-medium wp-image-3298" title="ExpanDrive" src="http://www.zero0ne.de/blog/wp-content/uploads/2012/02/ExpanDrive-238x300.png" alt="" width="238" height="300" /></a></p>
<p><strong>CoRD</strong></p>
<p style="text-align: justify;">Wenn man mit Windows Servern abreiten muss, muss man ja meist auch das RDP-Protokoll nutzen. VNC wäre zu umständlich zu konfigurieren, also doch lieber das eingebaute von MS nutzen. Es gibt zwar auch einen Client von MS selbst, dieser bietet aber wenig Komfort. Mit CoRD sieht es da schon ganz anders aus. Hier lassen sich Favoriten speicher mit allen Einstellungen. Geht mit dem MS-Tool vllt auch, aber findet man die Einstellungen dort schwer und sind nicht so schön dargestellt. CoRD ist schlicht und doch umfangreich und komfortabel.</p>
<p><a href="http://www.zero0ne.de/blog/wp-content/uploads/2012/02/CoRD.png"><img class="aligncenter size-medium wp-image-3299" title="CoRD" src="http://www.zero0ne.de/blog/wp-content/uploads/2012/02/CoRD-300x210.png" alt="" width="300" height="210" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2012/02/working-with-macos-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KVM LVM Festplatte vergrössern</title>
		<link>http://www.zero0ne.de/2012/01/kvm-lvm-festplatte-vergrossern/</link>
		<comments>http://www.zero0ne.de/2012/01/kvm-lvm-festplatte-vergrossern/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 15:29:21 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[lvextend]]></category>
		<category><![CDATA[lvm]]></category>
		<category><![CDATA[pvcreate]]></category>
		<category><![CDATA[resize2fs]]></category>
		<category><![CDATA[vgextend]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3285</guid>
		<description><![CDATA[Heute war&#8217;s mal wieder soweit: die Festplatte einer meiner KVM Instanzen war voll. Also musste ich ran und sie vergrössern. Aufräumen ging nicht, da die Nutzdaten einfach mit der Zeit angewachsen waren. Mit Hilfe eines Freundes hab ich die ganzen Kommandos dann auch wieder in der richtigen Reinfolge auf die Reihe bekommen. Hat auch alles [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Heute war&#8217;s mal wieder soweit: die Festplatte einer meiner KVM Instanzen war voll. Also musste ich ran und sie vergrössern. Aufräumen ging nicht, da die Nutzdaten einfach mit der Zeit angewachsen waren. Mit Hilfe eines Freundes hab ich die ganzen Kommandos dann auch wieder in der richtigen Reinfolge auf die Reihe bekommen. Hat auch alles problemlos geklappt und die VM hat nun 10GB mehr platz!</p>
<p style="text-align: justify;"><span id="more-3285"></span></p>
<p style="text-align: justify;"><strong>VM shutdown</strong><br />
im Wirt dann das img-File der VM Sicherheitskopieren und dann ein neues RAW-File anlegen. Dieses so dimensionieren, wie viel zusätzlichen Platz man haben möchte:<br />
<code><br />
cp nameVM.img nameVM.img.bck<br />
qemu-img create -f raw temp.img 10G<br />
mv nameVM.img<br />
cat nameVM.img.save temp.img &gt; nameVM.img<br />
</code></p>
<p style="text-align: justify;"><strong>VM starten</strong><br />
Dann die VM wieder starten, normal sollte das problemlos gehen und das installierte Linux sollte ohne Probleme starten. Für das System hat sich an sich ja nicht viel geändert. Im laufenden System dann mit fdisk eine neue Partition anlegen. Für fdisk sollte der neue Speicher schon sichtbar sein. Es sollte also erkannt werden, das noch unpartitionierter Platz auf der Festplatte vorhanden ist. Abschließend noch mal neu starten.</p>
<p style="text-align: justify;"><strong>Volume vergrössern</strong><br />
Nach dem reboot sollte dann das zusätzlich SDA-Device zur Verfügung stehen. Dieses können wir nun dazu nutzen, das Volume von LVM zu erweitern.</p>
<p>Ein zusätzliches Physical Volume anlegen:<br />
<code><br />
ll /dev/sda*<br />
pvcreate /dev/sdaX<br />
pvdisplay<br />
</code></p>
<p>Das neue PV der Volume Group hinzufügen:<br />
<code><br />
vgextend vg_name /dev/sdaX<br />
vgdisplay<br />
</code></p>
<p>Das Logische Volume auf die volle Größe der VG erweitern:<br />
<code><br />
lvextend /dev/mapper/vg_name-lv_root /dev/sdaX<br />
lvdisplay<br />
</code></p>
<p>Zum Schluss dann noch das Dateisystem von Linux auf die Größe des LV anpassen:<br />
<code><br />
resize2fs /dev/mapper/vg_name-lv_root<br />
</code></p>
<p>Abschließend noch mal nachsehen, ob der Platz nun wirklich zur Verfügung steht und fertig!<br />
<code>df -lh</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2012/01/kvm-lvm-festplatte-vergrossern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MacBook Air Power</title>
		<link>http://www.zero0ne.de/2011/12/macbook-air-power/</link>
		<comments>http://www.zero0ne.de/2011/12/macbook-air-power/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 16:51:43 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[On the Road]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3281</guid>
		<description><![CDATA[Bin jetzt die Tag über Weihnachten bei meinen Eltern und habe nur mein MacBook Air dabei. Dachte könnte ein wenig &#8220;World of Warcraft&#8221; damit spielen. Hatte das vorher aber auch nicht grossartig getestet. Bin jetzt aber erstaunt wie gut es läuft, ich habe im Moment alles auf mittlere Details gestellt und das läuft super! Sieht echt gut [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Bin jetzt die Tag über Weihnachten bei meinen Eltern und habe nur mein MacBook Air dabei. Dachte könnte ein wenig &#8220;World of Warcraft&#8221; damit spielen. Hatte das vorher aber auch nicht grossartig getestet. Bin jetzt aber erstaunt wie gut es läuft, ich habe im Moment alles auf mittlere Details gestellt und das läuft super! Sieht echt gut aus. Das Interface noch ein wenig runterskaliert und alles ist top!</p>
<p style="text-align: justify;">Die zweite Sache, die auch eher zufällig rausgefunden habe ist, das man eine iPhone Headset auch als Headset am Mac nehmen kann. Einfach einstecken und Mac OS Lion erkennt es als externes Mikrofon und Kopfhörer. Jetzt kann man es in allen anderen Programmen genutzt werden. Skype zum Beispiel funktioniert super damit.</p>
<p style="text-align: justify;">Was ich jetzt beinahe vergessen hätte: WoW läuft bei mir von einer externen Festplatte. Das Laden dauert auch nicht viel länger als sonst. Ab und an gibt es allerdings mal ein paar kleine Aussetzer. Das liegt wohl daran, das die Festplatte schon sehr schnell in den Standby-Modus fährt. Beim nächsten Zugriff dauert es dann wieder einige Sekunden bis sie anspringt. Lässt sich aber ganz gut damit Leben und spielen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/12/macbook-air-power/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iTunes Match</title>
		<link>http://www.zero0ne.de/2011/12/itunes-match/</link>
		<comments>http://www.zero0ne.de/2011/12/itunes-match/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 16:30:46 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3271</guid>
		<description><![CDATA[So, nun gibt es iTunes Match also endlich auch in Europa, oder zu mindestens dem Großteil davon. Lange wurde ja diskutiert, ob die GEMA hier blocken würde. Auch sagte die GEMA, mit ihr hätte noch keiner gesprochen, sie wäre aber für Gespräche offen. Dann war es lange still. Und jetzt auf einmal war es soweit, ohne Ankündigung, einfach so. Der [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">So, nun gibt es iTunes Match also endlich auch in Europa, oder zu mindestens dem Großteil davon. Lange wurde ja diskutiert, ob die GEMA hier blocken würde. Auch sagte die GEMA, mit ihr hätte noch keiner gesprochen, sie wäre aber für Gespräche offen. Dann war es lange still. Und jetzt auf einmal war es soweit, ohne Ankündigung, einfach so.<span id="more-3271"></span></p>
<p style="text-align: justify;">Der ein oder andere wird sich jetzt fragen was iTunes Match ist? Es ist Apples lösung iTunes von der heimischen Festplatte in die Cloud zu transferieren. Wenn man dies so kommentarlos hört, wird man sich denken :&#8221;Der Upload wird aber lange dauern&#8230;&#8221;. Dafür hat sich Apple aber etwas einfallen lassen. Und zwar geht es erst daher und jagt die ganze Mediathek durch Genius und eine Songanalyse. Analysiert also einmal alle Songs, schickt dies dann ins Netz zu Apple und vergleicht das Ergebnis mit dem iTunes Store. Alle Lieder die so gefunden werden, werden in deinen iTunes Match Account vermerkt, brauchen also nicht mehr hochgeladen werden. Den Rest, den iTunes nicht erkennt, lädt es dann noch zusätzlich hoch. Das gute dabei ist, er vergleicht nicht mit dem lokalen iTunes Store sondern mit dem globalen Store. Die Anzahl der  Tracks ist auf 25.000 begrenzt. Die die er im Store findet, zählen nicht dazu. Im Moment erzielt iTunes eine Trefferrate von gut 75-85%. Hört man jedenfalls von den Menschen auf Twitter und Co.. Bei mir waren es 72% meiner Tracks, die er erkannte. Eine gute Rate wie ich finde, da ich doch sehr viel exotische Musik habe.</p>
<p style="text-align: justify;">Soweit so gut. Das einzige daran was oft ein wenig schief geht ist, das er nicht alle Tracks eines Albums erkennt. Jetzt könnte man sich denken &#8220;was soll&#8217;s, die Musik hast du doch so oder so&#8221;. Ja schon, aber einer der vielen Vorteile von iTunes Match ist, das die Songs die im Store gefunden werden einem als 256Kbit/s AACs bereitgestellt werden. Was klanglich doch bei vielen Songs einen sehr grossen Unterschied macht. Sehr deutlich hab ich es bei einem Album von X Japan gemerkt. Das wollt ich immer mal wieder neu rippen (bin aber nie dazu gekommen), weil beim erstmal ist da wohl was schiefgegangen. Der Rip war sehr leise und dumpf. Nach dem Import in iTunes Match klang das auf einmal sehr viel lauter und deutlicher.</p>
<p style="text-align: justify;">Und nein, durch iTunes Match werden die Songs auf der Festplatte nicht automatisch ausgetauscht. Aber man kann es machen und sollte es auch bei vielen tun. So werden auch zum Beispiel alte Dateien aus der Zeit wo iTunes noch DRM hatte bereinigt. Also man kann nun jegliche seiner Dateien aus der Cloud neu runterladen, immer und immer wieder. Jeden Kauf den man mal getätigt hatte und auch jede Datei die Hochgeladen wurde. Auch können neu gekaufte Tracks gleich auf alle Geräte verteilt werden. Dies muss aber auf den einzelnen Geräten erst explizit aktiviert werden. Auch sollte man in diesem Fall gleich darauf achten, das bei iOS Geräten deaktiviert ist, das diese auch über 3G versuchen Content zu laden.</p>
<p style="text-align: justify;">Aber man kann nicht nur runterladen und so mit seine Mediathek verlegen, man kann auch wunderbar Streamen. Man kann bei iTunes Match bis zu 10 Geräte hinzufügen die Streamen und Runterladen dürfen. So kann ich nun im Büro, bei Freunden oder bei meinen Eltern zuhause immer auf meine gesamte Mediathek zugreifen und all meine musik hören. Cover und Metadaten wie zB der Playcount werden immer mitgesynct. Man kann nicht nur über iTunes auf iTunes Match zugreifen, sondern auch über iOS. Allerdings wird dort nicht gestreamt sondern immer heruntergeladen. Macht auch Sinn, da UMTS erstens nicht flächendeckend ist und zweitens es keine wirklichen Flatrates gibt.</p>
<p style="text-align: justify;">So kann man nun auch über sein iPhone auf sämtliche Songs zugreifen. Schwierig ist allerdings die Verwaltung. Da die übliche Songverwaltung nach dem aktivieren von iTunes Match aus dem Sync-Menü von iTunes rausfällt. Will man nun mal viele Songs löschen oder viele neu aufs Gerät bringen wird es anstrengend. Neue Songs Aufs iOS-Device zu bringen ist noch relative gut gelöst. Man kann Tracks einzeln laden oder albumweise oder auch ganze Playlists. Kompliziert wird es, wenn man sie dann wieder runter haben will. Man kann wieder nur einzeln oder albumweise löschen, was nun passiert wenn man eine Playlist löscht, habe ich noch nicht rausgefunden (mich noch nicht getraut auszuprobieren). Hier könnte man bei der Verwaltung noch ausbauen und sich verbessern. Es ist benutzbar, aber verbesserungswürdig.</p>
<p style="text-align: justify;">Also was haben wir alles: Mediathek@Cloud , Neu laden jeglicher Songs, Streaming, iOS Support und das alles für 25€ im Jahr. Ja es kostet Geld, aber wenn man sich das mal ein wenig überlegt, ist das nicht viel. Also für die Leistung hätten andere bestimmt schon das Doppelte verlangt, im Monat! Wenn man allein nur mal überlegt was das an Speicher und Bandbreite bedeutet. Naja Speicher sparen sie ja schon dadurch, das sie mit den iTunes Store matchen und so nicht jeden song 5 Bazillionen mal speichern müssen. Aber Bandbreite kostet es sie enorm. Vor allen zur Anfangszeit, da viele wohl ihre gesamte Mediathek noch mal neu herunterladen werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/12/itunes-match/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Managing Nginx vHost with Puppet</title>
		<link>http://www.zero0ne.de/2011/11/managing-nginx-vhost-with-puppet/</link>
		<comments>http://www.zero0ne.de/2011/11/managing-nginx-vhost-with-puppet/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 15:30:15 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Stuff]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[vHost]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3257</guid>
		<description><![CDATA[Ich beschäftige mich nun seit einiger Zeit mit puppet und bin auch fleissig am Module bauen. Als einer der nächsten Punkte nach allen Standard-System-Diensten war nun Nginx dran. Vorraussetzung für mich war hier, dass auch vHost relativ einfach abgebildet werden können. Nach etwas Bastelei, ein wenig Google und nachdenken war es mir dann gelungen. Hier also [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ich beschäftige mich nun seit einiger Zeit mit puppet und bin auch fleissig am Module bauen. Als einer der nächsten Punkte nach allen Standard-System-Diensten war nun Nginx dran. Vorraussetzung für mich war hier, dass auch vHost relativ einfach abgebildet werden können. Nach etwas Bastelei, ein wenig Google und nachdenken war es mir dann gelungen. Hier also mein Ergebnis. Da ich größtenteils nur WordPress verwende ist meine Klasse und mein Template ein wenig daran angepasst, sollte sich aber leicht auch für andere Dinge adaptieren lassen ;)</p>
<p><span id="more-3257"></span></p>
<p style="text-align: justify;">Man definiert sich im seinem <strong>Modul</strong>, hier &#8220;nginx&#8221;, eine neue <strong>Klasse</strong>. In dieser legt man nun ein <strong>Define</strong> an. Also quasi eine abstrakte Kasse oder Funktion. Diese belegt man schon mit allen Werten vor, die später jede einzelne vHost-Datei haben soll. Ich benutze hier <strong>$title</strong> als Übergabe-Variable. <strong>siteName</strong> ist der vHostname innerhalb des Templates.</p>
<p><code><br />
class nginx::wordpress{<br />
define site {<br />
$siteName = $title</p>
<p>file { "/etc/nginx/sites/$title.conf":<br />
ensure => present,<br />
owner => "root",<br />
group => "root",<br />
mode => 0644,<br />
content => template("nginx/wordpress.erb"),<br />
}<br />
}<br />
</code></p>
<p style="text-align: justify;">Nun noch ein <strong>Template</strong> erstellen. In diesem wird der eigentliche vHost definiert. Mit Extras wie Umleitung auf WWW und Sprechenden-URLs. <strong>siteName</strong> wird hier jeweils durch den von <strong>$title</strong> übergebenen Wert ersetzt.</p>
<p><code><br />
server {<br />
        listen       80;</p>
<p>        server_name  <%= siteName %><br />
                     www.<%= siteName %>;</p>
<p>        access_log  /var/log/nginx/access.<%= siteName %>.log  main;<br />
        error_log  /var/log/nginx/error.<%= siteName %>.log warn;</p>
<p>        root   /usr/share/nginx/sites/<%= siteName %>;<br />
        index  index.html index.php;</p>
<p>        try_files $uri $uri/ /blog/index.php?q=$uri&$args;</p>
<p>        if ($host != 'www.<%= siteName %>' ) {<br />
            rewrite  ^/(.*)$  http://www.<%= siteName %>/$1  permanent;<br />
        }</p>
<p> location ~ \.php$ {<br />
            fastcgi_pass   127.0.0.1:9000;<br />
            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/sites/<%= siteName %>$fastcgi_script_name;<br />
            include        fastcgi_params;<br />
        }<br />
}<br />
</code></p>
<p style="text-align: justify;">Und jetzt kann man z.B. in einer Konfigurationsklasse von Nginx einfach das Define aufrufen, ihm einen Hostnamen übergeben und da durch erhält man einen vHost. Hier muss dann vorab nur noch die oben erstellte klasse inkludiert werden.</p>
<p><code><br />
nginx::wordpress::site {"zero0ne.de":}<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/11/managing-nginx-vhost-with-puppet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Datenbanken kopieren</title>
		<link>http://www.zero0ne.de/2011/08/mysql-datenbanken-kopieren/</link>
		<comments>http://www.zero0ne.de/2011/08/mysql-datenbanken-kopieren/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 16:00:04 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Stuff]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqldump]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3240</guid>
		<description><![CDATA[Um eine Datenbank zu kopieren kann man einfacher weise den Befehl „mysqldump“ auf dem lokalen oder remote Datenbankserver verwenden. Dazu loggt man sich z.B. auf dem lokalen Replikat ein. Nun gibt man den Befehl mit folgenden Parametern an. Einige davon sind Optional, wie zum Beispiel „&#8211;ignore-table“. mysqldump -p -q &#8211;skip-extended-insert &#8211;ignore-table=DB.TB -B DB -r DB.sql [...]]]></description>
			<content:encoded><![CDATA[<p align="JUSTIFY">Um eine Datenbank zu kopieren kann man einfacher weise den Befehl „<strong>mysqldump</strong>“ auf dem lokalen oder remote Datenbankserver verwenden. Dazu loggt man sich z.B. auf dem lokalen Replikat ein. Nun gibt man den Befehl mit folgenden Parametern an. Einige davon sind Optional, wie zum Beispiel „<strong>&#8211;ignore-table</strong>“.<span id="more-3240"></span></p>
<table cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td valign="TOP"><em>mysqldump -p -q &#8211;skip-extended-insert &#8211;ignore-table=DB.TB -B DB -r DB.sql</em></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<table cellspacing="0" cellpadding="5">
<tbody>
<tr valign="TOP">
<td bgcolor="#e6e6e6" height="27"><strong>Parameter</strong></td>
<td bgcolor="#e6e6e6"><strong>Erklärung</strong></td>
</tr>
<tr valign="TOP">
<td width="1344">
<p align="JUSTIFY">-p</p>
</td>
<td width="4823">
<p align="JUSTIFY">Damit wird nach absetzten des Befehls das MySQL-Passwort abgefragt. Man kann das Passwort auch direkt daran schreiben. Zum Beispiel „<strong>-peinPass0wrd</strong>“</p>
</td>
</tr>
<tr valign="TOP">
<td width="1344">
<p align="JUSTIFY">-q</p>
</td>
<td width="4823">
<p align="JUSTIFY">Dieser Parameter dient dem Schnellen Zeilenweisen schreiben der SQL-Datei. Normalerweise werden Zeilen erst immer gepuffert, so jedoch direkt geschrieben. Dies erhöht vor allen bei großen Tabellen die Geschwindigkeit.</p>
</td>
</tr>
<tr valign="TOP">
<td width="1344">
<p align="JUSTIFY">&#8211;skip-extended-insert</p>
</td>
<td width="4823">
<p align="JUSTIFY">Hier mit erzielt man pro Insert eine Zeile. Normalerweise werden Multiple-Insert gemacht, was zu einer Verkleinerung der Datei führt.</p>
</td>
</tr>
<tr valign="TOP">
<td width="1344">
<p align="JUSTIFY">&#8211;ignore-table</p>
</td>
<td width="4823">
<p align="JUSTIFY">Es können auch Tabellen vom Export ausgeschlossen werden. Diese müssen jedoch immer mit Datenbankname davor angegeben werden. Also z.B.: „<strong>&#8211;ignore-table=dbOnline.tbLog</strong>“</p>
</td>
</tr>
<tr valign="TOP">
<td width="1344">
<p align="JUSTIFY">-B</p>
</td>
<td width="4823">
<p align="JUSTIFY">Hiermit wird die Datenbank angegeben welche exportiert werden soll.</p>
</td>
</tr>
<tr valign="TOP">
<td width="1344">
<p align="JUSTIFY">-r</p>
</td>
<td width="4823">
<p align="JUSTIFY">Mit „-r“ lässt sich eine Ausgabedatei definieren, in welche der gesamte Output geschrieben werden soll. Beispielweise „<strong>-r TestDB.sql</strong>“</p>
</td>
</tr>
</tbody>
</table>
<p align="JUSTIFY">Die Ausführung des Befehls kann je nach Größe der Datenbank von einigen Sekunden bei zu mehreren Minuten Dauern. Bei sehr großen Datenbanken auch Stunden. Ist der Vorgang jedoch abgeschlossen, findet man im aktuellen Verzeichnis den Dump. Diesen kann man nun auf den Server kopieren, wo die Datenbank läuft, in welche man den Export importieren möchte. Dies kann man per SCP oder per SFTP machen, wie einem beliebt.</p>
<p align="JUSTIFY">Hat man nun also die Datei kopiert, wechselt man auf die Konsole des Zielservers. Dort geht man dann in das Verzeichnis, in welchem die Datei liegt. Hier nun folgendes Kommando absetzen:</p>
<table cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td><em>mysql -p &lt; DB.sql</em></td>
</tr>
</tbody>
</table>
<p align="JUSTIFY">Hiermit wird die Datenbank aus der Datei in den MySQL-Server importiert. Zu beachten sei, das Datenbanken gleichen Namens so überschrieben werden. Ist dies erfolgreich abgeschlossen kann man die SQL-Datei löschen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/08/mysql-datenbanken-kopieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Datenbankreplikation mit MySQL</title>
		<link>http://www.zero0ne.de/2011/08/datenbankreplikation-mit-mysql/</link>
		<comments>http://www.zero0ne.de/2011/08/datenbankreplikation-mit-mysql/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 10:30:36 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Stuff]]></category>
		<category><![CDATA[master]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqld]]></category>
		<category><![CDATA[replication]]></category>
		<category><![CDATA[replikation]]></category>
		<category><![CDATA[slave]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3226</guid>
		<description><![CDATA[Bei einer Replikation, werden alle Queries eines sogn. „Master“ an weitere MySQL-Server übertragen. Dabei müssen aber die gleichen Datenbestände zu Grunde liegen. Es gibt verschiedene Strukturen. Hier werden nur die 2 wichtigsten besprochen. Das wären „Master – Slave“ und „Master – Master“. Einfache Replikation: Master – Slave Für eine asynchrone Replikation werden mindestens 2 MySQL-Server [...]]]></description>
			<content:encoded><![CDATA[<p align="JUSTIFY">Bei einer Replikation, werden alle Queries eines sogn. „<strong>Master</strong>“ an weitere MySQL-Server übertragen. Dabei müssen aber die gleichen Datenbestände zu Grunde liegen. Es gibt verschiedene Strukturen. Hier werden nur die 2 wichtigsten besprochen. Das wären „<strong>Master – Slave</strong>“ und „<strong>Master – Master</strong>“.<span id="more-3226"></span></p>
<h3 align="JUSTIFY">Einfache Replikation: Master – Slave</h3>
<p align="JUSTIFY">Für eine asynchrone Replikation werden mindestens 2 MySQL-Server benötigt, von denen einer als Master und mindestens einer als Slave agiert. Bei dieser Art von Replikation schreibt der Master die Updates (alle Statements, die Datensätze verändern) in eine Binärlog-Datei. Diese dient als Datenspeicher, von welchem aus die Informationen über Datenänderungen an die Slave-Server gesendet werden.</p>
<p align="JUSTIFY">Sobald sich ein Slave mit dem Master verbindet, übermittelt dieser die Position der letzten, erfolgreich empfangenen Änderungen, und empfängt daraufhin vom Master alle Updates seit der übermittelten Position. Nachdem der Slave die Änderungen übernommen hat, schaltet er so zu sagen in den Leerlauf und wartet auf die Übermittlung weiterer Änderungen vom Master.</p>
<h3>Konfiguration eines Master</h3>
<p align="JUSTIFY">Für den später einzurichtenden Slave muss man auf dem Master einen Account anlegen. Dies erledigt man mit einen GRANT-Befehl, welcher allgemein dazu da ist Benutzer anzulegen. „<strong>GRANT SUPER,REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO ReplikationsUser@slavehost IDENTIFIED BY &#8216;PWD&#8217; ; Flush Privileges;</strong>“. Wobei hier dann „<strong>@slavehost</strong>“ die IP oder der Hostname des Slave ist. Man sollte dann noch in der „<strong>my.cnf</strong>“ nachsehen ob eine „<strong>server-id</strong>“ vergeben ist. Ohne diese geht es nicht. Jeder Server, der an einer Replikation beteiligt ist, braucht eine eindeutige „<strong>server-id</strong>“. Dabei sind nur Zahlen erlaubt. Man sollte dann auch noch einen Verbindungstest durchführen, indem man sich vom Slave aus auf den Master verbindet. „<strong>mysql -h masterhost -u ReplikationsUser -p</strong>“. Sollte diese Verbindung nicht aufgebaut werden können, sollte man beim Master kontrollieren ob in der Konfig evtl. „<strong>bind-address = 127.0.0.1</strong>“ steht oder ob das Passwort richtig gesetzt ist. Im folgenden Schritt erstellt man dann eine Kopie aller zu replizierenden Daten. Im Regelfall ist das meist alles. Dafür sperrt man den kompletten Server mit einer Schreib-Sperre.</p>
<p align="JUSTIFY">„<strong>FLUSH TABLES WITH READLOCK ;</strong>“. Die Konsole in der man dies Kommando eingegeben hat muss für die Dauer der folgenden Vorgänge geöffnet bleiben, da sonst der Readlock erlischt. Um dem Slave die genaue Position und den Namen der Binärlogdatei mitzuteilen, führt man noch folgendes Kommando aus: „<strong>SHOW MASTER STATUS;</strong>“. Die Ausgabe sollte dabei dieser ähneln:</p>
<table width="100%" cellspacing="0" cellpadding="5">
<colgroup>
<col width="64*" />
<col width="64*" />
<col width="64*" />
<col width="64*" /> </colgroup>
<tbody>
<tr valign="TOP">
<td bgcolor="#c0c0c0" width="25%"><strong>File</strong></td>
<td bgcolor="#c0c0c0" width="25%"><strong>Position</strong></td>
<td bgcolor="#c0c0c0" width="25%"><strong>Binlog_Do_DB</strong></td>
<td bgcolor="#c0c0c0" width="25%"><strong>Binlog_Ignore_DB</strong></td>
</tr>
<tr valign="TOP">
<td width="25%">mysqld-bin.000023</td>
<td width="25%">50958306</td>
<td width="25%"></td>
<td width="25%"></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p align="JUSTIFY">[ Mit den letzten beiden Feldern kann man in der „<strong>my.cnf</strong>“ explizit festlegen, welche einzelnen Datenbanken repliziert werden sollen und welche nicht. Dieses sollte man aber im Regelfall nie auf dem Master festlegen. Sondern eher auf dem Slave filtern. Dort kann man auch wieder in der „<strong>my.cnf</strong>“ festlegen was alles repliziert werden soll und was nicht. ]</p>
<p align="JUSTIFY">Man notiert sich nun den Namen des „<strong>binlog</strong>“ und die Position, danach kann man mit dem Kopieren der Daten beginnen. Hat man nur MyISAM-Datenbanken macht man dies am besten auf Dateiebene. „<strong>tar -cvz -f /backup/mysql/snapshot_DATUM.tar.gz /var/lib/mysql</strong>“. Um die DB nicht all zu lange zu sperren kann man auch erst nur die Daten kopieren und dann später komprimieren. Ist man dann fertig, kann man sich aus der MySQL-Konsole ausloggen und somit die Sperre wieder aufheben.</p>
<h3>Konfiguration eines Slave</h3>
<p align="JUSTIFY">Die MySQL-Version auf dem Slave sollte mindestens der des Masters entsprechen. Sie darf neuer sein, aber nicht älter. Auf dem Slave stoppt man dann erstmal den laufenden MySQL-Server und editiert die „my.cnf“. Dort setzt man auch wieder die Variablen für die Server-ID. Zu beachten ist hier nur, dass die Server-ID sich von der des Masters und aller bestehenden Slaves unterscheiden muss. Will man, das dieser Slave noch Master für weitere untergeordnete Slaves ist, muss man auch darauf achten das hier das binlog aktiviert ist. Hat man dann die Daten, welche man auf dem Master kopiert hat übertragen, kopiert man diese auf dem Slave nach „<strong>/var/lib/mysql</strong>“. Zu beachten sei, das man sich nicht die Datenbank „<strong>mysql</strong>“ überschreibt. Diese sollte man auch in der „my.cnf“ von der Replikation ausnehmen. Dies macht man mit den Optionen:</p>
<p><code>replicate-ignore-db= mysql<br />
replicate-wild-ignore-table = mysql.%</code></p>
<p align="JUSTIFY">Hat man dann die Daten kopiert, kontrolliert man noch mal, ob alle Dateien unterhalb von „<strong>/var/lib/mysql</strong>“ auch dem Benutzer und der Gruppe „<strong>mysql</strong>“ gehören. Jetzt kann man den MySQL-Server wieder starten. Um nun die Replikation zu aktiveren müssen wir dem Slave noch mitteilen, wer der Master ist und an welcher Stelle im binlog er anfangen soll zu lesen. Dies macht man mit dem „<strong>CHANGE MASTER</strong>“ Kommando:</p>
<table cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td><code>CHANGE MASTER TO<br />
MASTER_HOST = 'master_host',<br />
MASTER_USER = 'ReplikationsUser',<br />
MASTER_PASSWORD = 'PWD',<br />
MASTER_LOG_FILE = 'log file name',<br />
MASTER_LOG_POS = log_offset;</code></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p align="JUSTIFY">Wurde das Statement erfolgreich ausgeführt, wurden alle Änderungen übernommen und der Slave ist soweit bereit die Replikation zu starten. Gestartet wird dann einfach mit „<strong>SLAVE START;</strong>“ (gestoppt mit „<strong>SLAVE STOP;</strong>“). Nach dem Start sollte man mit „<strong>SHOW SLAVE STATUS;</strong>“ den Status der Replikation überprüfen. Steht „<strong>Slave_IO_Running</strong>“ auf „<strong>Yes</strong>“ läuft die Replikation. Dann ist immer noch der Wert „<strong>Seconds_Behind_Master</strong>“ interessant. Er gibt an, wie viel der Slave dem Master hinterher hängt. Am Anfang steht hier eine mehr oder weniger große Zahl, in endlicher Zeit sollte hier dann aber nur noch „0“ stehen. Steht dort „<strong>NULL</strong>“ gibt es ein Problem mit der Replikation, dann ist aber auch „<strong>Slave_IO_Running</strong>“ meisten auf „<strong>No</strong>“. Unter „<strong>Last_Error</strong>“ kann man dann noch nachlesen, wieso es zu einer Unterbrechung kam.</p>
<p align="JUSTIFY"><a href="http://www.zero0ne.de/blog/wp-content/uploads/2011/08/master-slave.png"><img class="aligncenter size-medium wp-image-3228" title="master-slave" src="http://www.zero0ne.de/blog/wp-content/uploads/2011/08/master-slave-300x120.png" alt="" width="300" height="120" /></a></p>
<h3></h3>
<h2>Reparieren der Replikation</h2>
<p align="JUSTIFY">Sollte die Replikation einmal unterbrochen werden, sollte man mit „<strong>slave stop</strong>“ erst mal den Replikations Prozess beenden. Mit „<strong>slave show status\G</strong>“ kann man sich dann den Status ausgeben lassen. Hierbei sollte man jetzt auf die Zeile „<strong>Last_Error</strong>:“ achten. Die dort ausgegebene Fehlermeldung sollte man nun genauer untersuchen und versuchen festzustellen warum es zu diesen Fehler kam. Hat man diesen dann beseitigt kann man mit „<strong>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;</strong>“ MySQL anweisen, dieses Query zu überspringen. Anschließend kann man mit „<strong>slave start</strong>“ die Replikation wieder starten. Wenn alles gut läuft und dies der einzigste Fehler war, müsste diese nun auch wieder laufen.</p>
<h2>Master – Master</h2>
<p align="JUSTIFY">Bei einer Master-Master-Replikation, gibt es, wie der Name schon sagt, 2 Master. Beide sind sich gegenseitig aber noch Slave. Sodas Änderungen auf einen Master direkt auch auf dem 2. Verfügbar sind und umgekehrt. Bei Master Slave kommen Update immer nur von einer Seite, vom Master. Hier kann jeder der beiden Änderungen machen. Dies führt natürlich auch zu Probleme. Was ist, wenn beide den gleichen Datensatz Ändern wollen? Deswegen muss man hier sehr auf die Daten-Integrität achten und am besten immer nur einen der Beiden Master schreiben lassen.</p>
<h2>Aufbau einer Master-Master-Replikation</h2>
<p align="JUSTIFY">Es muss hier auch wieder auf beiden Server von den Gleichen Daten ausgegangen werden. Auf beiden das „<strong>binlog</strong>“ aktiviert sein. Dann kann man auf beiden jeweils einen Slave-Prozess einrichten, welcher den anderen Als Master nimmt.</p>
<p align="JUSTIFY"><a href="http://www.zero0ne.de/blog/wp-content/uploads/2011/08/master-master.png"><img class="aligncenter size-medium wp-image-3237" title="master-master" src="http://www.zero0ne.de/blog/wp-content/uploads/2011/08/master-master-300x120.png" alt="" width="300" height="120" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/08/datenbankreplikation-mit-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQLd &#8211; Datenbankserver</title>
		<link>http://www.zero0ne.de/2011/08/mysqld-datenbankserver/</link>
		<comments>http://www.zero0ne.de/2011/08/mysqld-datenbankserver/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 10:30:03 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Stuff]]></category>
		<category><![CDATA[datenbank]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqld]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3212</guid>
		<description><![CDATA[Allgemeines Der Aufbau von MySQL ist recht Simple. Die einzige Konfigurationsdatei liegt in „/etc/mysql/“ und heißt „my.cnf“. Hier lassen sich nun die verschiedenen Laufzeitoptionen von MySQL einstellen. Zum Beispiel auf welchen Port und welchen Interface es laufen soll. Aber auch wieviel Puffer und Speicher MySQL verwenden soll. Die eigentlichen Daten von MySQL werden dann in [...]]]></description>
			<content:encoded><![CDATA[<h2>Allgemeines</h2>
<p align="JUSTIFY">Der Aufbau von MySQL ist recht Simple. Die einzige Konfigurationsdatei liegt in „<strong>/etc/mysql/</strong>“ und heißt „<strong>my.cnf</strong>“. Hier lassen sich nun die verschiedenen Laufzeitoptionen von MySQL einstellen. Zum Beispiel auf welchen Port und welchen Interface es laufen soll. Aber auch wieviel Puffer und Speicher MySQL verwenden soll. Die eigentlichen Daten von MySQL werden dann in „<strong>/var/lib/mysql</strong>“ gespeichert. Das Rechte-Management von MySQL wird über eine MySQL-Datenbank mit dem Namen „<strong>mysql</strong>“ gesteuert.<img title="Weiterlesen..." src="http://twitter.zero0ne.de/blog/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /><span id="more-3212"></span></p>
<h2>„my.cnf“</h2>
<p align="JUSTIFY">Die „<strong>my.cnf</strong>“ ist in mehrere Teil gegliedert. Jeder Teilbereich wird durch den Namen eckige Klammer abgegrenzt. Der wirklich wichtige Bereich ist „<strong>[mysqld]</strong>“. Dort stehen die Optionen welche für den MySQL-Prozess wichtig sind. Hier man eine gute Grundkonfiguration:</p>
<h2>Server Basics</h2>
<p align="JUSTIFY">Am Anfang sollte man immer Grundlegende Dinge festlegen. Wie z.B. den Buntzer, unter welchen MySQL laufen soll. Soll es an eine IP gebunden werden? Welcher Port verwendet werden soll. Wichtig für die Replikation ist dann auch immer eine eindeutige „<strong>server-id</strong>“. Oft ist es auch sinnvoll „<strong>Selects</strong>“ eine höhere Priorität zu geben. „<strong>skip-locking</strong>“ sollte auf jeden Fall aktiviert sein, da sonst die Performance massiv einbrechen kann. Ohne diese Option werden recht rechenintensive Methoden verwendet, Tabellen von der Festplatte zu lesen.</p>
<p>&nbsp;</p>
<table cellspacing="0" cellpadding="5">
<tbody>
<tr>
<th>Grundconfiguration</th>
</tr>
<tr>
<td><code>user = mysql<br />
bind-address = 10.10.10.10<br />
port = 3306<br />
server-id = 40<br />
low_priority_updates = 1<br />
skip-locking</code></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2>Server Verzeichnisse und Logdateien</h2>
<p align="JUSTIFY">Im weiteren Verlauf der Konfig werde meist noch mehrere Verzeichnisse und Log-Dateien definiert. Diese sind selbsterklärend. Einzig auf das „<strong>bin-log</strong>“ sollte man genau achten, da darüber die Replikation abläuft. „<strong>datadir</strong>“ ist, wo die Tabellen auf der Festplatte abgelegt werden.</p>
<p>&nbsp;</p>
<table cellspacing="0" cellpadding="5">
<tbody>
<tr>
<th>weitere Grundkonifguration</th>
</tr>
<tr>
<td><code>socket = /var/run/mysqld/mysqld.sockpid-file = /var/run/mysqld/mysqld.pid<br />
log-bin = /var/log/mysql/master-blog<br />
log-error = /var/log/mysql/mysqld.err<br />
log-queries-not-using-indexes = /var/log/mysql/q-n-u-i.log<br />
log-slow-queries = /var/log/mysql/slow-q.log<br />
basedir = /usr<br />
datadir = /var/lib/mysql<br />
tmpdir = /tmp</code></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2>Puffer und Caches</h2>
<p align="JUSTIFY">MySQL hat verschiedene Cache-Funktionen und Puffer. Manche sind nur auf Verbindungsebene aktive, wieder andere serverweit. Aber es geht auch, das man auf seiner Verbindung den Cache/Puffer neu definiert und so den Serverweiten überschreibt, für seine Verbindung. Cache und Puffer kann man nie pauschal festlegen. Sie müssen auf die jeweiligen Anwendungen angepasst werden, welche mit der Datenbank arbeiten sollen.</p>
<p>&nbsp;</p>
<table cellspacing="0" cellpadding="5">
<tbody>
<tr>
<th>Detailkonfiguration</th>
</tr>
<tr>
<td><code>max_connections = 350open_files_limit = 3600<br />
long_query_time = 5<br />
thread_cache_size = 200<br />
query_cache_size = 96M<br />
query_cache_limit = 5M<br />
table_cache = 4200<br />
max_heap_table_size = 64M<br />
tmp_table_size = 32M<br />
read_buffer_size = 512k<br />
key_buffer_size = 4500M<br />
read_rnd_buffer_size = 8M<br />
join_buffer_size = 1M<br />
sort_buffer_size = 1M</code></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Bei „<strong>max_connections</strong>“ handelt es sich um die Anzahl der offenen Verbindungen, oder eingeloggten Benutzer wenn man so will.</p>
<p>„<strong>open_files_limit</strong>“ gibt an, wieviele Dateien der MySQL-Prozess gleichzeitig öffnen darf.</p>
<p>„<strong>long_query_time</strong>“ wird in Sekunden angegeben. Es definiert ab welcher laufzeit ein Query als „slow query“ eingestuft wird.</p>
<p>„<strong>thread_cache_size</strong>“ gibt die Anzahl der Threads an, welche zurückgehalten werden.</p>
<p>„<strong>query_cache_szie</strong>“ legt die Größe des Speichers für SELECT-Querys fest.</p>
<p>„<strong>query_cache_limit</strong>“ besagt, das Querys, welche größer als das Limit sind, nicht gecached werden sollen.</p>
<p>„<strong>table_cache</strong>“ gibt die Anzahl an Tabellen vor, welche im Speicher gehalten werden sollen.</p>
<p>„<strong>max_heap_table_size</strong>“ gibt an, wie groß eine Tabellen sein darf, welche temporär im RAM erzeugt wird.</p>
<p>„<strong>tmp_table_size</strong>“ legt die gesamt Größe des Tabellen-Cache fest.</p>
<p>„<strong>read_buffer_size</strong>“ ist für das sequenzielle auslesen von Tabellen zuständig. Werte größer als 512 KB bringen kaum mehr Performance.</p>
<p>„<strong>key_buffer_size</strong>“ legt die Größe des Speichers für die MyISAM Key-Files der Tabellen fest. Man sollte möglichst versuchen viel davon im Speicher zu haben.</p>
<p>„<strong>read_rnd_buffer_size</strong>“ ist für nicht-sequenzielle und parallele Zugriffe auf Tabellen zuständig.</p>
<p>„<strong>join_buffer_size</strong>“, wie der Name schon da, um bei „joins“ zwischen zu speichern.</p>
<p>„<strong>sort_buffer_size</strong>“, beim Sortieren ist dieser Puffer wichtig.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/08/mysqld-datenbankserver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fehlercodes und Fehlermeldungen von Mailservern</title>
		<link>http://www.zero0ne.de/2011/07/fehlercodes-und-fehlermeldungen-von-mailservern/</link>
		<comments>http://www.zero0ne.de/2011/07/fehlercodes-und-fehlermeldungen-von-mailservern/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 14:08:01 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Stuff]]></category>
		<category><![CDATA[fehlermeldung]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3198</guid>
		<description><![CDATA[Ein Mailserver antwortet auf alle Anforderungen, die er von E-Mail Clients (also etwa von Outlook, Thunderbird oder Apple Mail) erhält, mit einem Antwortcode. Dieser Code besteht aus drei Ziffern. Die erste Ziffer teilt mit, ob der Server die Anforderung akzeptiert hat und ob er sie auch ausführen konnte. Es gibt fünf mögliche Werte: Mailserver hat [...]]]></description>
			<content:encoded><![CDATA[<p align="JUSTIFY">Ein Mailserver antwortet auf alle Anforderungen, die er von E-Mail Clients (also etwa von Outlook, Thunderbird oder Apple Mail) erhält, mit einem Antwortcode. Dieser Code besteht aus drei Ziffern. Die erste Ziffer teilt mit, ob der Server die Anforderung akzeptiert hat und ob er sie auch ausführen konnte. Es gibt fünf mögliche Werte:<span id="more-3198"></span></p>
<ol>
<li>
<p align="JUSTIFY">Mailserver hat die Anforderung akzeptiert, ist aber selbst noch nicht tätig geworden. Eine Bestätigungsmeldung ist erforderlich.</p>
</li>
<li>
<p align="JUSTIFY">Mailserver hat die Anforderung erfolgreich ohne Fehler ausgeführt.</p>
</li>
<li>
<p align="JUSTIFY">Mailserver hat die Anforderung verstanden, benötigt aber zur Verarbeitung weitere Informationen.</p>
</li>
<li>
<p align="JUSTIFY">Mailserver hat einen temporären Fehler festgestellt. Wenn die Anforderung ohne jegliche Änderung wiederholt wird, kann die Verarbeitung möglicherweise abgeschlossen werden. Versuchen Sie es erneut, vielleicht funktioniert&#8217;s!</p>
</li>
<li>
<p align="JUSTIFY">Mailserver hat einen fatalen Fehler festgestellt. Ihre Anforderung kann nicht verarbeitet werden.</p>
</li>
</ol>
<p align="JUSTIFY">Die zweite Zahl geht ins Detail. Es gibt sechs mögliche Werte:</p>
<ol start="0">
<li>
<p align="JUSTIFY">Syntax Fehler</p>
</li>
<li>
<p align="JUSTIFY">Antwortinformation</p>
</li>
<li>
<p align="JUSTIFY">Diese Zahl bezieht sich auf den Status der Verbindung</p>
</li>
<li>
<p align="JUSTIFY">Wird nicht benutzt</p>
</li>
<li>
<p align="JUSTIFY">Wird nicht benutzt</p>
</li>
<li>
<p align="JUSTIFY">Diese Zahl bezieht sich auf den Status des Mailservers</p>
</li>
</ol>
<p align="JUSTIFY">Die dritte Zahl geht noch stärker ins Detail als die zweite. Sie zeigt in feineren Stufen den Status des Mailtransfers. Die Kombination dieser drei Zahlen ergibt die detaillierte Liste der ESMTP Server Antwortcodes, wie sie im <a href="http://www.atvirtual.net/email/rfc821.txt">RFC 821</a> und später festgelegt wurden.</p>
<h3>Gängige Fehlercodes bei Mailservern</h3>
<table width="100%" cellspacing="0" cellpadding="3">
<colgroup>
<col width="33*" />
<col width="223*" /></colgroup>
<tbody>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>Fehlercode</strong></p>
</td>
<td width="87%">
<p align="LEFT"><strong>SMTP/ESMTP Fehlermeldungsbeschreibung</strong></p>
</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>211</strong></p>
</td>
<td width="87%">System Status, oder Antwort System Hilfe</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>214</strong></p>
</td>
<td width="87%">Hilfe Nachricht<br />
(Information über die Verwendung des Empfängers oder die Bedeutung eines bestimmten Nicht-Standard Befehls. Diese Antwort ist nur für den menschlichen Benutzer von Vorteil)</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>220</strong></p>
</td>
<td width="87%">Dienst bereit</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>221</strong></p>
</td>
<td width="87%">Dienst schließt Übertragungskanal</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>250</strong></p>
</td>
<td width="87%">Angeforderte Mail Aktion ok, abgeschlossen</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>251</strong></p>
</td>
<td width="87%">Benutzer nicht lokal, werde weiterleiten an [Weiterleitungspfad]</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>354</strong></p>
</td>
<td width="87%">Beginne Mail Eingabe; beende mit [CRLF].[CRLF]</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>421</strong></p>
</td>
<td width="87%">Dienst nicht bereit, schließe Übertragungskanal<br />
(Das kann eine Antwort auf jede beliebige Anforderung sein, wenn der Dienst weiß, dass er schließen muss)</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>450</strong></p>
</td>
<td width="87%">Angeforderte Mail Aktion nicht ausgeführt: Mailbox nicht erreichbar<br />
(z.B., Mailbox aktiv)</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>451</strong></p>
</td>
<td width="87%">Angeforderte Aktion abgebrochen: Lokaler Fehler in der Verarbeitung</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>452</strong></p>
</td>
<td width="87%">Angeforderte Aktion nicht ausgeführt: Nicht genügend Systemspeicher</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>500</strong></p>
</td>
<td width="87%">Syntax Fehler, Befehl nicht erkannt<br />
(Das schließt auch den Fehler einer zu langen Befehlszeile ein)</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>501</strong></p>
</td>
<td width="87%">Syntax Fehler bei Parameter oder Argumenten</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>502</strong></p>
</td>
<td width="87%">Befehl nicht implementiert</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>503</strong></p>
</td>
<td width="87%">Unbrauchbare Befehlsabfolge</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>504</strong></p>
</td>
<td width="87%">Befehlsparameter nicht implementiert</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>550</strong></p>
</td>
<td width="87%">Angeforderte Aktion nicht ausgeführt: Mailbox unerreichbar<br />
(z.B.: Mailbox nicht gefunden, kein Zugang)</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>551</strong></p>
</td>
<td width="87%">Benutzer nicht lokal; bitte [Weiterleitungspfad] versuchen</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>552</strong></p>
</td>
<td width="87%">Angeforderte Mail Aktion abgebrochen: Überschreitung der zugewiesenen Speichergröße</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>553</strong></p>
</td>
<td width="87%">Angeforderte Aktion nicht ausgeführt: Name der Mailbox nicht erlaubt<br />
(z.B.: Mailbox Syntax inkorrekt)</td>
</tr>
<tr valign="TOP">
<td width="13%">
<p align="CENTER"><strong>554</strong></p>
</td>
<td width="87%">Übertragung misslungen</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/07/fehlercodes-und-fehlermeldungen-von-mailservern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SpamAssassin</title>
		<link>http://www.zero0ne.de/2011/07/spamassassin/</link>
		<comments>http://www.zero0ne.de/2011/07/spamassassin/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 12:40:00 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Stuff]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[scanner]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[spamassasin]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3193</guid>
		<description><![CDATA[SpamAssassin ist ein Filterprogramm zu Spam-Bekämpfung. Dabei Scannt es nicht nur die Header, wie z.B. Postfix, sondern die gesamte Mail. Es setzt dabei multiple Wörterbücher ein und ist selbst lernend und führt eigenständig Updates dieser Wörterbücher durch. Es wird der gesamte Body der Mail gescannt und gewertet. D.h. der Inhalt wird maschinell ausgewertet. Dies kann [...]]]></description>
			<content:encoded><![CDATA[<h3 align="JUSTIFY"><span class="Apple-style-span" style="font-size: 13px; font-weight: normal;">SpamAssassin ist ein Filterprogramm zu Spam-Bekämpfung. Dabei Scannt es nicht nur die Header, wie z.B. Postfix, sondern die gesamte Mail. Es setzt dabei multiple Wörterbücher ein und ist selbst lernend und führt eigenständig Updates dieser Wörterbücher durch. Es wird der gesamte Body der Mail gescannt und gewertet. D.h. der Inhalt wird maschinell ausgewertet. Dies kann in einigen fällen Datenschutzrechtlich bedenklich sein. Beim Scannen wird dann auf Wortzusammenhänge und Anzahl von Links geachtet. Aber auch es werden auch noch wesentlich komplexere Algorithmen eingesetzt zur Vermeidung von sogenannten „false-positives“. Also fälschlicherweise als Spam erkannte Mails. Die Konfiguration von Spamassassin findet sich unter „/etc/spamassassin/“. Hier kann festgelegt werden, welcher Anti-Spamtechniken sich Spamassassin bedient. Standardmäßig ist dies <em>bayes</em>. In unseren Fall wird dann aber noch <em>pyzor</em> und <em>dcc</em> verwendet.</span></h3>
<p align="JUSTIFY">
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/07/spamassassin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CalmAV</title>
		<link>http://www.zero0ne.de/2011/07/calmav/</link>
		<comments>http://www.zero0ne.de/2011/07/calmav/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 12:38:32 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Stuff]]></category>
		<category><![CDATA[clamav]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[scanner]]></category>
		<category><![CDATA[viren]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3190</guid>
		<description><![CDATA[ClamAV ClamAV ist ein freier OpenSource Virenscanner. Er ist der de-facto Standard in Linux-Mailsystemen. Er wird auch über AMaViS angesteuert. Sollte ClamAV etwas verdächtiges finden, reportet er dies an AMaViS zurück, welches dann die Mail aus dem Verkehr zieht. ClamAV verfügt über einen automatischen Update-Mechanismus, sodass er selbst dafür sorgt, das seine Bibliotheken immer aktuell [...]]]></description>
			<content:encoded><![CDATA[<h3 align="JUSTIFY">ClamAV</h3>
<p align="JUSTIFY">ClamAV ist ein freier OpenSource Virenscanner. Er ist der de-facto Standard in Linux-Mailsystemen. Er wird auch über AMaViS angesteuert. Sollte ClamAV etwas verdächtiges finden, reportet er dies an AMaViS zurück, welches dann die Mail aus dem Verkehr zieht. ClamAV verfügt über einen automatischen Update-Mechanismus, sodass er selbst dafür sorgt, das seine Bibliotheken immer aktuell sind. Um ClamAV über AMaViS zu aktivieren, muss man in der AmaViS Konfiguration „<strong>15-content_filter_mode</strong>“ die beiden „<strong>@bypass</strong>“-Regeln aktivieren. Danach kann ClamAV über AmaViS angesprochen werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/07/calmav/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AMaViS (A Mail Virus Scanner)</title>
		<link>http://www.zero0ne.de/2011/07/amavis-a-mail-virus-scanner/</link>
		<comments>http://www.zero0ne.de/2011/07/amavis-a-mail-virus-scanner/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 12:36:54 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Stuff]]></category>
		<category><![CDATA[amavis]]></category>
		<category><![CDATA[clamav]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[scanner]]></category>
		<category><![CDATA[spamassasin]]></category>
		<category><![CDATA[viren]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3181</guid>
		<description><![CDATA[AMaViS allgemein Ein weiteres Support-Programm außerhalb von Postfix ist AMaViS. Im eigentlichen steht AMaViS für A Mail Virus Scanner. Doch kann es mehr als nur Mails auf Viren zu prüfen. Mittlerweile ist es auch ein Spam und Maleware-Scanner. Dazu behilft sich AMaViS selbst wieder mit 2 weiteren Programmen. Dies ist einmal ClamAV, der OpenSource-Virenscanner und [...]]]></description>
			<content:encoded><![CDATA[<h3 align="JUSTIFY">AMaViS allgemein</h3>
<p align="JUSTIFY">Ein weiteres Support-Programm außerhalb von Postfix ist AMaViS. Im eigentlichen steht AMaViS für A Mail Virus Scanner. Doch kann es mehr als nur Mails auf Viren zu prüfen. Mittlerweile ist es auch ein Spam und Maleware-Scanner. Dazu behilft sich AMaViS selbst wieder mit 2 weiteren Programmen. Dies ist einmal ClamAV, der OpenSource-Virenscanner und als zweites wird Spamassassin zum scannen nach Spam verwendet.<span id="more-3181"></span></p>
<p align="JUSTIFY">AMaViS fungiert dabei selbst als Mini-Mailserver. Dieser läuft dann nur auf Localhost auf Port 10024. Postfix macht auch noch einen Port auf, und zwar Port 10025 nimm man dort üblicher Weise. Die beiden schicken sich dann die Mails über diese beiden Ports hin und her. Das funktioniert dann so: Postfix nimmt eine Mail an, führt seine bisherigen Checks durch, Greylistet evtl., besteht diese Mail die Test, wird sie an AMaViS weitergereicht, aber noch nicht endgültig angenommen. Dieser übergibt sie dann direkt an ClamAV, wo sie nach Viren durch-scannt wird. Werden Viren gefunden, wird Postfix angewiesen die Mail abzuweisen. Werden keine Viren gefunden wird dann auf Spam geprüft. Hierbei werden verschiedene Techniken benutzt, einmal wird der Text gegen eine Datenbank mit oft vorkommenden Spammeldungen geprüft, andererseits wird auch auf das vorkommen von Links und die Formatierung der Links geachtet. Das Ganze läuft in einen Scorering zusammen, was in den Header geschrieben wird. Liegt der Score zwischen 0 und 5.00 wird die Mail meist als kein Spam klassifiziert oder höchstens als verdächtig im Betreff getagt. Liegt er drüber, wird er meist entweder ins Quarantäne-Postfach umgelenkt oder besser gleich Postfix angewiesen die Mail abzulehnen. Wenn die Mail hier ohne Weiteres durchkommt, wird sie wieder an Postfix übergeben und weiterverarbeitet. AMaViS und Spamassassin kennen natürlich auch wieder White- und Blacklists. Um gewisse Domains von vorhnherein zu erlauben oder zu verbieten. Auch kann man in der AmaViS-Konfiguration in „<strong>/etc/amavis/local.cf</strong>“ und den danebenliegen Konfigurationsdateien das Verhalten noch anpassen. Eben solche Dinge wie, ob Mails abgelehnt oder in Quarantäne verschoben werden.</p>
<p align="JUSTIFY">AMaViS kann in der Konfiguration von Postfix auf zwei Arten aktiviert werden. Entweder über „<strong>content_filter</strong>“ oder über „<strong>smtpd-proxy</strong>“. Logisch gesehen machen die beiden Direktiven das selbe, nur technisch gesehen gibt es einige Unterschiede. Wir werden zu Anfang noch „<strong>content_filter</strong>“ verwenden. Dies ist die bekannte und getestet Lösung. Es ist jedoch geplant auf „<strong>smptd_proxy</strong>“ umzusteigen. Diese bietet technische gesehen einige Vorteile in der Abarbeitung der Mails.</p>
<p align="JUSTIFY">AMaViS wird nun also per <strong>content_filter</strong> eingebunden. Dies ist ein eigener Parameter und steht außerhalb der bis jetzt verwendeten <strong>smtpd_recipient_restrictions</strong>. In einer eigene Zeile wird einfach „<strong>content_filter = amavis:[127.0.0.1]:10024</strong> “ in der <strong>main.cf</strong> eingefügt. Nun muss aber noch zusätzlich in der <strong>master.cf</strong> ein weiterer Eintrag ganz am ende der Datei hinzugefügt werden, da es sonst nicht funktioniert. Denn man muss Postfix noch sagen, das es zu Port 10024, den AMaViS aufmacht, den korrespondierenden Port 10025 aufmachen soll.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/07/amavis-a-mail-virus-scanner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Courier IMAP/POP3 Server</title>
		<link>http://www.zero0ne.de/2011/07/courier-imap-pop3-server/</link>
		<comments>http://www.zero0ne.de/2011/07/courier-imap-pop3-server/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 12:15:46 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[courier]]></category>
		<category><![CDATA[imap]]></category>
		<category><![CDATA[imaps]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[pop3]]></category>
		<category><![CDATA[pop3s]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=3174</guid>
		<description><![CDATA[Courier allgemein Courier stellt im Mailserver-Konstrukt den Zugang für den Benutzer zu seinen Mails dar. Courier ist dabei auch wieder ein Multi-Server, da er 4 Services auf einmal stellt. Courier ist eine IMAP, IMAP-S, POP3 und POP3S Server. Wobei das S immer für Secure stehen soll, hießt eine SSL-verschlüsselte Verbindung genutzt wird. Was Courier an [...]]]></description>
			<content:encoded><![CDATA[<h3 align="JUSTIFY">Courier allgemein</h3>
<p align="JUSTIFY">Courier stellt im Mailserver-Konstrukt den Zugang für den Benutzer zu seinen Mails dar. Courier ist dabei auch wieder ein Multi-Server, da er 4 Services auf einmal stellt. Courier ist eine IMAP, IMAP-S, POP3 und POP3S Server. <span id="more-3174"></span>Wobei das S immer für Secure stehen soll, hießt eine SSL-verschlüsselte Verbindung genutzt wird. Was Courier an Standard Einstellungen mitbringt kann man eigentlich so weiter nutzen. Das einzige wobei man etwas nachjustieren muss ist der Wert für „<strong>MAXDAEMONS</strong>“ und „<strong>MAXPERIP</strong>“. Dies legt einerseits fest, wie viele Threads für den entsprechenden Server erstellt werden und andererseits wie oft man sich von der gleichen IP aus einloggen darf. Courier benutzt für die verschiedenen Protokolle die Standardports. D.h. für IMAP 143, für IMAPS 993, für POP3 110 und für POP3S 995. Diese lassen sich in den Konfigs von Courier aber auch ganz leicht anpassen.</p>
<h3>Courier und SSL</h3>
<p align="JUSTIFY">Was man weiterhin beachten sollte ist, das Courier IMAP und POP3 eigene SSL Zertifikate verwenden. Mann kann diese aber einfach gegen seine eintauschen. Muss dann aber auch wieder darauf achten das diese im PEM-Format vorliegen und auch das CA-Bundle eingebunden wird. Tut man dies nicht, werden die Benutzer beim abholen der Mails über gesicherte Verbindungen darauf hingewiesen, das man ein selbst unterschriebenes Zertifikat benutzt. Dies wird allgemein als unsicher erachtet, was aber nicht immer der Fall sein muss. Die Zertifikate liegen standardmäßig im selben Verzeichnis wie die Konfigurationsdateien. Man kann diese aber auch woanders ablegen, muss dann aber in der „<strong>IMAP-SSL</strong>“-Konfig den Pfad zu diesen korrigieren. Das CA-Bundle bindet man mit der Option „<strong>TLS_TRUSTCERTS</strong>“ ein. Gleiches gilt natürlich auch für POP3-SSL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/07/courier-imap-pop3-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mit Postfix Mails pro Domain filtern</title>
		<link>http://www.zero0ne.de/2011/06/mit-postfix-mails-pro-domain-filtern/</link>
		<comments>http://www.zero0ne.de/2011/06/mit-postfix-mails-pro-domain-filtern/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 14:09:26 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Stuff]]></category>
		<category><![CDATA[amavis]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2409</guid>
		<description><![CDATA[Will man nicht alles was rein kommt filtern, sondern nur bestimmte Domains, so muss man sein „main.cfg“ auf folgende Weise anpassen. Zu erst muss man dann den Eintrag für „amavis“ raus nehmen. Also die Zeile mit „content_filter=“ und soweit vorhanden „receive_override_options = no_address_mappings“. Somit würde jetzt keine Mail mehr an AMaViS weitergegeben werden. Um nun [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Will man nicht alles was rein kommt filtern, sondern nur bestimmte Domains, so muss man sein „<strong>main.cfg</strong>“ auf folgende Weise anpassen. Zu erst muss man dann den Eintrag für „<strong>amavis</strong>“ raus nehmen. Also die Zeile mit „<strong>content_filter=</strong>“ und soweit vorhanden „<strong>receive_override_options = no_address_mappings</strong>“. Somit würde jetzt keine Mail mehr an AMaViS weitergegeben werden. Um nun pro Domain zu filtern fügt man den „<strong>smtpd_recipient_restrictions</strong>“ zwei Regeln hinzu. Dies wären „<strong>check_recipient_access</strong>“ für eingehende Mails und „<strong>check_sender_access</strong>“ für ausgehende Mails. Als Parameter haben diese Regeln jeweils eine gehashte Datei mit einer Liste von Domains. Zum Beispiel: „<strong>hash:/etc/postfix/filter_recipient_domains</strong>“ für eingehende Mails. Der Aufbau dieser Filterlisten sieht so aus: „<strong>example.com  FILTER amavis:[127.0.0.1]:10024</strong>“. Eine Filterliste ist eine simple Textdatei, welche dann von Postfix gehasht wird. Gehasht wird mit „<strong>postmap dateiname“</strong>. Damit werden dann Mails, welche für „<strong>example.com</strong>“ hereinkommen an AMaViS weitergegeben. Will man auch ausgehende Mails überprüfen, fügt man den selben Text in „<strong>/etc/postfix/filter_sender_domains</strong>“ hinzu.</p>
<p style="text-align: justify;">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/06/mit-postfix-mails-pro-domain-filtern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Postfix SMTP Server</title>
		<link>http://www.zero0ne.de/2011/06/postfix-smtp-server/</link>
		<comments>http://www.zero0ne.de/2011/06/postfix-smtp-server/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 14:01:25 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Stuff]]></category>
		<category><![CDATA[mailserver]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[smtp]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2402</guid>
		<description><![CDATA[Ein SMTP-Server nimmt Mails an und versendet diese. Er ist das eigentliche Herz des Email-Server-Komplex. Dabei heißt annehmen nur, die Mails ablegen. Sie dem Benutzer zugänglich machen, dafür ist ein anderer Server zuständig. Postfix basiert im wesentlichen nur auf 2 Konfig-Dateien. Das ist einmal die „master.cfg“ und einmal die „main.cfg“. Hier wird definiert wie viele [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ein SMTP-Server nimmt Mails an und versendet diese. Er ist das eigentliche Herz des Email-Server-Komplex. Dabei heißt annehmen nur, die Mails ablegen. Sie dem Benutzer zugänglich machen, dafür ist ein anderer Server zuständig. Postfix basiert im wesentlichen nur auf 2 Konfig-Dateien. Das ist einmal die „<strong>master.cfg</strong>“ und einmal die „<strong>main.cfg</strong>“. Hier wird definiert wie viele Threads laufen, auf welchen Ports er lauscht und wie eingehende und ausgehende Mails geprüft werden.<span id="more-2402"></span></p>
<h3 style="text-align: justify;"><span style="font-size: 15px; font-weight: bold;">master.cf</span></h3>
<p style="text-align: justify;">In der „<strong>master.cf</strong>“ kann man eigentlich das meiste so lassen wie es ist. Selten besteht bedarf hier etwas zu ändern. Definiert sind hier alle Subprozesse von Postfix und deren Optionen. Z.B. kann man hier einen weiteren SMTP-Port definieren um die Übergabe an Amavis zu regeln. Auch kann man hier schon Checks durchführen, bevor die Mail überhaupt richtig angenommen wurde. Dies sollte man in der Regel aber der „<strong>main.cf</strong>“ überlassen.</p>
<h3 style="text-align: justify;"><span style="font-size: 15px; font-weight: bold;">main.cf</span></h3>
<p style="text-align: justify;">Die „<strong>main.cf</strong>“ definiert wirklich alles weitere, was über die Helfershelfer und die Ports hinausgeht. Unter anderen z.B. Wie sich der Server nennt, auf welche Domains er achten soll, welche Annahmechecks durchgeführt werden, verschiedene Limits und wo die Mailboxen liegen. Mit zusätzlichen Modulen kann man die Mailboxen auch über MySQL definieren. dazu bedarf es dann noch einiger Helfer-Konfigurationen. Diese sind aber selbsterklärend, da in ihnen nur eine MySQL-Verbindung und ein SELECT steht. Neben den ganzen Laufzeit- und Domaineinstellungen sind hier aber die Annahmechecks am wichtigsten. Es gibt verschiedene Level von „<strong>restrictions</strong>“  in denen man filtern kann. Am meisten Sinn macht aber eigentlich nur „<strong>smtpd_recipient_restrictions</strong>“.</p>
<p style="text-align: justify;"><a href="http://www.zero0ne.de/blog/wp-content/uploads/2011/06/adress-valedierung.png"><img class="aligncenter size-full wp-image-2403" title="adress-valedierung" src="http://www.zero0ne.de/blog/wp-content/uploads/2011/06/adress-valedierung.png" alt="" width="456" height="376" /></a></p>
<p style="text-align: justify;">Hier ein Beispiel wie die „<strong>restriction</strong>“ aussehen könnte:</p>
<p style="padding-left: 30px;"><code> smtpd_recipient_restrictions =<br />
#       Keine unsauberen Mails annehmen<br />
reject_non_fqdn_recipient,<br />
reject_unknown_recipient_domain,<br />
#       eigene saeuberung der adresse<br />
check_recipient_mx_access cidr:/etc/postfix/mx_access,<br />
check_recipient_access pcre:/etc/postfix/recipient_checks.pcre,<br />
check_helo_access hash:/etc/postfix/helo_blacklist,<br />
#       Eiegne Nutzer erlauben<br />
permit_sasl_authenticated,<br />
permit_mynetworks,<br />
#       SPAMSCHUTZ RBLs<br />
reject_rbl_client zen.spamhaus.org,<br />
reject_rbl_client ix.dnsbl.manitu.net,<br />
reject_rbl_client bl.spamcop.net,<br />
reject_rbl_client dnsbl.njabl.org,<br />
#       relay-empfaenger<br />
reject_unverified_recipient,<br />
#       backup MX<br />
permit_mx_backup,<br />
reject_unauth_destination,<br />
permit</code></p>
<p style="text-align: justify;"><strong>Von oben nach unten erklärt:</strong></p>
<p style="text-align: justify;">Am Anfang wir geprüft ob der Absender eine Voll qualifizierte Domain-Adresse hat. Anschließend wird geprüft ob die Domain bekannt (erreichbar) ist. Mit MX-Access wird geprüft ob der Absender aus einen Gültigen IP-Netz kommt. Hierauf wird dann geprüft, ob die Mail vom Aufbau her stimmt, also z.B. ob genau ein <strong>„@“</strong> darin enthalten ist. Mit der Regel „<strong>check_helo_access</strong>“ wird überprüft ob jemand versucht mit der IP des Servers aber einer anderen, nicht bekannte Domain, Mail einzuliefern. Anschließend erlaubt man das per SASL authentifizierte Benutzer Kontakt zum Server aufnehmen dürfen. Weiterhin werden auch die eigenen IPs erlaubt, sodass man sich nicht selbst aussperrt. Danach wird mit „<strong>reject_rbl_*</strong>“ verschiedenen „<strong>DNS Black Lists</strong>“ abgefragt, ob der einliefernde Mailserver nicht schon für Spam bekannt ist. Anschließend werden Mails abgewiesen, welche einen unbekannten Empfänger haben. Letztendlich wird noch erlaubt das ein Backup-MX erlaubt. Es wird dann noch verboten, das an Adressen versendet wird, welche nicht erlaubt sind oder nicht existieren. Abschließen wird noch alles erlaubt was bis jetzt nicht verboten ist.</p>
<h3 style="text-align: justify;">RBL im Detail</h3>
<p style="text-align: justify;"><a href="http://www.zero0ne.de/blog/wp-content/uploads/2011/06/anti-span-dns-listen.png"><img class="aligncenter size-full wp-image-2404" title="anti-span-dns-listen" src="http://www.zero0ne.de/blog/wp-content/uploads/2011/06/anti-span-dns-listen.png" alt="" width="456" height="374" /></a></p>
<p style="text-align: justify;">Auszug aus der Wikipedia (http://de.wikipedia.org/wiki/Realtime_Blackhole_List, 13.10.2009):</p>
<blockquote><p>Als Realtime Blackhole List (RBL) oder DNS-based Blackhole List (DNSBL) werden in Echtzeit (realtime) abfragbare Schwarze Listen bezeichnet, die verwendet werden, um E-Mail zweifelhafter Herkunft als Spam zu klassifizieren. In den meisten RBLs werden IP-Adressen von Rechnern gelistet, von denen in der Vergangenheit Spam versendet wurde – einige Listen enthalten auch Quellen von Computerviren und anderer Malware. Heute handelt es sich bei diesen Rechnern meist um trojanisierte PCs oder seltener offene Mail-Relays, die von Spammern missbraucht wurden. Diese Listen können Mailserver oder Spam-Erkennungssoftware (z. B. Spamassassin) beim Eingang einer Mail nahezu in Echtzeit über das DNS-Protokoll auswerten und bei positivem Ergebnis die Annahme der Mail verweigern, die Annahme der Mail verzögern (Teergrube, Greylisting) oder die Mail so markieren, dass sie ohne großen Aufwand vom Empfänger gefiltert werden kann.</p></blockquote>
<p style="text-align: justify;">Es werden die Listen von Spamhaus.org, NiXSpam (Liste der iX), SpamCop.net und NJABL.org empfohlen. Diese haben sich in der Vergangenheit als sehr zuverlässig erwiesen und einen geringen Anteil an False-Positives.</p>
<p style="text-align: justify;"><span style="font-size: 15px; font-weight: bold;">postconf</span></p>
<p style="text-align: justify;">Will man sich die Konfig welche gerade geladen ist noch einmal ansehen, kann man dazu das Kommando „<strong>postconf</strong>“ nehmen. Mit „<strong>postconf -d</strong>“ kann man sich alle Defaulteinstellungen anzeigen lassen. Dies gibt sehr viel Output, da wirklich fast jede Variable ausgegeben wird. Übersichtlicher wird das ganze wenn man „<strong>postconf -n</strong>“, welche Variablen anzeigt, welche nicht defaultmäßig belegt sind. Also verändert wurden. Neben dem Anzeigen der Konfigs, kann man mit postconf auch Variablen setzen. Dazu gibt man „<strong>postconf -e &#8216;PARAMETER=WERT&#8217;</strong> “.</p>
<h3 style="text-align: justify;">postqueue</h3>
<p style="text-align: justify;">Mit dem Kommando „<strong>postqueue</strong>“ kann man sich die Warteschlange des Servers ansehen. Hier liegen Mails die noch nicht versendet wurden, oder zurück kamen und auf einen erneuten Zustellversuch warten. Dabei kann man sich die Queue ansehen und auch einen erneuten Zustellversuchen veranlassen. Anzeigen kann man sich die Queue mit „<strong>postqueue -p</strong>“. Dabei wird dann angezeigt, welche ID die Mail hat. Dies ist wichtig wenn man in Logdateien danach sucht. Weiterhin wird auch angezeigt, welche Größe die Mail hat, wann sie ursprünglich eintraf und von wem an wen sie gesendet wurde. Hängt man den noch ein „<strong>-v</strong>“ an, bekommt man noch einige Debug-Meldungen ausgegeben. Gibt man mehr V&#8217;s an, werden noch mehr Ausgaben produziert. Mit „<strong>postconf -f</strong>“ veranlasst man Postfix dazu, alle Mails in der Queue noch mal versuchen zu versenden. Mit „<strong>postqueue -i ID</strong>“ veranlasst man Postfix genau die Mail mit der übergebenen ID nochmals zuzustellen. Weiterhin kann man dann auch noch mit „<strong>postqueue -s Domain</strong>“ den erneuten Versandt aller Mails dieser Domain zu veranlassen. Was postqueue nicht kann, ist das löschen einer Mail aus der Queue.</p>
<h3 style="text-align: justify;">postsuper</h3>
<p style="text-align: justify;">Da postqueue keine Mails löschen kann, nimmt man „<strong>postsuper</strong>“. Dieses ist zur Queue-Steuerung da. Man kann Queue-Mails löschen, in eine Queue stecken oder sie auch wieder herausholen. Will man also eine Mail aus der Queue entfernen gibt man „<strong>postsuper -d ID</strong>“ an. Will man die gesamte Queue löschen nimmt man „<strong>postsuper -d ALL</strong>“. Wobei darauf zu achten ist, das das „<strong>ALL</strong>“ auch wirklich groß geschrieben wird, da es sonst nicht klappt. Hinter dem ALL kann man auch noch eine Queue angeben. Muss man aber nicht. Man kann auch eine Mail auf „<strong>on Hold</strong>“ setzten. das heißt sie temporär stoppen. Das tut man indem man „<strong>postsuper -h ID</strong>“ eingibt. Auch hier trifft wieder das mit ALL und der optionalen Queue Angabe zu. Um die Mail wieder weiterzubearbeiten holt man sie mit „<strong>postsuper -H ID</strong>“ wieder ins aktive System.</p>
<p style="text-align: justify;"><span style="font-size: 15px; font-weight: bold;">Das Postfix-Log</span></p>
<p style="text-align: justify;">Postfix schreibt im normal Fall unter „<strong>/var/log/</strong>“ seine Log-Dateien. Hierbei schreibt es immer 4 Logs parallel. Einmal all-umfassend „<strong>mail.log</strong>“. Hier steht alles drin was Postfix und seine Helfershelfer so von sich geben. Dann gibt es noch die drei Dateien „<strong>mail.info</strong>“ , „<strong>mail.warn</strong>“ und „<strong>mail.err</strong>“. Hier stehen dann entsprechend der Namen jeweils nur die Logs vom Level Info, Warning und Error drin. Die Logs werden dabei immer ungefähr  10-14 Tage in 8 Versionen vorgehalten.</p>
<h3 style="text-align: justify;">pflogsum</h3>
<p style="text-align: justify;">„<strong>pflogsum</strong>“ erstellt aus dem Logfile von Postfix eine Zusammenfassung. Wie viele Mails prozesst wurden, wie viele abgelehnt und geblockt. Welche SMTP-Fehler auftraten. Top-Senden und Top-Empfänger. Wie die Verteilung der Mails über den Tag hinweg waren und noch andere statistische Werte. Damit kann man den Mailserver ein wenig im blick behalten und frühzeitig Fehler erkennen. Ein aufruf von „<strong>pflogsum</strong>“ für normaler Weise zur Ausgabe in der CLI. Man kann das Ganze aber auch in eine Mail umleiten und dann per Cronjob einmal am Tag versenden lassen.</p>
<p style="padding-left: 30px;"><code>pflogsumm --rej_add_from --problems_first --smtpd_stats -h 15 -u 15 --no_reject_detail --no_smtpd_warnings -d today /var/log/mail.log | mail -s "Mailserver Report -  `date`" monitoring@domain.de</code></p>
<p style="text-align: justify;">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/06/postfix-smtp-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aufbau eines Linux Mailserver</title>
		<link>http://www.zero0ne.de/2011/06/aufbau-eines-linux-mailserver/</link>
		<comments>http://www.zero0ne.de/2011/06/aufbau-eines-linux-mailserver/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 08:35:09 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Stuff]]></category>
		<category><![CDATA[amavis]]></category>
		<category><![CDATA[clamav]]></category>
		<category><![CDATA[courier]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mailserver]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[spamassasin]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2398</guid>
		<description><![CDATA[Hier möchte ich kurz den von mir favorisierten Aufbau eines &#8220;Mailserver&#8221; unter Linux beschreiben. Im Eigentlichen ist es nicht ein „Mailserver“ sondern mehrere Dienste die zusammenarbeiten und im Endeffekt nach außen als ein Server auftreten. Der Mailserver-Komplex besteht aus: Service-Liste: Postfix SMTP-Server AmaVis Spamassasin pyszor dcc bayes ClamAV Courier IMAP-Server POP3-Server Schematischer Aufbau: Annahme Von [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hier möchte ich kurz den von mir favorisierten Aufbau eines &#8220;Mailserver&#8221; unter Linux beschreiben. Im Eigentlichen ist es nicht ein „<strong>Mailserver</strong>“ sondern mehrere Dienste die zusammenarbeiten und im Endeffekt nach außen als ein Server auftreten. <span id="more-2398"></span>Der Mailserver-Komplex besteht aus:</p>
<h2>Service-Liste:</h2>
<ul>
<li>Postfix SMTP-Server</li>
<li>AmaVis
<ul>
<li>Spamassasin
<ul>
<li>pyszor</li>
<li>dcc</li>
<li>bayes</li>
</ul>
</li>
<li>ClamAV</li>
</ul>
</li>
</ul>
<ul>
<li>Courier
<ul>
<li>IMAP-Server</li>
<li>POP3-Server</li>
</ul>
</li>
</ul>
<h2>Schematischer Aufbau:</h2>
<p><a href="http://www.zero0ne.de/blog/wp-content/uploads/mailserver.png"><img class="aligncenter size-medium wp-image-1975" title="mailserver" src="http://www.zero0ne.de/blog/wp-content/uploads/mailserver-300x212.png" alt="" width="300" height="212" /></a></p>
<h2 style="text-align: justify;">Annahme Von E-Mails</h2>
<p style="text-align: justify;">Kommen E-Mails vom Internet aus am Mail-Server an, werden diese zunächst angenommen und dann geprüft. Zu erst wird der Aufbau der E-Mail geprüft. Ist dieser nicht FQDN-Konform wird die E-Mail abgewiesen, da FQDN-Unkonforme (FQDN = Full Qualified Domain Name = Standardmäßiger Domainname) E-Mails nicht im Internet vorkommen, außer sie werden von Spammern verwendet. Danach wird geprüft ob der einliefernde Mailserver per Reserve DNS und EHLO-Check legitim ist. Darauf wird dann noch geprüft ob der Empfänger FQDN-konform ist. Ist dies der Fall wird die IP des einliefernden Servers gegen verschiedene Spam-Listen getestet. Sollte dies positiv sein, wird die E-Mail abgewiesen. Ist das Ergebnis negativ wird die E-Mail an AMaViS übergeben. Dieser durch-scannt mit Hilfe von Spamassassin die E-Mail nach Spam-Merkmalen. Auch wird durch AMaViS die E-Mail auf Viren geprüft. Dies geschieht mit Hilfe von ClamAV. Wenn die E-Mail dann letztendlich auch diese Prüfungen bestanden hat, wird sie auf die Festplatte ins MailDir des betreffenden Empfängers gespeichert. Dort liegt sie dann als simple Textdatei vor.</p>
<p style="text-align: justify;">Nun kann sie durch ein Mailprogramm abgerufen werden. Dies geschieht indem das Mailprogramm zu Courier eine Verbindung aufbaut und nach neuen Mails fragt. Courier biete dazu die Protokolle POP3 und IMAP an. Darüber werden dann die als Textdateien gespeicherten E-Mail aus dem Maildir ausgelesen  und an das Mailprogramm gesendet.</p>
<h2 style="text-align: justify;">Versenden von E-Mails</h2>
<p style="text-align: justify;">Vor dem Versenden durch den SMTP-Server wird die E-Mail wieder auf Viren und Spam geprüft. Ein Greylisting findet in diese Richtung nicht statt. Die Anti-Spam-Listen werden in diese Richtung auch nicht abgefragt. Im Anschluss wird die Mail wieder darauf geprüft ob Sender- und Empfänger-Adresse FQDN-konform sind. Auch wird noch geprüft ob der empfangende Mailserver legitim ist. Passiert die Mail die Tests wird sie vom SMTP versendet.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/06/aufbau-eines-linux-mailserver/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nginx Redirect von non-WWW auf WWW</title>
		<link>http://www.zero0ne.de/2011/06/nginx-redirect-von-non-www-auf-www/</link>
		<comments>http://www.zero0ne.de/2011/06/nginx-redirect-von-non-www-auf-www/#comments</comments>
		<pubDate>Fri, 24 Jun 2011 09:29:32 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Stuff]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[redirect]]></category>
		<category><![CDATA[umleitung]]></category>
		<category><![CDATA[webserver]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2258</guid>
		<description><![CDATA[Oft hat man ja das Bedürfnis, seine Website unter der &#8220;www.&#8221; Subdomain laufen zu lassen. Oder eben auch ohne &#8220;www.&#8221;. Oder auch man hat mehrere Domains zu seiner Präsenz und will immer die Hauptdomain angezeigt haben. So kann man dann auch dem Problem des &#8220;duplicated Contents&#8221; bei Google beseitigen. Da man dann ja seinen Content [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Oft hat man ja das Bedürfnis, seine Website unter der &#8220;www.&#8221; Subdomain laufen zu lassen. Oder eben auch ohne &#8220;www.&#8221;. Oder auch man hat mehrere Domains zu seiner Präsenz und will immer die Hauptdomain angezeigt haben. So kann man dann auch dem Problem des &#8220;duplicated Contents&#8221; bei Google beseitigen. Da man dann ja seinen Content nur noch unter einen Domain betreibt.</p>
<p>Mit Nginx kann man das in folgender Weise realisieren:</p>
<p>Immer WWW:</p>
<blockquote><p>if ($host != &#8216;www.domain.de&#8217; ) {<br />
rewrite  ^/(.*)$  http://www.domain.de/$1  permanent;<br />
}</p></blockquote>
<p>Ohne WWW:</p>
<blockquote><p>if ($host != &#8216;domain.de&#8217; ) {<br />
rewrite  ^/(.*)$  http://domain.de/$1  permanent;<br />
}</p></blockquote>
<p>Falls man aber noch mehrere Subdomains unterhalb seiner Domain fährt, sollte man dies etwas anders gestalten:</p>
<blockquote><p>if ($host = &#8216;www.domain.de&#8217; ) {<br />
rewrite  ^/(.*)$  http://domain.de/$1  permanent;<br />
}</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/06/nginx-redirect-von-non-www-auf-www/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPad2 Test</title>
		<link>http://www.zero0ne.de/2011/06/ipad2-test/</link>
		<comments>http://www.zero0ne.de/2011/06/ipad2-test/#comments</comments>
		<pubDate>Fri, 24 Jun 2011 08:29:11 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[ipad2]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2249</guid>
		<description><![CDATA[Hab die Tage mal ein iPad2 zum testen. Ich muss sagen, zu Anfang gab und gibt es eigentlich noch immer keinen wirklichen Kaufgrund, wenn man schon ein iPad der ersten Generation hat. Das neue iPad ist abgerundeter und liegt so besser in den Händen. Es ist ein wenig leichter und ein wenig dünner. Hat zwei [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hab die Tage mal ein iPad2 zum testen. Ich muss sagen, zu Anfang gab und gibt es eigentlich noch immer keinen wirklichen Kaufgrund, wenn man schon ein iPad der ersten Generation hat. Das neue iPad ist abgerundeter und liegt so besser in den Händen. Es ist ein wenig leichter und ein wenig dünner. Hat zwei Kameras. Aber wer braucht die schon an einem Tablet?! Das einzig wichtige ist eigentlich der bessere CPU der im iPad2 steck. Dieser bringt echt mehr Leistung. Viele Applikationen laufen gefühlt schneller und flüssiger. Ganz nett ist auch dieses Smart Cover. Wobei Apple aber nicht wirklich gemerkt hat, das die leute mehr Angst davor haben das die Alu-Rückseite verkratzt als das Display. Mir geht es jedenfalls so. Und dabei hilft einem das tolle Smart Cover nicht wirklich. Die alte Apple Hülle war schon toll, aber ein Dreckmagnet sondergleichen! Ein wirklicher Kaufgrund währe ja eigentlich ein höher auflösendes Display gewesen. Leider hat das Apple wohl anders gesehen. Ich mag das Display vom iPhone 4 echt. Das auf der Grösse vom iPad wäre Hammer! Vielleicht kommt das ja in der nächsten Generation. Im Vergleich zum iPad ist der SIM-Schacht echt schlecht verbaut und lässt sich nur schwer öffnen. Die Lösung vom iPad war da besser. Aber dann hätte das mit den abgerundeten Kanten ja nicht geklappt. Und wie oft wechselt man schon mal die SIM? Das lässt sich also verkraften. Um noch mal auf die Kamera zurückzukommen, diese ist eher mittelmässig bis schlecht von der Auflösung her. Aber es ist eben nicht mal 1 MegaPixel, da kann man nicht all zuviel erwarten. Den Hauptzweck, Videotelefonie, erfüllt sie aber ganz gut. Aber mehr als Spielerei ist das eh nicht. Ich sitzt für so etwas lieber vor meinem iMac.</p>
<p style="text-align: justify;">Summa Summarum kann man sagen, eine gut überarbeitet Version des ersten iPad, welche eigentlich den Namen iPad2 nicht verdient hätte. Für mich ist es eher ein iPad 1.5.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/06/ipad2-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tomcat &#8211; server.xml</title>
		<link>http://www.zero0ne.de/2011/06/tomcat-server-xml/</link>
		<comments>http://www.zero0ne.de/2011/06/tomcat-server-xml/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 12:42:44 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[server.xml]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2227</guid>
		<description><![CDATA[In der server.xml werden die Startparameter definiert. Der HTTP-Connector, AJP-Connector und die Hosteinstellungen. Auch die Port-Einstellungen sind hier festgehalten. Der Tomcat hat 4 wichtige Ports. Den Anfang macht dabei immer der Shutdown-Port im Server-Tag der Konfiguration. Der Standard für diesen ist „8005“. Betreibt man mehrere Tomcats muss ab dem 2. Tomcat hier etwas Anderes eingetragen [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">In der server.xml werden die Startparameter definiert. Der HTTP-Connector, AJP-Connector und die Hosteinstellungen. Auch  die Port-Einstellungen sind hier festgehalten. Der Tomcat hat 4 wichtige Ports. Den Anfang macht dabei immer der Shutdown-Port im Server-Tag der Konfiguration. Der Standard für diesen ist „<strong>8005</strong>“. Betreibt man mehrere Tomcats muss ab dem 2. Tomcat hier etwas Anderes eingetragen werden. Auf einen Port kann immer nur ein Prozess laufen. Der nächste Port steht im ersten der beiden Standard Connectoren. Dies ist per Default der HTTP-Connector und läuft auf Port „<strong>8080</strong>“ und hat einen SSL-Redirect auf „<strong>8443</strong>“. Der zweite Connector ist als AJP-Connector konfiguriert und läuft standardmäßig auf Port „<strong>8009</strong>“.<span id="more-2227"></span></p>
<p style="text-align: justify;">Über die Connectoren kann Verbindung zum Tomcat aufbauen. Über den HTTP-Connector kann man, wie der Name schon sagt HTTP-Verbindungen aufbauen. Also der Port über den alle Webseiten ausgeliefert werden. Bei Tomcat ist dies defaultmäßig immer &#8220;<strong>8080</strong>&#8220;. Im Gegensatz zu Port &#8220;<strong>80</strong>&#8220;, welcher z.B. bei Apache2 genommen wird. Dies ist so, da Tomcat selten direkt als Webserver auftritt. Meist sind ihm immer noch Webserver vorgeschalten. Zum Beispiel Nginx per Reverse Proxy oder Apache2. Dieser verbindet sich meist über mod_jk. Damit kämen wir dann zum AJP-Connector. Dieser wird also zur kommunikation zwischen dem Apache2 Modul mod_jk und Tomcat benutzt. Das Protokoll ist ein binäres, es wird also kein HTTP gesprochen. Von jedem Connector kann es immer mehrere geben, jeweils natürlich mit unterschiedlichen Ports.</p>
<p style="text-align: justify;">Die „<strong>server.xml</strong>“ ist im XML Stil ausgebaut. Alles wird mit Tags definiert. Alles umschließt das „<strong>&lt;server&gt;</strong>“-Tag. Innerhalb davon sind dann immer einige Listener und Resourcen definiert. Im weiteren Verlauf kommt dann das „<strong>&lt;service&gt;</strong>“-Tag. Darin enthalten sind die Connectoren für HTTP und AJP. Weiterhin noch das „<strong>&lt;engine&gt;</strong>“-Tag. Damit kann man den Standardhost für den Tomcat angeben, welcher genommen werden soll, wenn kein anderer passt. Darin enthalten ist dann einmal das Realm-Tag und dann noch das besagte „<strong>&lt;host&gt;</strong>“-Tag. Dieses entspricht grob den Vhosts beim Apache2-Webserver. Damit kann man Hostnames auf Applikationen mappen. Die „<strong>appBase</strong>“ (DocumentRoot) festlegen und weitere Feature zur Behandlung von Sourcecode. Innerhalb hiervon kann man wiederum „<strong>&lt;context&gt;</strong>“-Tags festlegen, welche dann die Applikationen noch genauer beschreiben und auch Domain-Pfade kennen. Und letztendlich kann man jetzt wieder „<strong>&lt;resource&gt;</strong>“-Tags anlegen, um der Applikation z.B. feste Datenbankverbindungen mitzugeben.</p>
<p style="text-align: justify;">Applikationen kann man hier definieren, muss man aber nicht. Eine wesentlich dynamischere Variante wäre hier, die &#8220;<strong>context.xml</strong>&#8221; zu benutzten. Denn bei Änderungen an der server.xml muss danach der Tomcat neu gestartet werden. Benutzt man die &#8220;<strong>context.xml</strong>&#8221; braucht es zum einspielen keinen Neustart.</p>
<p style="text-align: justify;">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/06/tomcat-server-xml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aufbau Apache Tomcat</title>
		<link>http://www.zero0ne.de/2011/06/aufbau-apache-tomcat/</link>
		<comments>http://www.zero0ne.de/2011/06/aufbau-apache-tomcat/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 09:38:47 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[servlet]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2220</guid>
		<description><![CDATA[Die wichtigsten Verzeichnisse beim Tomcat sind einmal „common/lib“, „conf“, „webapps“ und „work“. Die restlichen Verzeichnisse sind Systemverzeichnisse und haben für die meisten Belange eher eine untergeordnete Bedeutung. Ich lege meine Tomcats oft ins Verzeichnis „/opt/tomcat/“. Dies ist kein Tomcat Standard. Im Wesentlichen sind die neueren Tomcats ähnlich aufgebaut wie der 5.5. Einziger unterschied ist, das die [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Die wichtigsten Verzeichnisse beim Tomcat sind einmal „<strong>common/lib</strong>“, „<strong>conf</strong>“, „<strong>webapps</strong>“ und „<strong>work</strong>“. Die restlichen Verzeichnisse sind Systemverzeichnisse und haben für die meisten Belange eher eine untergeordnete Bedeutung. Ich lege meine Tomcats oft ins Verzeichnis „<strong>/opt/tomcat/</strong>“. Dies ist kein Tomcat Standard. Im Wesentlichen sind die neueren Tomcats ähnlich aufgebaut wie der 5.5. Einziger unterschied ist, das die Libs nicht mehr unter „<strong>common/lib</strong>“ liegen sondern direkt unter „<strong>lib/</strong>“. Weiterhin unterscheiden sie sich natürlich durch neuere Servlet-Engines. Was aber für den Serverbetrieb nicht wichtig ist.</p>
<p style="text-align: justify;">Baumansicht der Verzeichnisstruktur eines Tomcat 5.5</p>
<p style="padding-left: 30px;">|&#8211; bin<br />
|&#8211; common<br />
|   |&#8211; classes<br />
|   |&#8211; endorsed<br />
|   |&#8211; i18n<br />
|   `&#8211; lib<br />
|&#8211; conf<br />
|&#8211; logs<br />
|&#8211; server<br />
|   |&#8211; classes<br />
|   |&#8211; lib<br />
|   `&#8211; webapps<br />
|       |&#8211; host-manager<br />
|       `&#8211; manager<br />
|&#8211; shared<br />
|   |&#8211; classes<br />
|   `&#8211; lib<br />
|&#8211; temp<br />
|&#8211; webapps<br />
|   `&#8211; AG_Public<br />
`&#8211; work<br />
`&#8211; Catalina<br />
<span id="more-2220"></span></p>
<p style="text-align: justify;"><span style="font-size: 15px; font-weight: bold;">Das Lib-Verzeichnis</span></p>
<p style="text-align: justify;">Unterhalt „<strong>common</strong>“ liegt das Verzeichnis für die ganzen Libaries die Tomcat-weit genutzt werden können. Auf diese Libs haben alle Applikationen zugriff.</p>
<h3 style="text-align: justify;">Das Konfigurationsverzeichnis „conf“</h3>
<p style="text-align: justify;">Hier liegen alle Dateien die Konfiguration betreffend. Wichtig sind hier die „<strong>server.xml</strong>“ und die „<strong>web.xml</strong>“. Will man die einfache HTTP-Auth von Tomcat nutzen, ist dann noch die „<strong>tomcat-users.xml</strong>“. Es gibt weiterhin noch eine weitere wichtige Konfig die aber im „bin“-Verzeichnis liegt. Das ist die „<strong>catalina.sh</strong>“. Hier kann man noch Startoptionen für die Tomcat-JVM einstellen. Z.B. Heapsize oder GarbageCollector.</p>
<h3 style="text-align: justify;">Das WebApp-Verzeichnis</h3>
<p style="text-align: justify;">Hie liegt die eigentlich Applikation. Entweder als Verzeichnis oder als WAR-Datei. Es kann auch beides nebeneinander liegen, aber auch nur eins von beiden vorhanden sein. dies obliegt den Einstellungen in der „<strong>server.xml</strong>“. Wenn beides vorhanden ist, ist es meist auch so, das wenn man das WAR löscht, auch das Verzeichnis vom Tomcat selbst entfernt wird.</p>
<h3 style="text-align: justify;">Das „work“-Verzeichnis</h3>
<p style="text-align: justify;">Hier lagert der Tomcat die ganzen compilierten Klassen, Servlets und JSP. Dabei wird alles im Unterordner „<strong>Catalina</strong>“ gespeichert. Hier wiederum wird das ganze noch nach Hosts aufgeteilt. In der Regel sollte bei einer Applikation, dann auch nur ein Verzeichnis mit Namen „<strong>localhost</strong>“ da sein. Hat man in der „<strong>server.xml</strong>“ mehrere Hosts definiert, findet man die hier alle wieder. Wenn man die Vermutung hat, das der Tomcat die neuen Sourcen, welche man gerade eingespielt hat, noch nicht übernommen hat, dann sollte man den Tomcat einmal stoppen, das „<strong>work</strong>“-Verzeichnis leeren und ihn dann wieder starten. Dann ist er gezwungen alles noch mal neu zu compilieren.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/06/aufbau-apache-tomcat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Cache Funktionen</title>
		<link>http://www.zero0ne.de/2011/06/apache-cache-funktionen/</link>
		<comments>http://www.zero0ne.de/2011/06/apache-cache-funktionen/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 13:45:04 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Stuff]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2205</guid>
		<description><![CDATA[mod_cache Um das Cacheing beim Apache zu aktivieren, muss man zum einen das allgemeine Cacheing Modul „mod_cache“ laden und dann eins für die Cacheing Methode welche man verwenden möchte. Also entweder „mod_disk_cache“ oder „mod_mem_cache“, wobei es auch geht beide zu laden. Es kommt eben immer darauf an wie man Cachen möchte. Entweder nur im RAM, [...]]]></description>
			<content:encoded><![CDATA[<h2 style="text-align: justify;"><strong>mod_cache</strong></h2>
<p style="text-align: justify;">Um das Cacheing beim Apache zu aktivieren, muss man zum einen das allgemeine Cacheing Modul „<strong>mod_cache</strong>“ laden und dann eins für die Cacheing Methode welche man verwenden möchte. Also entweder „<strong>mod_disk_cache</strong>“ oder „<strong>mod_mem_cache</strong>“, wobei es auch geht beide zu laden. Es kommt eben immer darauf an wie man Cachen möchte. Entweder nur im RAM, oder nur auf der Festplatte, oder ein gemisch aus beiden. Eingebunden werden die Module über das Kommando „<strong>LoadModule Modulname Modul</strong>“. Für Cacheing würde das so aussehen:<span id="more-2205"></span></p>
<blockquote><p>LoadModule cache_module modules/mod_cache.so<br />
LoadModule disk_cache_module modules/mod_disk_cache.so<br />
LoadModule mem_cache_module modules/mod_mem_cache.so</p></blockquote>
<p style="text-align: justify;">In dem Zusammenhang ist es auch immer gut noch die Module für HTTP-Header und Expire-Steuerung zu aktivieren. Da auf diese beim Cacheing zurückgeriffen wird. Also zusätzlich dann noch:</p>
<blockquote><p>LoadModule expires_module modules/mod_expires.so<br />
LoadModule headers_module modules/mod_headers.so</p></blockquote>
<p style="text-align: justify;">All dies wird in die httpd.conf (evtl. auch apache2.conf) eingefügt. Nach einem Neustart des Apache sind die Module dann auch verfügbar. Hier nun die Allgemeinen Optionen für „<strong>mod_cache</strong>“:</p>
<p style="text-align: justify;">„<strong>CacheEnable disk /</strong>“ aktiviert das Caching. „<strong>disk</strong>“ besagt hierbei das „<strong>mod_disk_cache</strong>“ benutzt wird und nicht „<strong>mod_mem_cache</strong>“. Das Slash besagt, das alles ab dem Domain-Root gecached werden soll. Also alles z.B. ab http://www.domain.tld/ . Man könnte also auch sagen, wenn man nur Teilbereiche seiner Website cachen will, das nur http://www.domain.tdl/archive/ gecached werden soll. Dies würde man mit „<strong>CacheEnable disk /archive/</strong>“ erreichen. Will man mod_mem_cache ansprechen muss man die Option entsprehende umformulieren: „<strong>CacheEnable mem /sites</strong>“. So wird alles unterhalb von domain.tld/sites/ in durch den Mem- Cache abgedeckt.</p>
<p style="text-align: justify;">„<strong>CacheDisable</strong>“ kann das Caching für angegebene Domain.Pfade deaktivieren. Bsp.: „<strong>CacheDisable /sites/intern</strong>“.</p>
<p style="text-align: justify;">„<strong>CacheDefaultExpire</strong>“ legt die Zeit für ein Dokument ohne Gültigkeitsdauer fest, bevor es verfällt. Also wenn eine Dokumente keinen „<strong>Expires</strong>“-Header hat. Der Standard-Wert liegt bei einer Stunde. Die Zeit wird in Sekunden angegeben.</p>
<p style="text-align: justify;">„<strong>CacheIgnoreCacheControl</strong>“, ist diese Option gesetzt ignoriert Apache den „<strong>CacheControl</strong>“-Header des angeforderten Objektes und legt es trotzdem in den Cache, auch wenn „<strong>CacheControl: no-cache</strong>“ gesetzt ist.</p>
<p style="text-align: justify;">„<strong>CacheIgnoreNoLastMod</strong>“ wird gesetzt wenn man ein Dokument ohne „<strong>Last-Modified</strong>“-Header hat, dies aber trotzdem in den Cache legen möchte. Der „<strong>Last-Modified</strong>“-Wert wird dann auf die aktuelle Zeit + den Wert von „<strong>CacheDefaultExpire</strong>“ gesetzt.</p>
<p style="text-align: justify;">„<strong>CacheLastModifiedFactor</strong>“ legt das Verfallsdatum anhand von LastModified-Headers fest, wenn kein Expires- Header gesetzt ist. Dazu wird die aktuelle Zeit genommen, dann nachgeschaut, wie lange das Dokument schon nicht verändert wurde und dies dann mit dem Faktor multipliziert. Daraus ergibt sich zum Bsp. Bei einer seit 20h nicht mehr veränderten Datei und einen Faktor von „<strong>0,1</strong>“ eine Verfallszeit von zwei Stunden.</p>
<p style="text-align: justify;">„<strong>CacheMaxExpire</strong>“ definiert wie lange ein Dokument ohne Prüfung aus dem Cache ausgeliefert wird. Ist die Zeit abgelaufen, wird es aus dem Cache genommen, selbst wenn der „Expires“-Header etwas anderes besagt.</p>
<h2 style="text-align: justify;"><strong>mod_disk_cache</strong></h2>
<p style="text-align: justify;">Will man nun für einen bestimmten Vhost das Disk-Caching aktivieren (gesamte Domain), muss man in dessen &lt;VirtualHost&gt;-Tag folgendes einfügen:</p>
<blockquote><p>CacheEnable        disk /<br />
CacheRoot            /var/cache/apache2/VHOSTname<br />
CacheSize             307200<br />
CacheDirLevels   3<br />
CacheDirLength	2<br />
CacheMaxFileSize   2097152<br />
CacheMinFileSize    1024</p></blockquote>
<p style="text-align: justify;">„<strong>CacheRoot</strong>“ gibt an, wo auf der Festplatte das Verzeichnis liegt, in welchem Apache seine Cache-Dateien ablegent. Dieses Verzeichnis muss schon existieren, der Webserver wird es nicht selbst anlegen. Deshalb sollte man darauf achten, das auch die richten Zugriffsrechte gesetzt sind. Dieses Kommando gilt nur für „<strong>mod_disk_cache</strong>“.</p>
<p style="text-align: justify;">„<strong>CacheDirLevels</strong>“ legt die Tiefe fest, bis zu welcher Ordner für Cache-Dateien angelegt werden sollen.</p>
<p style="text-align: justify;">„<strong>CacheDirLength</strong>“ legt die Länge der Ordnernamen fest, in welchen die Cache-Dateien gespeichert werden. Die beiden Direktiven dienen zur Verwaltung der Cache-Dateien. So wird die Ordner Hierarchie festgelegt. So kann man die Größe des Cache regulieren und durch schlanke Verzeichnisstrukturen die Zugriffszeiten steigern. Dabei ist noch zu beachten, das CacheDirLevels * CacheDirLength &lt; 20 sein sollte. Sollte dies nicht beachtet werden kommt es zu Instabilitäten oder sogar abstürzen des Apache.</p>
<p style="text-align: justify;">„<strong>CacheMaxFileSize</strong>“ legt die maximale Größe einer Datei fest, welche in den Cache aufgenommen werden soll. Überschreitet eine Datei diese Größe wird sie nicht gecached. Im Bsp. Wird die max. Größe auf 2 MiB festgelegt.</p>
<p style="text-align: justify;">„<strong>CacheMaxFileSize</strong>“ legt entgegen zu CacheMaxFileSize die minimal Größe einer Datei fest, welche in den Cache aufgenommen werden soll. Unterschreiten Dateien diese Größe, werden sie ebenfalls nicht gecached. Im Bsp. Wird die min. Größe auf 100 KiB festgelegt</p>
<p style="text-align: justify;">„<strong>CacheSize</strong>“ legt einfach die Maximale Größe des gesamten Cache fest, der auf der Festplatte gespeichert werden soll. Läuft der Cache über, wird er durch das löschen der ältesten Dateien wieder auf seine maximal erlaubte Größe verkleinert. „<strong>mod_disk_cache</strong>“ hat dazu eine eigene Garbage-Collection-Funktion. Dabei wird auf das externe, aber zu Apache gehörende Tool „<strong>htcacheclean</strong>“ zurückgegriffen. Dieses Tool kann man auch selbst anstoßen oder durch Cronjobs zyklisch laufen lassen.</p>
<h2 style="text-align: justify;"><strong>mod_mem_cache</strong></h2>
<p style="text-align: justify;">Im Gegensatz zu mod_disk_cache, speichert „<strong>mod_mem_cache</strong>“ wie der Name schon sagt, die zu cachenden Inhalte im RAM des Servers. Auch sind hier wieder Angaben pro Vhost möglich. Für „<strong>mod_mem_cache</strong>“ gibt es 6 Optionen, die im Folgenden erläutert werden.</p>
<p style="text-align: justify;">„<strong>MCacheSzie</strong>“ legt die Maximale Größe des Cache im RAM fest. Man sollte sie nicht allzu groß wählen, außer man hat genügend Hauptspeicher. Standardmäßig steht dies Option auf 100 KiB.</p>
<p style="text-align: justify;">„<strong>MCacheMaxObjectCount</strong>“ legt die maximale Anzahl der Objekte im Speicher fest. Wird die Grenze erreicht, werden Objekte anhand der Option „<strong>MCacheRemovalAlgorithm</strong>“ entfernt.</p>
<p style="text-align: justify;">„<strong>MCacheMaxObjectSize</strong>“ legt wie der Name schon sagt, die max. Größe eines Objektes fest. Sie entspricht der Option „<strong>CacheMaxFileSize</strong>“.</p>
<p style="text-align: justify;">„<strong>MCacheMinObjectSize</strong>“ ist das Gegenteil der vorherigen Option und legt die minimale Größe eines Dokuments fest, welches im Speicher abgelegt werden darf. Es ist das Äquivalent zu „<strong>CacheMinFileSize</strong>“</p>
<p style="text-align: justify;">„<strong>MCacheMaxStreamingBuffer</strong>“ legt den max. Buffer für Streaming-Antworten fest. Bei Streaming-Objekten ist die Gesamtgröße vorher nicht bekannt. Daher kann die Prüfung von „<strong>MCacheMaxObjectSize</strong>“ nicht stattfinden. Daher wird soviel wie „<strong>MCacheMaxStreamingBuffer</strong>“ festlegt, gepuffert und daran dann entschieden ob das Objekt zu groß ist für den Cache oder nicht. Wird diese Option nicht gesetzt, wird der Wert von	<strong>MCacheSzie</strong>“ genommen. Aber dann nur ungefähr 98% davon.</p>
<p style="text-align: justify;">„<strong>McacheRemovalAlgorithm</strong>“ bestimmt nach welchen Verfahren die Objekte aus dem Speicher entfernt werden. Dabei gibt es zwei Optionen. Einmal <em>LRU </em>und zum anderen <em>GDSF</em>. <em>LRU </em>beduetet hierbei <em>Last Recently Used</em>. Wie der Name schon vermuten lässt, werden so dann die am längsten nicht benutzen Objekte aus dem Cache entfernt. Bei GDSF, was <em>Greedy-Dual-Size-Frequency </em>heißt, werden die Objekte priorisiert. Die Priorisierung wird daran festgelegt wie Aufwändig eine Neu-Anfrage wäre und wie groß das Objekt ist. Objekte mit niedriger Priorität werden dann aus dem Cache entfernt.</p>
<p style="text-align: justify;">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/06/apache-cache-funktionen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>virt-install.sh</title>
		<link>http://www.zero0ne.de/2011/06/virt-install-sh/</link>
		<comments>http://www.zero0ne.de/2011/06/virt-install-sh/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 21:08:15 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[virt-install]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2195</guid>
		<description><![CDATA[Hier mal ein kleines nützliches Skript zum erstellen von KVM-VMs. Beim Aufrufen lässt sich der Name, der RAM und die Festplattengrösse setzen. Der Rest wird vorbelegt. Dann brauch mann nicht immer soviel tippen und kann einfach ein Skript auffrufen. So sich dann vllt auch einen Mechanismus für &#8220;on-demand&#8221; VM deployment bauen. Hier nun also das Skript: #!/bin/bash NAME=$1 RAM=$2 [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hier mal ein kleines nützliches Skript zum erstellen von KVM-VMs. Beim Aufrufen lässt sich der Name, der RAM und die Festplattengrösse setzen. Der Rest wird vorbelegt. Dann brauch mann nicht immer soviel tippen und kann einfach ein Skript auffrufen. So sich dann vllt auch einen Mechanismus für &#8220;on-demand&#8221; VM deployment bauen.</p>
<p><span id="more-2195"></span></p>
<p>Hier nun also das Skript:</p>
<blockquote><p>#!/bin/bash<br />
NAME=$1<br />
RAM=$2<br />
HDD=$3</p>
<p>&nbsp;</p>
<p>virt-install &#8211;connect qemu:///system -n $NAME -r $RAM -vcpus=1 \<br />
-f /var/lib/libvirt/images/$NAME.img -s $HDD \<br />
&#8211;network=bridge:vibr0  &#8211;vnc &#8211;accelerate -v \<br />
-c /var/lib/libvirt/images/ISOs/Fedora-15-x86_64-DVD.iso \<br />
&#8211;os-type=linux &#8211;noautoconsole</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/06/virt-install-sh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>danbooru auf Ubuntu 10.4 LTS installieren</title>
		<link>http://www.zero0ne.de/2011/04/danbooru-auf-ubuntu-10-4-lts-installieren/</link>
		<comments>http://www.zero0ne.de/2011/04/danbooru-auf-ubuntu-10-4-lts-installieren/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 14:08:09 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[10.4]]></category>
		<category><![CDATA[danbooru]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[LTS]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Skript]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[unicorn]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2070</guid>
		<description><![CDATA[Wer ein wenig in der Anime-Szene unterwegs ist wird die zahlreichen Image-Boards kennen. Ein bekanntes und doch recht beliebtes System ist dabei Danbooru (link). Danbooru ist Community und System zu gleich. Es ist sehr umfangreich und bietet viele funktionen, wie z.B. automatisches Rezise von grossen Bildern. Doch gilt es auch als sehr schwer zu installieren. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Wer ein wenig in der Anime-Szene unterwegs ist wird die zahlreichen Image-Boards kennen. Ein bekanntes und doch recht beliebtes System ist dabei Danbooru (<a href="http://danbooru.donmai.us">link</a>). Danbooru ist Community und System zu gleich. Es ist sehr umfangreich und bietet viele funktionen, wie z.B. automatisches Rezise von grossen Bildern. Doch gilt es auch als sehr schwer zu installieren. Es ist nämlich keine simple PHP-Anwendung die man in sein Doc-Root kopiert und dann starten kann. <span id="more-2070"></span>Nein, Danbooru baut auf Rails auf und bietet dadurch eine Menge mehr. Doch leider ist es etwas schlecht dokumentiert. Und was Dokumentiert ist, ist veraltet. Ich wollte nun den aktuelle Trunk auf dem aktuellen Ubuntu LTS installieren. Das Klappte an sich von der installation her auch. Doch gab es dann im anschluss ein DB Problem, welches ich bis jetzt noch nicht lösen konnte. Mit Version 1.16.0 von Danbooru klappt allerdings alles! So lässt es sich ohne Probleme auf Ubuntu installieren. Mann muss nur darauf achten, das man keine zu Neue Rails-Version nimmt, da es sonst wieder knallt. Ich hab nun alles mit Rails 2.2.2 installiert. Der aufbau sieht dabei so aus, das Ich danbooru mit Rails betreibe, als Webserver Unicorn in Verbindung mit memcache nehme und das ganze über einen Nginx-Proxy laufen lasse.</p>
<p style="text-align: justify;">Damit das alles ein wenig leichter zu installieren ist, hab ich mich an dem veralteten INSTALL.debian Skript von Danbooru orientiert und hier und da was ergänz oder abgeändert.</p>
<p>#### http://tech.tomgoren.com/archives/245<br />
#### http://animebsd.net/archives/2528<br />
#### http://trac.donmai.us/browser/danbooru/trunk/INSTALL.debian</p>
<p>als Download: <a href="http://www.zero0ne.de/blog/wp-content/uploads/2011/04/INSTALL.debian.txt">INSTALL.debian</a></p>
<p>Hier das install script:<br />
<code>#!/bin/bash</code></p>
<p><code>#### http://tech.tomgoren.com/archives/245<br />
#### http://animebsd.net/archives/2528<br />
#### http://trac.donmai.us/browser/danbooru/trunk/INSTALL.debian</code></p>
<p><code>#### root@danbooru:/var/www/danbooru# vim app/models/post_methods/file_methods.rb<br />
#### sftp albert maskieren</p>
<p>if [ $USER != root ] ; then<br />
echo "You must run this script as root"<br />
exit 1<br />
fi</p>
<p>echo "Danbooru Install"<br />
echo "This script will install Ruby, Rails, PostgreSQL, Unicorn, and Nginx. By the end,"<br />
echo "you should be able to connect to the server and create an account."<br />
echo<br />
echo "It will create a new user called danbooru which will run the Danbooru"<br />
echo "processes. It will download the latest trunk copy or v1.16.0 and install it in"<br />
echo "/var/www/danbooru. It will run unicorn, starting on port 8050"<br />
echo<br />
echo<br />
echo -n "Enter the hostname for this server (ex: danbooru.donmai.us): "<br />
read hostname</p>
<p>if [ -z $hostname ] ; then<br />
echo "Must enter a hostname"<br />
exit 1<br />
fi</p>
<p>echo -n "Enter a name for the site (default: Danbooru): "<br />
read sitename</p>
<p>if [ -z $sitename ] ; then<br />
sitename=Danbooru<br />
fi</p>
<p>echo -n "Enter a path for danbooru (default: /var/www/danbooru): "<br />
read danboorupath</p>
<p>if [ -z $danboorupath ] ; then<br />
danboorupath="/var/www/danbooru"<br />
fi</p>
<p>echo -n "Which danbooru version? [trunk, 1.16.0, 1.18.0]"<br />
read danbooruversion</p>
<p>if [ -z $danbooruversion ] ; then<br />
danbooruversion="1.16.0"<br />
fi</p>
<p># Install packages<br />
echo "install required packages via apt-get"<br />
apt-get -qq -y install sudo gcc g++ make libreadline5-dev zlib1g-dev flex bison libgd2-noxpm libgd2-noxpm-dev bzip2 postgresql-8.4 postgresql-contrib-8.4 libpq-dev ruby ruby1.8-dev ri irb rdoc rubygems ragel memcached libmemcache-dev subversion nginx rake libopenssl-ruby libxml2-dev libxslt-dev byobu vim htop</p>
<p># Install Ruby gems<br />
echo "install Ruby/Rails/Unicorn"</p>
<p>gem install hoe --version=2.2.0 --no-ri --no-rdoc</p>
<p>for i in postgres diff-lcs html5 unicorn memcache-client aws-s3 json mechanize net-sftp sys-cpu ; do gem install $i --no-ri --no-rdoc ; done</p>
<p>gem install rails --version=2.2.2 --no-ri --no-rdoc</p>
<p># Create user account<br />
echo "create danbooru user, allow db access"</p>
<p>useradd -m danbooru<br />
PG_HBA_FILE="/etc/postgresql/8.4/main/pg_hba.conf"<br />
echo "local    all         postgres,danbooru                              trust" &gt; $PG_HBA_FILE<br />
echo "host     all         postgres,danbooru          127.0.0.1/32        trust" &gt;&gt; $PG_HBA_FILE</p>
<p>if [ -f /etc/init.d/postgresql-8.4 ]; then /etc/init.d/postgresql-8.4 restart; else /etc/init.d/postgresql restart; fi</p>
<p># Install Danbooru<br />
cd /var/www</p>
<p>echo "installing danbooru source"</p>
<p>case "$danbooruversion" in<br />
1.16.0)<br />
echo "installing version: 1.16.0"<br />
svn export svn://donmai.us/danbooru/tags/danbooru-1.16.0 danbooru<br />
;;<br />
1.18.0)<br />
echo "installing version: 1.18.0"<br />
svn export svn://donmai.us/danbooru/tags/danbooru-1.18.0 danbooru<br />
;;<br />
trunk)<br />
echo "installing version: trunk"<br />
svn export svn://donmai.us/danbooru/trunk danbooru<br />
;;<br />
tar16)<br />
echo "deflating tgz danbooru-1.16.0.tgz"<br />
tar xfz /tmp/danbooru-1.16.0.tgz -C /var/www<br />
;;<br />
tar18)<br />
echo "deflating tgz danbooru-1.18.0.tgz"<br />
tar xfz /tmp/danbooru-1.18.0.tgz -C /var/www<br />
;;<br />
esac</p>
<p>chown -R danbooru:danbooru danbooru<br />
cd danbooru<br />
mkdir -p public/data/sample<br />
cd config<br />
cp database.yml.example database.yml<br />
cp local_config.rb.example local_config.rb<br />
sed -i -e "s/DAN_HOSTNAME/$hostname/g" local_config.rb<br />
sed -i -e "s/DAN_SITENAME/$sitename/g" local_config.rb<br />
cd ../lib/danbooru_image_resizer<br />
ruby extconf.rb<br />
make<br />
cd ../..</p>
<p>### Database anlegen<br />
echo "installing danbooru database"</p>
<p>sudo -u postgres createuser -s danbooru<br />
sudo -u danbooru createdb danbooru<br />
sudo -u danbooru createdb danbooru_dev<br />
sudo -u danbooru createdb danbooru_test<br />
sudo -u danbooru psql danbooru &lt; db/postgres.sql<br />
sudo -u danbooru psql danbooru_dev &lt; db/postgres.sql<br />
sudo -u danbooru psql danbooru_test &lt; db/postgres.sql if [ "$danbooruversion" = "1.18.0" || "$danbooruversion" = "trunk" ]; then 	echo "initialising database" 	 	script/db-init.sh 	script/db-init.sh 	script/db-init.sh 	 	#### app/controller/application_controller in application umbenenen 	mv app/controllers/application_controller.rb app/controllers/application.rb 	#### config/envirnment.rb anpassen. ruby version rausnehmen 	sed -i -e "/^RAILS_GEM_VERSION/d" config/environment.rb 	### middle ware entfernen 	sed -i -e "/^config.middleware.use/d" config/environments/development.rb fi echo "initialising production database" sudo -u danbooru RAILS_ENV=production rake db:migrate # Set up nginx echo "generating nginx danbooru conf" nginx_danbooru_conf="/etc/nginx/sites-enabled/danbooru.conf" echo 'server {' &gt; $nginx_danbooru_conf<br />
echo '  listen 80;' &gt;&gt; $nginx_danbooru_conf<br />
echo "  server_name $hostname;" &gt;&gt; $nginx_danbooru_conf<br />
echo '  location ~ /\.svn { deny all; }' &gt;&gt; $nginx_danbooru_conf<br />
echo '  location / {' &gt;&gt; $nginx_danbooru_conf<br />
echo "    root $danboorupath/public;" &gt;&gt; $nginx_danbooru_conf<br />
echo '    try_files $uri /maintenance.html @danbooru;' &gt;&gt; $nginx_danbooru_conf<br />
echo '    client_max_body_size 30m;' &gt;&gt; $nginx_danbooru_conf<br />
echo '    expires max;' &gt;&gt; $nginx_danbooru_conf<br />
echo '  }' &gt;&gt; $nginx_danbooru_conf<br />
echo '  location @danbooru {' &gt;&gt; $nginx_danbooru_conf<br />
echo '    proxy_set_header X-Real-IP $remote_addr;' &gt;&gt; $nginx_danbooru_conf<br />
echo '    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' &gt;&gt; $nginx_danbooru_conf<br />
echo '    proxy_set_header Host $http_host;' &gt;&gt; $nginx_danbooru_conf<br />
echo '    proxy_redirect off;' &gt;&gt; $nginx_danbooru_conf<br />
echo '    proxy_pass http://127.0.0.1:8050;' &gt;&gt; $nginx_danbooru_conf<br />
echo '  }' &gt;&gt; $nginx_danbooru_conf<br />
echo '}' &gt;&gt; $nginx_danbooru_conf</p>
<p>/etc/init.d/nginx restart</p>
<p>### unicorn config file<br />
echo "generating unicorn danoobru conf"</p>
<p>mkdir /etc/unicorn<br />
unicorn_conf="/etc/unicorn/danbooru.conf"<br />
echo "RAILS_ROOT=$danboorupath" &gt; $unicorn_conf<br />
echo "RAILS_ENV=production" &gt;&gt; $unicorn_conf</p>
<p>### unicorn danbooru-config file<br />
echo "generating danbooru unicorn conf"</p>
<p>danbooru_unicorn_conf="$danboorupath/config/unicorn.rb"<br />
echo "app_path = \"$danboorupath\"" &gt; $danbooru_unicorn_conf<br />
echo -n &gt;&gt; $danbooru_unicorn_conf<br />
echo 'listen 8050' &gt;&gt; $danbooru_unicorn_conf<br />
echo 'worker_processes 2' &gt;&gt; $danbooru_unicorn_conf<br />
echo 'pid "#{app_path}/tmp/pids/unicorn.pid"' &gt;&gt; $danbooru_unicorn_conf<br />
echo 'stderr_path "#{app_path}/log/unicorn.log"' &gt;&gt; $danbooru_unicorn_conf<br />
echo 'stdout_path "#{app_path}/log/unicorn.log"' &gt;&gt; $danbooru_unicorn_conf</p>
<p>### unicron init skript<br />
echo "downloading unicorn init skript"</p>
<p>unicorn_rails_path="/var/lib/gems/1.8/bin/unicorn_rails"<br />
cd /etc/init.d/<br />
wget http://tech.tomgoren.com/wp-content/uploads/unicorn_init.gz<br />
gunzip unicorn_init.gz<br />
sed -i -e "s|/usr/local/bin/unicorn_rails|$unicorn_rails_path|g" unicorn_init<br />
chmod +x unicorn_init<br />
/etc/init.d/unicorn_init start</p>
<p></code></p>
<p>&nbsp;</p>
<p><code>echo<br />
echo<br />
echo<br />
echo "I'm done!"<br />
echo "You should probably set the password for the danbooru account (run passwd danbooru)."</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/04/danbooru-auf-ubuntu-10-4-lts-installieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache &#8211; Tomcat: Tomcat-Worker Verwendung in VHosts</title>
		<link>http://www.zero0ne.de/2011/02/apache-tomcat-tomcat-worker-verwendung-in-vhosts/</link>
		<comments>http://www.zero0ne.de/2011/02/apache-tomcat-tomcat-worker-verwendung-in-vhosts/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 09:25:11 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Stuff]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[VirtualHost]]></category>
		<category><![CDATA[worker]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2015</guid>
		<description><![CDATA[Hat man nun alles dementsprechende konfiguriert, kann man in jeden X-beliebigen VHost darauf zugreifen. Dazu gibt man entweder „jkmount“ an, um Pfade auf einen Tomcat-Worker/Balancer zu lenken oder „jkunmount“ um bestimmt Pfade genau davon auszuschließen. Bei den Mount-Direktiven kann man Pfade, Dateien, Dateipfade oder Pattern angeben. Man kann also sagen „jkmount / WorkerName“ um alles [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hat man nun alles dementsprechende konfiguriert, kann man in jeden X-beliebigen VHost darauf zugreifen. Dazu gibt man entweder „<strong>jkmount</strong>“ an, um Pfade auf einen Tomcat-Worker/Balancer zu lenken oder „<strong>jkunmount</strong>“ um bestimmt Pfade genau davon auszuschließen. Bei den Mount-Direktiven kann man Pfade, Dateien, Dateipfade oder Pattern angeben. Man kann also sagen „<strong>jkmount / WorkerName</strong>“ um alles dieser Domain ab dem Root auf den Tomcat „<strong>WorkerName</strong>“ zu lenken. Also die Syntax ist bei beiden Direktiven immer gleich „<strong>Kommando Pattern Tomcat</strong>“. Möglich wäre also z.B. auch „<strong>jkmount /cms/*.html WorkerName</strong>“ und „<strong>jkunmount /*.php</strong>“. Das erst besagt, das alle Requests auf HTMLs unterhalb von „<strong>/cms</strong>“ an dem Tomcat gesendet werden sollen und das andere, das alle Requests auf PHP-Dateien nicht an an den Tomcat gesendet werden.</p>
<p style="text-align: justify;">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/02/apache-tomcat-tomcat-worker-verwendung-in-vhosts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache &#8211; Tomcat: mod_jk.conf</title>
		<link>http://www.zero0ne.de/2011/02/apache-tomcat-mod_jk-conf/</link>
		<comments>http://www.zero0ne.de/2011/02/apache-tomcat-mod_jk-conf/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 09:22:25 +0000</pubDate>
		<dc:creator>zer(o_0)ne</dc:creator>
				<category><![CDATA[Stuff]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[konfiguration]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://www.zero0ne.de/?p=2011</guid>
		<description><![CDATA[In der mod_jk.conf (manchmal auch nur jk.conf) kann man noch zusätzliche Parameter setzen um das Verhalten des Moduls zu beeinflussen. Unter anderem wird hier festgelegt wo das „jk-workers-properties“-File liegt. Dies kann man hier nämlich mit dem Parameter „JkWorkersFile“ festlegen. JkShmFile beschreibt wo die Datei für den „shared memory“ für Balancer ist. Dies wird benutzt damit [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">In der mod_jk.conf (manchmal auch nur jk.conf) kann man noch zusätzliche Parameter setzen um das Verhalten des Moduls zu beeinflussen. Unter anderem wird hier festgelegt wo das „<strong>jk-workers-properties</strong>“-File liegt. Dies kann man hier nämlich mit dem Parameter „<strong>JkWorkersFile</strong>“ festlegen. JkShmFile beschreibt wo die Datei für den „<strong>shared memory</strong>“ für Balancer ist. Dies wird benutzt damit der Balancer seine Worker dirigieren kann. Sollte laut Doku nicht auf einen NFS-Share liegen. Normalerweise liegt es immer unter „<strong>/var/log/apache2/</strong>“. Weiterhin kann man sonst noch festlegen wo die eigentliche log-Datei liegen soll. Deren Log-Level und das Logformat lässt sich auch noch festlegen. Abschließend kann man mit „<strong>JkOptions</strong>“ noch verschiedene Optionen zur Kompatibilität zwischen Apache und Tomcat setzten. Zum Beispiel das der SSL- Header mit gesendet werden soll oder wir URIs weitergegeben werden.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zero0ne.de/2011/02/apache-tomcat-mod_jk-conf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

