Archiv des Autors: David Scherfgen

Node.js-Modul „ffi“ zum Laufen bringen

Mit frisch installiertem node.js und Paketmanager npm hatte ich gerade einen seltsamen Fehler, als ich das Paket ffi installieren und benutzen wollte (mit diesem Paket kann man native Funktionen aus node.js heraus aufrufen):

> require("ffi")
Error: Could not locate the bindings file. Tried:
 → /home/david/node_modules/ffi/node_modules/ref/build/binding.node
 → /home/david/node_modules/ffi/node_modules/ref/build/Debug/binding.node
 → /home/david/node_modules/ffi/node_modules/ref/build/Release/binding.node
 → /home/david/node_modules/ffi/node_modules/ref/out/Debug/binding.node
 → /home/david/node_modules/ffi/node_modules/ref/Debug/binding.node
 → /home/david/node_modules/ffi/node_modules/ref/out/Release/binding.node
 → /home/david/node_modules/ffi/node_modules/ref/Release/binding.node
 → /home/david/node_modules/ffi/node_modules/ref/build/default/binding.node
 → /home/david/node_modules/ffi/node_modules/ref/compiled/0.6.12/linux/x64/binding.node
    at bindings (/home/david/node_modules/ffi/node_modules/bindings/bindings.js:88:9)
    at Object. (/home/david/node_modules/ffi/node_modules/ref/lib/ref.js:5:47)
    at Module._compile (module.js:441:26)
    at Object..js (module.js:459:10)
    at Module.load (module.js:348:32)
    at Function._load (module.js:308:12)
    at Module.require (module.js:354:17)
    at require (module.js:370:17)
    at Object. (/home/david/node_modules/ffi/lib/ffi.js:6:11)
    at Module._compile (module.js:441:26)

Aha, es fehlt also irgendeine komische „Bindings-Datei“. Um den Fehler zu beheben, braucht man das Paket node-gyp, das einfach mit npm install -g node-gyp global installiert werden kann.

Nun muss man das Tool node-gyp an zwei verschiedenen Stellen aufrufen, damit diese Bindings-Datei erzeugt wird, nämlich einmal im Verzeichnis ffi selbst und einmal in ffi/node_modules/ref:

david@webserver:~# cd node_modules/ffi/
david@webserver:~/node_modules/ffi# node-gyp rebuild
[...]
david@webserver:~/node_modules/ffi# cd node_modules/ref/
david@webserver:~/node_modules/ffi/node_modules/ref# node-gyp rebuild
[...]

Anschließend sollte das ffi-Modul korrekt geladen werden können.

Libvirt vergisst Memory Unit

Gestern Nacht habe ich viele Stunden mit einem im Nachhinein ziemlich dämlichen Problem verbracht. Meine virtuelle Maschine wollte nach einem Neustart nicht mehr booten, GRUB erzählte zunächst etwas von „Error 15: File not found“ und später nach meinen vergeblichen Reparaturversuchen dann „Error 28: Selected item cannot fit into memory„.

Zum Glück hat mich diese zweite Fehlermeldung auf die richtige Fährte gebracht. Die virtuelle Maschine hatte plötzlich nur noch 16 KiB(!) RAM, und da ist es ja kein Wunder, dass sie nicht booten mochte. Sofort habe ich mir die XML-Definition der virtuellen Maschine anzeigen lassen und las dann Folgendes:

<domain type='kvm'>
 <name>webserver</name>
 <memory>16</memory>
 <currentMemory>16</currentMemory>

Es gab also tatsächlich nur 16 KiB RAM für die virtuelle Maschine. Wie konnte das passieren? Ganz einfach: Laut libvirt-Handbuch kann man im memory-Element ein Attribut namens unit benutzen, um die Einheit der im Element angegebenen Zahl festzulegen. Standardmäßig sind es KiB. Ich hatte Folgendes eingetragen, um der VM bis zu 16 GiB Speicher zu geben:

<domain type='kvm'>
 <name>webserver</name>
 <memory unit='GiB'>16</memory>
 <currentMemory unit='GiB'>16</currentMemory>

Und nun der böse Fehler, aber nicht meinerseits: Beim Speichern der XML-Definition vergisst libvirt das unit-Attribut, so dass am Ende einfach nur noch die Zahl 16 ohne Einheit übrig bleibt, die dann beim nächsten Starten der VM als 16 KiB interpretiert wird. Nun benutze ich 16777216 (KiB), was meinen 16 GiB entspricht, und es gibt keine Probleme mehr.

Ziemlich ärgerlich! Aber immerhin habe ich bei meinen gar nicht notwendig gewesenen Reparaturversuchen etwas über GRUB gelernt und auch zum ersten Mal mit einem VNC-Client auf meine VM zugegriffen, was sehr hilfreich ist, da man ihr damit beim Booten zuschauen kann (ich habe TightVNC benutzt und fand es gut). Ohne VNC-Client hätte ich die Fehlermeldung beim Booten nicht sehen können und wäre noch ratloser gewesen …

