Bei meiner Recherche zum Thema CI Server und PHP bin ich über ein interessantes Problem gestolpert, dass nicht nur mich beschäftigt hat. Eine Kollegin ist hier auch auf die Nase gefallen und daher gibt es hier im Vorfeld schon mal eine kleine Beschreibung. Die CI Server CruiseControl und Hudson sind in Java geschrieben und bei beiden ist folgendes Verhalten aufgefallen. Man startet den Server und er ist nicht erreichbar bzw. findet sich selbst nicht, wie dies im Fall von CruiseControl passiert ist. Fehlermeldungen (bzw Exceptions) mit der Aussage „Network unreachable“ sind hier aufzufinden. Aufgetreten ist es bei mir unter Debian Squeeze und ich weiß, dass es zumindest bei CentOs auch der Fall ist.
Also man hat den Server gestartet und dieser wird nicht gefunden. Nun schaut man mit netstat nach, ob er denn läuft und an welche Adresse er gebunden ist.
netstat -tulpen
Es stellt sich heraus, dass alles eigentlich okay ist, der Java Prozeß aber auf einer IPv6 Adresse hört. In einem IPv4 Netzwerk ist dies kontraproduktiv. Nun stellt sich die Frage wieso tut er dies und was kann man dagegen tun. Die 2. Frage lässt sich relativ leicht beantworten:
vi /etc/sysctl.d/bindv6only.conf
Findet man hier den Eintrag net.ipv6.bindv6only = 1
, dann hat man das Problem schon gefunden. Hier ändert man den Wert auf 0
und macht die Änderung publik.
invoke-rc.d procps restart
Nach einem Neustart der Java-Anwendung funktioniert alles, wie man es erwartet.
Das Verhalten scheint ein Problem von Java zu sein. Es gibt einen Bug-Report bei Debian und dort wird auch die Variante beschrieben ein Parameter beim Aufruf der VM zusetzen. Vielleicht ist dieses Parameter der schönere Weg, für meine Tests ist das Ändern der Kernel Konfiguration schneller und universeller, da ich nur an einer Stelle ins System eingreifen muss.