Heute hat Hosteurope den Beta-Test für IPv6 gestartet, was ich natürlich sofort aktiviert habe. Leider hat mein nginx mich auch gleich nicht so recht gemocht, als ich statt

listen 80;

dann eine Zeile hinzugefügt hatte, wodurch sich das wie folgt gelesen hatte:

listen 80; listen [::]:80;

Nginx meldete sich mit den folgenden Fehlern:

1
2
3
4
5
6
7
8
Starting nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful
[emerg]: bind() to [::]:80 failed (98: Address already in use)
[emerg]: bind() to [::]:80 failed (98: Address already in use)
[emerg]: bind() to [::]:80 failed (98: Address already in use)
[emerg]: bind() to [::]:80 failed (98: Address already in use)
[emerg]: bind() to [::]:80 failed (98: Address already in use)
[emerg]: still could not bind()

Dieser Artikel ist Teil einer Reihe zum Webserver nginx. Schau dir auch die anderen Artikel an: Zum Leitartikel

Dafür gibts natürlich eine Lösung und die fand sich über einen Debian-Bug  auf der Maillingliste von nginx .

Die Direktive kann wie folgt lauten:

listen 80; listen [::]:80 default ipv6only=on;

Damit geht ipv6 nur für diesen Host, da es nur einmal die Direktive “default” geben darf. Versucht man bei weiteren Hosts ipv6 zu aktivieren, stößt man wieder auf das eingangs genannte Problem. Hintergrund ist, dass ipv6only unter Linux-Systemen per Default in der sysctl-Konfiguration nicht aktiviert ist. Hierfür gibt es zwei Wege zur Abhilfe, ich bin ersteren gegangen:

1. Ersetzen aller listen-Direktiven

Um für alle Hosts ipv6 zu aktivieren, muss man einfach nur alle wie folgt lautenden Direktiven:

listen 80;

durch die folgende ersetzen:

listen [::]:80;

Hat man nicht alle ersetzt, kommt das eingangs erwähnte Problem.

2. Aktivierung von ipv6only in sysctl

Aktiviert man ipv6only in der sysctl-Konfiguration des Systems, so kann es wie folgt für einzele Hosts eingetragen werden:

listen 80; listen [::]:80 ipv6only=on;

Die Aktivierung geht wie folgt: Editiere die /etc/sysctl.conf und setze die Konfiguration von net.ipv6.bindv6only auf 1. Per Default (wenn nicht vorhanden oder ausgeklammert) ist 0 vorgegeben. Schlussendlich muss also:

net.ipv6.bindv6only = 1

eingetragen sein. Da dieser Eintrag erst nach einem Reboot aktiv wäre, setzen wir ihn nun zur laufzeit:

sysctl -w net.ipv6.bindv6only="1"