Nginx im Parallelbetrieb IPv4 und IPv6

Auf folgenden Fehler kann man treffe, wenn man Nginx dazu überreden möchte sowohl IPv4 als auch IPv6 Verbindungen zu akzeptieren.


2013/04/18 09:02:40 [emerg] 2626#0: bind() to [::]:443 failed (98: Address already in use)
2013/04/18 09:02:40 [emerg] 2626#0: bind() to [::]:80 failed (98: Address already in use)
2013/04/18 09:02:40 [emerg] 2626#0: bind() to [::]:443 failed (98: Address already in use)
2013/04/18 09:02:40 [emerg] 2626#0: bind() to [::]:80 failed (98: Address already in use)
2013/04/18 09:02:40 [emerg] 2626#0: bind() to [::]:443 failed (98: Address already in use)
2013/04/18 09:02:40 [emerg] 2626#0: bind() to [::]:80 failed (98: Address already in use)
2013/04/18 09:02:40 [emerg] 2626#0: bind() to [::]:443 failed (98: Address already in use)
2013/04/18 09:02:40 [emerg] 2626#0: bind() to [::]:80 failed (98: Address already in use)
2013/04/18 09:02:40 [emerg] 2626#0: bind() to [::]:443 failed (98: Address already in use)
2013/04/18 09:02:40 [emerg] 2626#0: bind() to [::]:80 failed (98: Address already in use)
2013/04/18 09:02:40 [emerg] 2626#0: still could not bind()

Ausgelöst wird er durch die Dopplung der “listen” Anweisung in der Seiten-Konfiguration. Da zwei Anweisungen jeweils versuchen den gleichen Port zu binden.

Für HTTPS:

listen 443;
listen [::]:443;

Für HTTP:

listen 80;
listen [::]:80;

Möchte man die Dopplung beibehalten, dann sollte man bei der “IPv6″-Anweisung ein ipv6only=on anhängen. Also:

Für HTTPS:

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

Für HTTP:

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

Man kann die erste (vermeintliche) IPv4 Anweisung entfernen und der Webserver ist trotzdem auch über IPv4 erreichbar.

Für HTTPS:

listen [::]:443;

Für HTTP:

listen [::]:80;

Dort muss man dann aber wieder das “ipv6only=on” entfernen, da sonst keine IPv4 Verbindungen akzeptiert würden. Der einzige Unterschied, den ich zwischen den Varianten mit Dopplung und ohne festgestellt habe, war das Format der IP-Adressen in den Zugriffs Logfiles. So wird bei der Dopplung die IPv4 Adresse als klassische v4-Adresse angezeigt und die IPv6 Adresse als gewöhnliche v6-Adresse, während ohne Dopplung die v4-Adresse in das v6-Schema umwandelt.

Tastaturprobleme Virt-Manager und OSX

Nachdem ich vor ein paar Tagen meinen Heimserver neu aufgesetzt habe und nun den Virt-Manager unter OSX mittels X11 Forwarding nutze, hatte ich ein lustiges Problem. Alles funktionierte einwandfrei, bis es zum Installieren eines Gastsystems kam. Die Tastatureingaben wurden einfach ignoriert und es wurde ein ganz anderes Tastaturlayout benutzt. Durch Zufall habe ich heraus gefunden, dass “Enter” auf der “8″ liegt und “j” auf “Enter”. Für die Installation und konfiguration eines Gastsystems ist das ein untragbarere Zustand. Der Fehler wird durch den internen VNC Dienst verursacht und lässt sich, vergleichsweise einfach beheben.

Man kann mittels

virsh edit $domain

die Konfiguration aufrufen und fügt dort in der Zeile

    <graphics type='vnc' port='-1' autoport='yes'/> 

ein keymap=’de’ hinzu. Sodass wir nun die Zeile

    <graphics type='vnc' port='-1' autoport='yes' keymap='de'/>

haben. Nachdem die VM dann neu gestartet wurde, ist die Tastaturbelegung korrekt.

In den neueren Versionen von Virt-Manager kann man nun auch in der grafischen Oberfläche diese Einstellung vornehmen.

X11 Forwarding forwarden

