Open Source im professionellen Einsatz
Linux-Magazin 05/2013
© Oleg Zhukov, 123RF.com

© Oleg Zhukov, 123RF.com

Eigene Webanwendungen mit Node.js und Redis programmieren

Schneller knoten

Javascript auch auf dem Server nutzen, das verspricht das Webserver-Framework Node.js und bietet zahlreichen Erweiterungen und viele Funktionen, aber auch hohe Performance. Dieser Artikel zeigt, wie sich im Verbund mit der Datenbank Redis eine einfache und schnelle Buchungsapplikation entwickeln lässt.

606

Linux, Apache, MySQL, PHP – LAMP-Anwendungen dominieren das Web. Typischerweise bestehen sie aus einem Bündel von PHP-Programmen, die Daten in MySQL-Datenbanken speichern oder auslesen, auf einem Linux-Server gespeichert sind und Clients über einen Apache-HTTP-Server bedienen.

Doch der Shootingstar unter den Webservern tickt anders: Node.js [1] ist nicht nur ein HTTP-Server, sondern ein ganzes Programmiergerüst, das es erlaubt, hochperformante und skalierbare Webanwendungen in Javascript zu schreiben. Im Gegensatz zu Browserskripten laufen die Javascript-Applikationen wie PHP-Programme auf dem Server.

Knoten ersetzt Lampe

Das folgende Beispiel zeigt die Stärken von Anwendungen in Node.js im Vergleich zu den weitverbreiteten LAMP-Programmen. Die Open-Source-Software, (unter MIT-Lizenz) basiert auf der Chrome-Laufzeitumgebung V8 [2] für Javascript und ist mittlerweile in den Repositories aller gängigen Distributionen enthalten. Listing 1 zeigt die simple Installation der aktuellen Version 0.8.15 unter Ubuntu Quantal Quetzal.

Listing 1

Installation

01 sudo apt-get install python-software-properties
02 sudo add-apt-repository ppa:chris-lea/node.js
03 sudo apt-get update
04 sudo apt-get install nodejs np

Das Design von Node.js ähnelt der Ruby-Bibliothek Eventmachine [3] und der Python-Bibliothek Twisted [4]. Auch in Node.js benötigen Webanwendungen einen eigenen HTTP-Server. Listing 2 zeigt, wie sich der HTTP-Server von Node.js nach Art eines Echo-Servers verwenden lässt.

Listing 2

Node.js als Echo-Server

01 var http = require('http');
02 http.createServer(function(req, resp) {
03   resp.writeHead(200, {'Content-Type': 'text/plain'});
04   resp.end(req.url);
05 }).listen(3000);

Ein Echo-Server

Zeile 1 erzeugt mit der Funktion »require()« eine Referenz auf das im Modul »http« enthaltene Objekt und speichert sie in der gleichnamigen Variablen. In der darauf folgenden Zeile erstellt die Methode »createServer()« ein HTTP-Server-Objekt. Der Aufruf bekommt eine Callback-Funktion übergeben, die der Server immer bei Eingang einer HTTP-Anfrage ausführt. Sie übernimmt mit dem Parameter »req« ein Objekt, das die HTTP-Anfrage, und mit »resp« eines, das die HTTP-Antwort repräsentiert.

In Zeile  3 schreibt die Methode »writeHead()« Werte in den Kopf der HTTP-Antwort. Der Code »200« steht für eine erfolgreiche Anfrage, die Angabe »text/plain« für den Mime-Type der Antwort. In Zeile 4 beendet die Methode »end()« die HTTP-Antwort. Zuvor schreibt das Skript den Pfadanteil der abgefragten URL aus der gleichnamigen Eigenschaft noch in den Körper der HTTP-Antwort. Zeile 5 bindet mit der Methode »listen()« das HTTP-Server-Objekt an den Port 3000. Abbildung 1 zeigt die Antwort des Echo-Servers auf eine HTTP-Anfrage mit dem Kommandozeilentool Curl.

Abbildung 1: Der minimalistische Echo-Server antwortet und gibt den Pfandanteil der als Parameter angegebenen URL zurück.

Der HTTP-Server von Node.js arbeitet alle Anfragen mit einem einzigen Serverprozess ab. Der Apache-HTTP-Server hingegen verwendet, je nach Modell, pro Anfrage einen Prozess. Abbildung 2 illustriert den von Node.js eingesparten Speicherplatz. Weil in Node.js Aufrufe zumeist asynchron erfolgen, kann der Serverprozess mehrere HTTP-Anfragen gleichzeitig beantworten.

Abbildung 2: Im Vergleich zu Apache spart Node.js mit nur einem Prozess deutlich Speicherplatz.

Node.js-Anwendungen lassen sich jedoch auch über mehrere Prozesse verteilen. Listing 3 zeigt die Skalierung des HTTP-Servers aus Listing 2 mit der Anzahl der Prozessoren. Zeile 2 bindet zunächst das Modul »cluster« ein, das die eigentliche Skalierung durchführt. Zeile 3 ermittelt daraufhin die Anzahl der Prozessorcores. Die Zeilen 5 bis 7 erzeugen im Masterprozess mit der Methode »fork()« Kopien von sich, die Zeilen 9 bis 12 starten pro Kopie jeweils einen HTTP-Server. Diese übernehmen wechselweise HTTP-Anfragen an den Port 3000. Im Gegensatz zu einer LAMP-Anwendung fasst Node.js hier Server und Anwendung in einem Prozess zusammen.

Listing 3

Skalieren des Echo-Servers

01 var http=require('http'),
02   cluster=require('cluster'),
03   cpus=require('os').cpus().length;
04 if (cluster.isMaster) {
05  for(var i = 0; i < cpus; i++) {
06   cluster.fork();
07  }
08 } else {
09  http.createServer(function(req, resp) {
10   resp.writeHead(200, {'Content-Type': 'text/plain'});
11   resp.end(req.url);
12  }).listen(3000);
13 }

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Bücher

    Die Bücherseite greift zwei aktuelle Trends auf: Das erste Werk behandelt die Anwendungsentwicklung mit dem Javascript-Server Node.js. Das zweite möchte Java- und C-Programmierer in die Arbeit mit mehreren Prozessoren und Nebenläufigkeit einführen.

  • Web RTC

    Das Protokoll Web RTC macht den Browser zur Kommunikationszentrale: Ganz ohne Plugins erledigt er Videochats oder Datei-Übertragungen über Peer-to-Peer-Verbindungen.

  • Node.js

    Die Javascript-basierte Programmierumgebung für Webentwicklung Node.js bändigt den Ressourcen-Hunger von Echtzeit-Webanwendungen wie Onlinespielen oder Chatservern. Dank eines ereignisorientierten Ansatzes kommt Node.js dabei mit einem Webserver-Thread pro Instanz aus.

  • Super-Nginx bündelt Redis, Drizzle und Lua

    Einer der Rails-Hauptentwickler paketiert den schnellen Webserver Nginx mit einer Reihe zukunftsträchtiger Technologien.

  • Node 7.0.0 unterstützt mehr ES6-Features und parst URLs standardkonform

    Node 7.0.0 ist erschienen. Die darin verwendete Version 5.4 von V8 deckt die ES6-Funktionen zu 98 Prozent ab. Zudem verbessert die Version den Umgang mit URLs.

comments powered by Disqus

Ausgabe 09/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.