Weblog

Hiawatha LogoDer Hiawatha Webserver ist ein sehr sicherer, schneller und Ressourcen schonender Webserver von Hugo Leisink. Hiawatha gibt es seit 2002 gibt. Hier hat ein Ingenieur aus Silicon Valley einen Bericht geschrieben, in dem er die Vorzüge darlegt (englisch). Hier hat der Webentwickler Matt Brunt in einer Slideshow (englisch) erklärt, weshalb er Hiawatha für den besten Webserver hält. Sein geringer Systemverbrauch und seine hohe Geschwindigkeit machen ihn zum idealen Werkzeug für unseren kleinen Raspberry Pi. Außerdem ist er extrem einfach einzurichten.

Um Hiawatha Webserver auf dem Raspi einzurichten, gibt es verschiedene Möglichkeiten. Alles bezieht sich auf den Einsatz von Raspbian (Debian angepasst für den Raspberry Pi). Beispiel für die aktuelle Version 9.15. Im Beispiel verwende ich die IP 192.168.88.227 bzw. www.my-domain.org, das natürlich auf die eigenen Daten anpassen.

Grundlagen installieren. Curl ist nur für die Downloads gedacht, Cmake ist für die eigene Paket-Erstellung (Variante 1) notwendig.

sudo apt-get install curl cmake libc6-dev libssl-dev dpkg-dev debhelper fakeroot libxml2-dev libxslt1-dev

Sollte etwas fehlen, die fehlenden Abhänigkeiten einfach nachinstallieren mit: sudo apt-get install -f

Variante 1.)
Original Tarball:
Gehe auf Hiawatha-Webserver.org und lade den Tarball auf den Pi, erstelle ein Paket und installiere es:

cd
curl -k https://www.hiawatha-webserver.org/files/hiawatha-9.15.tar.gz \
-o hiawatha_9.15.tar.gz

tar -xzf hiawatha-9.15.tar.gz
cd hiawatha-9.15/extra
./make_debian_package
cd ..
sudo dpkg -i hiawatha_9.15_armhf.deb


Variante 2.)
Ohne Tarball mit einem fertigen Debian-Paket:
Gehe auf meine Files und sehe vorher nach der  aktuellen Version. Lade diese  herunter und installiere sie:

curl -k https://files.intermezzo.net/hiawatha_raspi/hiawatha_9.15_armhf.deb \
-o
hiawatha_9.15_armhf.deb
sudo dpkg -i hiawatha_9.15_armhf.deb
sudo apt-get -f install  # falls abhängige Pakete wie z.B. libxslt fehlen


Weiter nach 1. oder 2.:

sudo netstat -tulpen

Es sollte in etwa sowas angezeigt werden:

tcp  0  0 0.0.0.0:80  0.0.0.0:*  LISTEN 0 13006  6295/hiawatha

Will man nun PHP einsetzen, sollte man PHP-FPM installieren:

sudo apt-get install php5-fpm
sudo apt-get install php5-mysql php5-xsl php5-gd # diese Zeile, wenn Banshee installiert wird


Bei PHP-FPM müssen wir uns zwischen Socket und TCP/IP entscheiden. Überlegungen hierzu: Link
Socket ist etwas schneller, TCP/IP kann mögliche Fehler umschiffen.

In /etc/hiawatha/hiawatha.conf setzen wir folgendes ein:
( Haben wir eine Domain, nutzen wir statt 192.168.88.227 die Domain: www.my-domain.org )

sudo nano /etc/hiawatha/hiawatha.conf
FastCGIserver {
    FastCGIid = PHP5
    ConnectTo = /var/run/php5-fpm.sock # falls wir Socket nutzen wollen
    #ConnectTo = 127.0.0.1:9000 # falls wir TCP/IP nutzen wollen
    Extension = php, php5
    SessionTimeout = 30
}


VirtualHost {
    Hostname = 192.168.88.227
    WebsiteRoot = /var/www/my-domain
    StartFile = index.php
    AccessLogfile = /var/log/my-domain-access.log
    ErrorLogfile = /var/log/my-domain-error.log
    TimeForCGI = 5
    UseFastCGI = PHP5
}


Dann erstellen wir eine Test index.php

sudo nano /var/www/my-domain/index.php
<?php
phpinfo(32);
?>


Stellen wir sicher, dass Hiawatha die index.php auch öffnen darf:

sudo chown root:www-data /var/www/my-domain/index.php
sudo chmod 640 /var/www/my-domain/index.php


Dann passen wir die /etc/php5/fpm/pool.d/www.conf an:

sudo nano /etc/php5/fpm/pool.d/www.conf


 Falls wir TCP/IP statt Socket nutzen wollen (siehe oben hiawatha.conf), ersetzen wir:

listen = /var/run/php5-fpm.sock


mit:

listen = 127.0.0.1:9000


Und um Ressourcen am Pi zu schonen, tragen wir dazu noch ein:

pm = static
pm.max_children = 1 # den besten Wert ggf. austesten


Jetzt passen wir noch ein paar Dinge in der /etc/php5/fpm/php.ini an:

sudo nano /etc/php5/fpm/php.ini
cgi.fix_pathinfo = 0
cgi.rfc2616_headers = 1   #  diese Option falls das  Banshee PHP framework eingesetzt werden soll

Bitte auch noch die Sicherheitseinstellungen nach eigenen Erwägungen ebenfalls anpassen.

Danach starten wir PHP-FPM neu:

sudo service php5-fpm restart


Falls wir kein PHP nutzen wollen, z.B. in weiteren VirtualHost's, erstellen wir eine index.html und ändern die in der /etc/hiawatha/hiawatha.conf die jeweilige Zeile:

StartFile = index.php

auf:

StartFile = index.html

Bisher haben wir Hiawatha nicht neu gestartet, das tun wir jetzt:

sudo service hiawatha restart


Nun sollten wir mit https://192.168.88.227 bzw. https://www.my-domain.org eine PHP-Ausgabe erhalten.

Später natürlich pm.max_children usw. auf die eigenen Bedürfnisse optimieren.

Falls wie den den Tarball verwenden, haben wir ein Script
/home/pi/hiawatha-9.15/extra/mkcert (je nach Pfad)

cd /home/pi/hiawatha-9.15/extra
./mkcert

Wenn wir das mkcert ausführen und einen gültigen FQDN oder eine IP angeben ( im Beispiel die IP: 192.168.88.227, oder www.my-domain.org ), erhalten wir eine unsignierte serverkey.pem .

Diese kopieren wir nach /etc/hiawatha/serverkey.pem und schützen sie:

sudo cp ./serverkey.pem /etc/hiawatha/serverkey.pem
sudo chown root:root /etc/hiawatha/serverkey.pem

sudo chmod 600 /etc/hiawatha/serverkey.pem


Nun ergänzen wir in /etc/hiawatha/hiawatha.conf:

sudo nano /etc/hiawatha/hiawatha.conf
Binding {
    Port = 443
    SSLcertFile = serverkey.pem
}

Bei Hiawatha kann man die TLS-Version selbst festlegen. Ohne Angabe ist sie default TLS1.0. Somit hat Poodle keine Chance. Man kann TLS auch mit RequireSSL erzwingen. Bei RequireSSL nicht von SSL verwirren lassen, das stammt noch von früher. In Hiawatha wurde SSL3.0 entfernt.

Optional kann man folgendes verwenden:

MinTLSversion = 1.2 

RequireTLS = yes, 31536000 

Danach benötigt Hiawatha einen Restart:

sudo service hiawatha restart


Nun erhalten wir unsere PHP-Ausgabe:  https://192.168.88.227 bzw. https://www.my-domain.org per HTTPS.

Hiawatha hat sehr viele Möglichkeiten. Man kann nahezu beliebig viele virtuelle Domains anlegen und jeweils ein eigenes SSLcertFile (je VirtualHost verwenden). Bitte Hiawatha niemals ohne VirtualHost nutzen. Hier sollte in /var/www/hiawatha/index.html nur eine leere Datei hinterlegt sein. Dies dient aus Sicherheitsgründen dazu, dass Domain-Grabber über die IP-Adresse nur eine leere Seite angezeigt bekommen.

Hiawatha kann Angriffe erkennen, SQLInjection und Flooding erkennen, IP's bannen,  als Reverse Proxy eingesetzt werden, Cachen u.v.m. Eine sehr nützliche Option ist auch sein UrlToolkit.

Bitte unbedingt lesen, um alle Möglichkeiten der Optionen kennenzulernen Es ist alles sehr gut dokumentiert Im Forum (englisch) erhält man sehr schnell und freundlich Antworten vom Entwickler:

Hiawatha Manpages
Hiawatha Howto's
Hiawatha FAQ

Hiawatha Forum

Ich bin unbestritten ein großer Fan von Hiawatha und setzte weder auf meinem Pi, noch auf meinem OpenBSD etwas anderes ein. Daher wünsche ich viel Freude mit Hiawatha mit PHP auf dem Raspberry Pi. Wer über eine sichere Alternative zu Wordpress, Drupal und Co. nachdenkt, kann sich Banshee-PHP ansehen. Es handelt sich um ein Framework, das relativ leicht anzupassen ist.

Update: auf Version 9.15 geändert und PHP-FPM Socket vs. TCP/IP (16.11.2015)