Neue Seite auf neuem Server!

Neuer Server: von Host Europe zu Hetzner

Viele Jahre lang bin ich Kunde bei Host Europe gewesen, wo ich einen virtuellen Server für meine Webseiten gemietet hatte. Ein virtueller Server ist für den Einstieg wirklich empfehlenswert, da man im Prinzip nicht begrenzt darin ist, was man damit anstellt, außerdem übernimmt der Hoster das Anfertigen regelmäßiger Backups und kümmert sich um die Hardware.

Ein virtueller Server hat aber auch Nachteile. Erstens muss man sich einen realen Server mit mehreren Kunden teilen. Wie viele das sind, kann man nicht pauschal sagen und hängt sicherlich auch davon ab, wie viel man zu zahlen bereit ist (tendenziell: je teurer, desto weniger virtuelle Server pro realem Server). Die einzelnen virtuellen Server sind zwar voneinander abgeschottet (es wäre ja auch schlimm, wenn nicht!), aber sie beeinflussen sich trotzdem gegenseitig, da sie sich alle dieselbe reale Hardware teilen müssen. Je nach dem, was die „virtuellen Nachbarn“ gerade so zu tun haben, kann dann die Leistung des eigenen Servers schnell in den Keller gehen. Das größte Problem war bei mir die Festplatte, also die Geschwindigkeit von Lese- und Schreibzugriffen.

Nach einiger Überlegung bin ich nun Kunde bei Hetzner und habe mir dort einen dedizierten Server gemietet. Das ist also ein realer Server, der irgendwo in einem Rechenzentrum in einer großen Halle in einem großen Schrank steckt, und dessen Herz nur für mich schlägt. Er kostet nicht viel mehr als mein alter virtueller Server, bietet aber deutlich mehr! Der Neue trägt einen Intel Core i7 2600 in sich (4 Kerne mit bis zu 3.8 GHz) und ist mit 16 GiB RAM ausgestattet, was viermal mehr ist als mein virtueller Server. Mit zwei Festplatten à 3 TB in einem RAID 1-Verbund steht mir nun geradezu lächerlich viel Speicherplatz zur Verfügung, den ich garantiert nie im Leben auch nur annähernd sinnvoll nutzen kann. 100 GB Backup-Platz über FTP gibt’s auch noch dazu. Als Betriebssystem habe ich Ubuntu 12.04 LTS gewählt, da ich mit Ubuntu bereits einige Erfahrungen habe.

Eines gefällt mir an virtuellen Servern sehr gut, man kann sie nämlich extrem leicht sichern und Sicherungen wiederherstellen. Darum läuft der Webserver mit allen Webseiten als virtuelle Maschine auf meinem dedizierten Server. Für die Virtualisierung benutze ich KVM. Nach einigem Tuning erreicht der virtuelle Server fast 100% der Leistung des realen Servers, was CPU, Festplatte und Netzwerk angeht. Für die regelmäßige Komplettsicherung des virtuellen Servers habe ich mir ein nettes Konzept ausgedacht. Die Festplatte des virtuellen Servers ist ein Logical Volume. Wenn ich eine Sicherung anfertigen möchte, halte ich kurz alle datenkritischen Dienste an (Apache, MySQL), erzeuge dann einen Snapshot des Volumes und setze die Dienste wieder fort. Der Snapshot repräsentiert den kompletten Inhalt der virtuellen Festplatte zu einem bestimmten Zeitpunkt und kann nun, während der virtuelle Server fröhlich weiter läuft, im Hintergrund gesichert werden. Die Sicherung findet nicht auf Dateiebene statt, sondern die komplette virtuelle Festplatte wird als ein einziger langer binärer Datenblock gehandhabt. Um inkrementelle Backups zu ermöglichen, werde ich das Volume in kleinere Datenblöcke aufteilen (z.B. 64 MiB). Es müssen nur die Blöcke gesichert werden, die sich seit dem letzten Backup geändert haben. Das kann man mit einer Prüfsumme feststellen. Zusätzlich werden alle Blöcke noch komprimiert werden.

Neue Website: von Contao zu WordPress

Bei jedem Serverwechsel stellt sich die Frage, ob man eine bestehende Website unverändert übernimmt, sie verschrottet oder komplett neu erstellt. Ich tue von allem etwas. Meine private Seite (diese hier!) habe ich mit WordPress neu aufgesetzt. Die alte Seite benutzte ein CMS namens Contao, das früher TYPOlight hieß, und dort hat es mich immer einiges an Überwindung gekostet, etwas Neues hinzuzufügen. Ich hoffe, dass das mit WordPress anders wird und ich öfters einmal bloggen werde. Die Inhalte der Webseite werde ich größtenteils übernehmen.