Mit X11-Forwarding kann man grafische Anwendungen auf einem remote Rechner starten und die Anzeige über SSH tunneln. Dies funktioniert aber nur für den User, mit dem man sich per ssh anmeldet. Wenn man sich also per

ssh -X norbert@beispielserver.de

verbindet, kann der User “norbert” das Forwarding nutzen. Wechselt man, z.B. per su, zum root User, bekommt man die Meldung

X11 connection rejected because of wrong authentication.

Um die Rechte für das Forwarding zu übergeben kann man einfach die .Xauthority kopieren:

cat /home/norbert/.Xauthority > /root/.Xauthority

und schon kann root grafische Anwendungen darstellen.

Nginx Webserver Konfiguration überprüfen

Nachdem ich bereits bei Lighttpd gezeigt hab, wie man die Konfiguration überprüfen kann , möchte ich euch nun zeigen, wie das ganze bei dem Webserver Nginx funktioniert.

Dieser Befehl ermöglicht es uns eine bestimmte Konfigurationsdatei zu testen.

nginx -t -c /etc/nginx/conf.d/*.conf

Möchte man die komplette Konfiguration testen hat man auch die Möglichkeit

/etc/init.d/nginx configtest

auszuführen. Die oben genannten Befehle funktionieren einwandfrei bei Debian Squeeze und Nginx 1.2.4.

C: Array Schreibweise

Wir nehmen an, wir haben ein Array: int a[5]; Will man an letzter Stelle einen Wert speichern, nutzt man die allgemein bekannte Schreibweise a[4] = 42; doch in c gibt es die Besonderheit, dass man auch 4[a] = 42; schreiben kann. Beides führt zum selben Ergebnis. Beweis:

a[4] <=> *(a+4) <=> *(4+a) <=> 4[a]

Dies funktioniert natürlich auch mit mehrdimensionalen Arrays int a[5][5];
Normal a[4][4] = 42; alternativ: 4[4[a]] = 42;
Beweis:

*(*(a+4)+4) = 42; <=>
*(*(4+a)+4) = 42; <=>
*(4+*(4+a)) = 42; <=>
*(4+4[a]) = 42; <=>
4[4[a]] = 42;

Brandenburger Linux-Infotag 2012

Am kommenden Samstag, den 03.11.2012 findet in Potsdam der 9. Brandenburger Linux-Infotag (BLIT) statt. Dieses Jahr steht die Veranstaltung unter dem Motto “Freie Software macht Schule”. Behandelt aber in den Vorträgen nicht nur Themen rund um OpenSource in der Bildung, sondern bietet ein relativ breites Programm. Der Eintritt ist kostenlos.

Aller Voraussicht nach werde ich dort auch anzutreffen sein. Für Studenten an Berliner Hochschulen ist die Anfahrt nach Potsdam mit dem öffentlichen Nahverkehr im Semesterticket einbegriffen. Wer ist noch dabei?

C: pthread Speicherleck, oder?

Wer schonmal mit pthread gerarbeitet hat, hatte sicher schonmal das Problem mit dem “Speicherleck”.
Ein normaler Aufruf

pthread_create(&t1, NULL, doSomething, NULL);

startet einen Thread der etwas macht. Ein neur Thread braucht natürlich Speicher, soweit alles klar, doch was geschieht, wenn der Thread seine Arbeit verrichtet hat? Und hier tritt meistens das Problem auf, denn ein Thread der mit seiner Arbeit fertig ist, löscht sich nicht aus dem Speicher. Dies dient dazu, um im Hauptprogramm noch auf den Thread zuzugreifen zu können um einen Status oder dergleichen abzufragen. Damit die Daten nicht verloren gehen, verbleiben sie im Speicher. Jetzt kann man sich leicht vorstellen, dass man mehr Speicher verbraucht wenn man mehr Threads startet.
Wenn man also mit vielen Threads arbeiten will, sollte man sich überlegen, ob man nach deren Ende noch Informationen von eben diesen braucht. Wenn dies der Fall ist sollte man sie sowieso mittels

pthread_join(t1);

mit dem main Thread verknüpfen. Soll der Speicher aber einfach wieder freigegeben werden, kann man den Thread an

pthread_detach(t1);

übergeben oder direkt mit dem detached Attribut starten:

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_t t1;
int rc = pthread_create(&t1, &attr, action, NULL);

Facebook Button und der Datenschutz

Facebook und der Datenschutz sind zwei Themengebiete, die immer wieder kollidieren und auch, wenn diese Problematik für kurze Zeit immer mal wieder den Weg in die öffentliche Wahrnehmung und den Diskurs schafft, wird dem, meiner Meinung nach, nicht genug Beachtung geschenkt. Als Betreiber von einigen Webseiten und Blogs sehe ich mich einem Zwiespalt gegenüber. Auf der einen Seite bringen die Sozialen Netzwerke guten (und oft auch hochwertigen) Traffic, auf der anderen Seite, bindet man für den Facebook Like Button, zum Beispiel, externen Code und/oder Grafiken ein. So hat der Besucher kaum eine Chance zu intervenieren und seine Besuche werden direkt geloggt.

Will man das? Oder will man seinen Lesern die Chance geben selber zu entscheiden? Ich entscheide mich da lieber für Letzteres und wir haben seit einigen Tagen die 2-Wege-Lösung hier eingebaut. Heise Online hat’s vorgemacht.

Nebenbei (und das dürfte die SEOs aufhorchen lassen) wirkt sich das Ganze mitunter auch ziemlich positiv auf die Ladezeiten aus, weil nicht erst Inhalte von externen Servern geladen werden müssen.

Unter WordPress kann man sich äußerst komfortable das 2-Clicks-Social-Media-Plugin herunterladen. Neben Facebook werden auch Twitter, Google+, Flattr und die anderen üblichen Verdächtigen unterstützt.

Kernel bauen

Wenn man einen aktuellen Kernel verwenden will, muss man sich ihn selber bauen. Dies ist garnicht so schwer wie es klingt. Den Kernel gibts von http://www.kernel.org/ und mit den folgenden Schritten kann man ihn kompilieren und installieren:

Zuerst brauchen wir ein paar Pakete:

apt-get install wget tar bzip2 build-essential libncurses-dev kernel-package fakeroot

In unser Verzeichnis wechseln:

cd /usr/src/

Den aktuellen stabilen Kernel herunterladen:

wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.6.2.tar.bz2

Entpacken:

tar jxvf linux-3.6.2.tar.bz2

Die aktuelle Kernelkonfiguration vom System kopieren:

cp /boot/config-$(uname -r) /usr/src/linux-3.6.2/.config

Den neuen Kernel entsprechend Konfigurieren:

cd linux-3.6.2; make menuconfig

Aufräumen:

make-kpkg clean

Dieser Schritt dauert am längsten, hier wird der Kernel gebaut und als .deb Datei gespeichert:

fakeroot make-kpkg --initrd --revision=1.0.custom kernel_image

Wenn man diese Schritte durchgeführt hat, hat man entsprechend der Architektur das Paket:

../linux-image-3.6.2_1.0.custom_i386.deb

oder

../linux-image-3.6.2_1.0.custom_amd64.deb

Diese kann man dann einfach per

dpkg -i ../linux-image-3.6.1_1.0.custom_amd64.deb

installieren

Wenn alles geklappt hat, braucht man nur noch neustarten und kann den selbst gebauten Kernel verwenden.

Server Porn

Seit einigen Tagen geistern nun ja bereits verschiedene Fotos aus den großen Rechenzentren von Google durch die verschiedenen Weblogs.

Die verschiedenen Links findet man alle auf der “Data Center” Seite von Google. Unter Anderem gibt es dort auch eine StreetView Tour durch das Rechenzentrum in Lenoir.

Wer sich im Allgemeinen für solche Fotos und Blicke hinter den Kulissen begeistern kann, ist auf dieser Seite auch ganz gut aufgehoben. Der Anspruch dort besteht darin, jeden Tag interessante Bilder aus den Rechenzentren dieser Welt zu veröffentlichen. Auch, wenn es hier nicht ganz so spektakulär aufbereitet ist, wie bei Google, dürfte es doch alle Technikbegeisterten interessieren. Gefunden habe ich das bereits vor ein paar Tagen beim Rackblogger und fand es zu schön, um es für mich zu behalten.