Haskell, Hack und FastCGI

Friday, 28 August 2009, 16:05 von Blackflash

Bereits vor einiger Zeit bin ich auf ein interessantes Projekt namens Hack (von Jinjing Wang) gestoßen, das eine Schnittstelle für Webapplikation jeglicher Art darstellen soll, was über Handler realisiert wird. So sind bereits Handler für Happstack, Kibro, CGI, FastCGI und einigen weiteren entstanden. Da ich Lighttpd als Webserver verwende und die Konfiguration mittels FastCGI mit Lighttpd sehr leicht zu machen ist, habe ich mich kurzerhand entschlossen, Hack eine Chance zu geben.

Der erste Schritt war das Installieren der benötigten Hackage-Pakete. Da ArchLinux bisher verhältnismäßig viele Hackage-Pakete angeboten hat, habe ich das benötigte haskell-hack-handler-fastcgi mitsamt der Abhängigkeiten installiert per yaourt. Die Verwendung von cabal würde jedoch genauso gut funktionieren. Da Lighttpd bereits installiert war, war nur die Konfiguration desselben notwendig. Hierfür habe ich einen virtuellen Host (taskell), der auf 127.0.0.1 zeigt, angelegt:

$HTTP["host"] == "taskell" { server.name = "taskell" server.document-root = "/home/blackflash/workspace/Taskell/src" fastcgi.server = ( "/" => ( "taskell" => ( "socket" => "/tmp/taskell.socket", "check-local" => "disable", "bin-path" => "/home/blackflash/workspace/Taskell/src/Main", "min-procs" => 1, "max-procs" => 30, "idle-timeout" => 30 ) ) ) }

Natürlich ist das nur eine rudimentäre Konfiguration zum Überprüfen, ob es überhaupt funktioniert, denn man sollte niemals direkt in den Workspace verlinken. Die Datei Main entspricht übrigens der kompilierten Main.hs, dessen Inhalt folgendermaßen aussieht:

module Main where import Hack import Hack.Handler.FastCGI import Data.ByteString.Lazy.Char8 (pack) main :: IO () main = runFastCGI app app :: Application app = return . Response 200 [ ("Content-Type", "text/plain") ] . (pack . show)

In der main-Funktion wird die Anbindung der Applikation app an FastCGI realisiert. Derzeit besteht sie nur aus dem Zusammenstellen einer HTTP-Antwort (200 OK) mit der Umgebung als Antwort. Eine Anfrage an den Webserver sieht dann folgendermaßen aus:

# curl http://taskell/ Env {requestMethod = GET, scriptName = "/", pathInfo = "", queryString = "", serverName = "taskell", serverPort = 80, http = [("FCGI_ROLE","RESPONDER"),("SERVER_SOFTWARE","lighttpd/1.4.23"), ("SERVER_NAME","taskell"),("GATEWAY_INTERFACE","CGI/1.1"), ("SERVER_PORT","80"), ("SERVER_ADDR","127.0.0.1"),("REMOTE_PORT","56072"),("REMOTE_ADDR","127.0.0.1"), ("SCRIPT_NAME","/"),("PATH_INFO",""),("SCRIPT_FILENAME","/home/blackflash/workspace/Taskell/src/"), ("DOCUMENT_ROOT","/home/blackflash/workspace/Taskell/src"),("REQUEST_URI","/"), ("QUERY_STRING",""),("REQUEST_METHOD","GET"),("REDIRECT_STATUS","200"), ("SERVER_PROTOCOL","HTTP/1.1"), ("User-Agent","curl/7.19.6 (i686-pc-linux-gnu) libcurl/7.19.6 OpenSSL/0.9.8k zlib/1.2.3.3"), ("Host","taskell")("Accept","*/*")], hackVersion = [2009,7,15], hackUrlScheme = HTTP, hackInput = Empty, hackErrors = Error Stream, hackHeaders = [], hackCache = []}

Insgesamt war das Aufsetzen einer solchen "Hallo Welt"-Applikation sehr einfach. Man benötigt dazu lediglich eine Informationsquellen (neben dem Quellcode), die ich hier der Vollständigkeit halber noch erwähnen möchte:

  • Hack.hs: Das Hack-Modul, das die Umgebung beschreibt.
  • readme.md: Eine Art Kurztutorial, das vom Hack-Autor geschrieben wurde.
  • Hack Introduction: Eine konzeptionelle Einführung in Hack, die für das Verständnis sehr hilfreich ist.

Es sei noch angemerkt, dass ich einige Punkte wie das Kompilieren der Main.hs sowie das Neustarten des Webservers und das Eintragen des Hosts taskell nicht erläutert habe, was daran liegt, dass dieser Artikel kein Tutorial darstellt, sondern lediglich einen Überblick über FastCGI-Entwicklung mit Hack und Haskell bietet.

Kommentare


Kommentiere!

Your Name:


Your Email:


Your URL:


Spam Prevention:
Enter the text above into the box below.
If you are unable to read it, refresh the page.


Your Comment: