Installation von Drupal unter Debian GNU/Linux ›Etch‹ mit Lighttpd

Lighttpd ist ein relativ junger und schlanker Webserver, der unter bestimmten Umständen eine vollwertige Alternative zum ubiquitären Apache darstellen kann. Während Lightys Domäne bisher in der performanten Auslieferung statischer Inhalte wie Bilder oder HTML-Dateien bestand, findet er mittlerweile auch zunehmend im Bereich dynamischer Webanwendungen und Content-Management-Systeme Anwendung.

Das folgende Tutorial beschreibt die Installation von Drupal unter Debian GNU/Linux ›Etch‹ mit Lighttpd; hierbei geht es weniger um die - andernorts bereits hinreichend dokumentierte - Einrichtung von Drupal selbst, sondern primär die Server- und Betriebssystemkonfiguration. Letztere ist, mit gewissen Einschränkungen, auch auf Debian-Derivate wie Ubuntu übertragbar, wobei beispielsweise das im Oktober 2008 aktueller Hardy Heron Pakete auf dem Aktualitäts- und Stabilitätsstand des Debian-Testing-Zweigs mitbrachte.

Lighttpd

Vor dem Testen des Lighty sollte ein eventuell laufender Apache angehalten werden; sonst gibt es eine Fehlermeldung wie:

   * Starting web server lighttpd
   [...] (network.c.300) can't bind to port:  80 Address already in use [fail]
   invoke-rc.d: initscript lighttpd, action "start" failed.

Möchte man den Apache dauerhaft deaktivieren, aber noch nicht deinstallieren, bearbeitet man in "Etch" die /etc/default/apache2:

   # 0 = start on boot; 1 = don't start on boot
   NO_START=1

Debian und Derivate bringen mittlerweile alle erforderlichen Komponenten für den Betrieb von Lighttpd sauber paketiert mit:

   $ apt-cache search lighttpd
   lighttpd - A fast webserver with minimal memory footprint
   lighttpd-doc - Documentation for lighttpd
   lighttpd-mod-magnet - Control the request handling module for lighttpd
   [...]

Hinzu kommt ggf. noch php5-cgi, falls man Fastcgi nutzen möchte; Debian kümmert sich - wie immer - um eine sinnvolle Grundkonfiguration.

Das holt man sich auf dem üblichen Wege aus den Debian-Repositories, z.B. mit:

   $ aptitude install lighttpd-mod-magnet php5-cgi php5-cli
   php5-mysql mysql-server php5-gd phpmyadmin

lighttpd-mod-magnet bringt als Abhängigkeit noch liblua5.1-0 mit, die das Ausführen von Lua-Skripten ermöglicht.

Die zentrale Konfigurationsdatei von Lighty findet sich unter /etc/lighttpd/lighttpd.conf und sieht standardmäßig in etwa folgendermaßen aus:

   server.modules              = (
               "mod_access",
               "mod_alias",
               "mod_accesslog"
   )

   server.document-root       = "/var/www/"
   accesslog.filename         = "/var/log/lighttpd/access.log"
   server.errorlog            = "/var/log/lighttpd/error.log"
   index-file.names           = ( "index.php", "index.html" )
   [...]
  }

Der index-file.names kann auf die relevanten Dateitypen zurechtgestutzt werden; Drupal braucht index.php, falls man Boost einsetzen möchte benötigt man zusätzlich noch index.html.

Ein Host kann folgendermaßen eingetragen werden:

   $HTTP["host"] =~ "^(www\.)?domain\.com" {
   ...
   }

Die Module "mod_rewrite" und "mod_redirect" sind auskommentiert, können aber später noch benötigt werden. Zusätzliche Module werden eingebunden mit:

   lighty-enable-mod fastcgi
   lighty-enable-mod magnet

Zusätzliche Hosts können aus Übersichtsgründen in separate Dateien ausgelagert und mit Include-Anweisungen in die lighttpd.conf eingebunden werden:

   include "host1.conf"
   include "host2.conf"
   [...]

Hat man eine Grundkonfiguration durchgeführt, startet man Lighty:

/etc/init.d/lighttpd start

Findet Lighty beim Parsen Fehler in der lighttpd.conf, werden präzise Zeilennummern ausgegeben; das hilft ganz erheblich bei der Fehlersuche.

PHP

Sobald Lighty fehlerfrei startet, kann man sich an die Konfiguration von PHP machen. Die dazugehörigen Konfigrationsdateien finden sich unter /etc/php5/cgi/php.ini, nicht unter /etc/php5/apache2/php.ini.

Zwei Ergänzungen sind erforderlich:

cgi.fix_pathinfo = 1

Der zweite Parameter ist dynamisch zu verstehen; der Standardwert von 16 MB ist für Durpal mit gängigen Modulen wie CCK und Views deutlich zu klein; 32 MB ist ein sinnvoller Einstiegswert, den man evtl später nach oben (z.B. 48 MB) oder unten (z.B. 24 MB) anpassen kann:

memory_limit = 32M

In Debian "Etch" muß die /etc/lighttpd/conf-available/10-cgi.conf meist noch korrigiert werden (Pfad, der auf php4-cgi verweist); dieser Fehler ist jedoch ab Debian "Lenny" und Ubuntu "Hardy" beseitigt.

Drupal

Drupal lässt sich wie gewohnt installieren; ein bereits eingerichtetes Drupal läuft nach dem Wechsel von Apache2 zu Lighty - fast - auf Anhieb, wenn die Serverkonfiguration geglückt ist.

Zum Umschreiben der URLs reichen die Fähigkeiten von Lightys mod_rewrite nicht aus; ergänzend wird mod_magnet in Verbindung mit einem Lua-Skript eingesetzt. Darix hat dazu eine ausführliche Beschreibung und ein Integrationsskript für Drupal veröffentlicht:

-- little helper function
function file_exists(path)
  local attr = lighty.stat(path)
  if (attr) then
      return true
  else
      return false
  end
end
function removePrefix(str, prefix)
  return str:sub(1,#prefix+1) == prefix.."/" and str:sub(#prefix+2)
end

-- prefix without the trailing slash
local prefix = '/drupal'

-- the magic ;)
if (not file_exists(lighty.env["physical.path"])) then
    -- file still missing. pass it to the fastcgi backend
    request_uri = removePrefix(lighty.env["uri.path"], prefix)
    if request_uri then
      lighty.env["uri.path"]          = prefix .. "/index.php"
      local uriquery = lighty.env["uri.query"] or ""
      lighty.env["uri.query"] = uriquery .. (uriquery ~= "" and "&" or "") .. "q=" .. request_uri
      lighty.env["physical.rel-path"] = lighty.env["uri.path"]
      lighty.env["request.orig-uri"]  = lighty.env["request.uri"]
      lighty.env["physical.path"]     = lighty.env["physical.doc-root"] .. lighty.env["physical.rel-path"]
    end
end
-- fallthrough will put it back into the lighty request loop
-- that means we get the 304 handling for free. ;)

Es handelt sich dabei um ein sehr kurzes Skript, das es allerdings in sich hat: Es ermöglicht Pretty URLs in Drupal. Je nachdem, in welchem Verzeichnis Drupal installiert ist, muss das Skript noch angepasst werden, da es /drupal annimmt. Befindet sich die Installation im Basisverzeichnis des des Webservers, ändert man das "local prefix" in

   local prefix = ''

Folgendermaßen ist das Skript zu bekommen:

   $ wget http://nordisch.org/drupal.lua
   $ mv drupal.lua /etc/lighttpd/

Eingebunden wird es zu Beginn der Host-Konfiguration mittels

magnet.attract-physical-path-to = ( "/etc/lighttpd/drupal.lua" )
.

Das sieht in einer host1.conf beispielsweise folgendermaßen aus:

$HTTP["host"] =~ "^(www\.)?host1\.tld" {
        server.document-root    = "/var/www/host1"
        index-file.names        = ( "index.php" )
        magnet.attract-physical-path-to = ( "/etc/lighttpd/drupal.lua" )
        [...]

Darix diskutiert auf Nordisch by nature auch noch weitere Lösungsansätze, bisher bildet die Kombination aus mod_magnet und dem kleinen Lua-Skript jedoch die stabilste Lösung, um Drupal unter Lighty mit ordentlichen URLs zu betreiben.

Hinweis: Wer auf seinem Webserver verschiedene Webanwendungen - beispielsweise Drupal, Mediawiki und Gallery2 - zu laufen hat, muß eventuell weitreichende Anpassungen vornehmen.

Netmarks