15.09.2013

Portabler Apache-Webserver selbst gebaut

Heute hab ich mal wieder eine kleine Anleitung vorbereitet. Sozusagen aus aktuellem Anlass ;)

Ich habe mich vor kurzem bereit erklärt, als Aushilfe beim Förderverein der Wölfersheimer Schulen einzusteigen und den Webserver ein wenig zu betreuen, weil der edle Spender, der das aufgebaut und bisher betreut hat, beruflich viel um die Ohren hat.

Es geht aber natürlich nicht an, dass jemand direkt am produktiven System Änderungen durchführt, es muss also eine Testumgebung her, in der ich Dinge ausprobieren und auch sonst "herumspielen" kann. Idealerweise sollte es möglich sein, die Änderungen an den Vorstand des Vereins zu schicken, dort begutachten zu lassen, und dann die freigegebenen Änderungen auf den "Live"-Webserver zu überspielen.

Normalerweise ist es kein großes Problem, ein paar Webseiten zusammenzubauen und den Kollegen die Änderungen als Email zuzuschicken.

Das scheitert aber in dem Moment, wenn der Webserver aktive Inhalte ausliefert, wie z.B. Datenbankabfragen durchführt oder einfach nur aktive Seiten in Form von Python-Skripten oder JSP ausliefert. Soweit geht es zum Glück beim Förderverein nicht, es handelt sich "nur" um PHP-Skripte, die vom Apache ausgeführt werden und in HTML-Seiten resultieren, die beim Browser aufschlagen.

Also besteht die Testumgebung minimal aus einem Apache Webserver und dem PHP-Skriptinterpreter. Zusammen mit ein bißchen weiterem Kleinkram besteht der "PortableApache" aus knapp 40 MB Material. Das passt bequem auf den allerkleinsten USB-Stick, in ein Eckchen auf dem Smartphone oder MP3-Player zum bequemen Herumtragen.

Was braucht man nun? Das hängt vom Betriebssystem ab. Für Windows (weil die Vorstandskollegen Windows einsetzen) benötigt man die Installationsdateien von Apache httpd und ein PHP-Paket. Ein paar Bemerkungen zu den Windows-Paketen: es gibt verschiedene vorgefertigte Pakete, unter den Kategorien "VC9", "VC10", "VC11". Das sind Grundpakete von Microsoft (die sogenannte C-Runtime). Die Versionen 9 und 10 laufen mit Windows XP, Version 11 setzt mindestens Windows 7 voraus. Deshalb habe ich hier die Variante mit VC9 verlinkt.

Jetzt werden aus den ZIP-Dateien ein paar Dateien ausgepackt, man braucht gar nicht so viel ;)

Im Internet findet man viele Anleitungen, wie man einen portablen Apache Webserver zusammenbaut. Allen gemeinsam ist, dass sie die Verzeichnisstruktur für Apache beibehalten, es gibt also Verzeichnisse für Logfiles, Module, Konfigurationsdateien usw. Braucht man auf einem USB-Stick eigentlich nicht. Ich habe deshalb alles zusammengeworfen und ein Verzeichnis für Apache und ein Verzeichnis für PHP festgelegt. Das reicht ;)

Man beginnt mit einem Verzeichnis "PortableApache" und legt dort Unterverzeichnisse für "apache" und "php" an. Außerdem benötigt man noch ein Unterverzeichnis, in dem die Dokumente liegen, die ausgeliefert werden sollen. Im Beispiel unten ist dies das Verzeichnis "html", das parallel zu "apache" und "php" liegt. In der Konfigurationsdatei wird es dann als "../html" angesprochen. Auf diese Weise sind die Dokumente unabhängig vom Standort des Apache immer erreichbar.

In das Verzeichnis "apache" gehört nun folgendes:
  1. mod_mime.so
  2. mod_cgi.so
  3. openssl.cfg.cnf
  4. msvcr100.dll
  5. openssl.exe
  6. pcre.dll
  7. ssleay32.dll
  8. zlib1.dll
  9. htpasswd.exe
  10. httpd.exe
  11. libapr-1.dll
  12. libapriconv-1.dll
  13. libaprutil-1.dll
  14. libeay32.dll
  15. libhttpd.dll
  16. libxml2.dll
  17. httpd-ssl.conf
  18. magic
  19. mime.types
  20. httpd.conf
  21. mod_mime_magic.so
  22. mod_rewrite.so
  23. mod_setenvif.so
  24. mod_ssl.so
  25. mod_status.so
  26. mod_substitute.so
  27. mod_userdir.so
  28. mod_version.so
  29. mod_vhost_alias.so
  30. mod_alias.so
  31. mod_authn_core.so
  32. mod_authz_core.so
  33. mod_deflate.so
  34. mod_dir.so
  35. mod_env.so
  36. mod_headers.so
  37. mod_imagemap.so
  38. mod_include.so
  39. mod_info.so
  40. mod_log_config.so
  41. mod_log_debug.so
  42. mod_log_forensic.so
  43. mod_logio.so
  44. php5apache2_4.dll
Die Datei php5apache2_4.dll nimmt man aus dem PHP-Paket.

Im Verzeichnis "php" braucht man ein bißchen mehr Kram, je nachdem, welche  PHP-Funktionen den Skripten zur Verfügung stehen sollen. Wer sich mit PHP auskennt, kann hier natürlich brutal ausmisten, für Grundbedürfnisse kann man meinen Vorschlag noch deutlich verschlanken.

  1. glib-2.dll
  2. gmodule-2.dll
  3. icudt49.dll
  4. icuin49.dll
  5. icuio49.dll
  6. icule49.dll
  7. iculx49.dll
  8. icutest49.dll
  9. icutu49.dll
  10. icuuc49.dll
  11. libeay32.dll
  12. libenchant.dll
  13. libenchant_ispell.dll
  14. libenchant_myspell.dll
  15. libpq.dll
  16. libsasl.dll
  17. php-cgi.exe
  18. php-win.exe
  19. php.exe
  20. php.gif
  21. php.ini-development
  22. php.ini-production
  23. php5apache2_4.dll
  24. php5nsapi.dll
  25. php5ts.dll
  26. ssleay32.dll
Das Unterverzeichnis "php/ext" enthält folgende Dateien:
  1. php_bz2.dll
  2. php_curl.dll
  3. php_enchant.dll
  4. php_exif.dll
  5. php_fileinfo.dll
  6. php_gd2.dll
  7. php_gettext.dll
  8. php_gmp.dll
  9. php_intl.dll
  10. php_mbstring.dll
  11. php_openssl.dll
  12. php_shmop.dll
  13. php_sockets.dll
Um sicherzustellen, dass PHP funktioniert, sollte man nun an dieser Stelle eine Kommandozeile öffnen (Eingabeaufforderung, cmd.exe), in das Verzeichnis "PortableApache/php" wechseln und testen, ob der PHP-Interpreter sich meldet und seine Versionsnummer bekannt gibt:
H:\PortableApache\php>.\php -v
PHP 5.4.19 (cli) (built: Aug 21 2013 01:12:03)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies


Für diese veränderte Umgebung  muss man dann natürlich auf die Konfigurationsdateien beträchtlich anpassen, damit das Apache-httpd-Programm weiß, wo alle weiteren Module und Dateien zu finden sind.

Man braucht also eine httpd.conf, in der die Verzeichnisse alle aufgeführt sind. Wichtig ist, dass in dieser Konfigurationsdatei keine absoluten Verzeichnisnamen enthalten sind, sondern nur solche, die relativ zum Arbeitsverzeichnis des Webservers (des Prozesses httpd.exe) formuliert sind. Zur Verdeutlichung habe ich diese Stellen unten fett markiert.
Vom Standpunkt der Sicherheit aus gesehen ist diese Webserver-Datei natürlich absolut unvollständig, da fehlen noch einige Anweisungen, um Einbrüche von außen zu verhindern. Das ist aber nicht der Zweck eines "PortableApache". Diese Konfigurationsdatei da unten also bitte nicht als Vorlage für einen "echten" Webserver im Internet verwenden!

Listen 80
LoadModule alias_module mod_alias.so
LoadModule logio_module mod_logio.so
LoadModule log_config_module mod_log_config.so
LoadModule dir_module mod_dir.so
LoadModule mime_module mod_mime.so
LoadModule authn_core_module mod_authn_core.so
LoadModule authz_core_module mod_authz_core.so
LoadModule cgi_module mod_cgi.so
LoadModule env_module mod_env.so
LoadModule rewrite_module mod_rewrite.so
LoadModule setenvif_module mod_setenvif.so
LoadModule ssl_module mod_ssl.so
LoadModule php5_module php5apache2_4.dll
ServerName localhost:80
DocumentRoot "../html"
ServerAdmin you@yourdomain.de
# Include httpd-ssl.conf

ScriptAlias /cgi-bin/ "../cgi-bin/"
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog access.log common
ErrorLog  error.log
PidFile   httpd.pid

<IfModule php5_module>
  AddHandler application/x-httpd-php .php
  PHPIniDir "../php"
</IfModule>

<IfModule rewrite_module>
  RewriteEngine On
</IfModule>

<IfModule php5_module>
  DirectoryIndex index.php index.htm index.html
</IfModule>

<IfModule dir_module>
  DirectoryIndex index.html index.htm
</IfModule>

<IfModule mime_module>
  TypesConfig "mime.types"
  AddType application/x-compress .Z
  AddType application/x-gzip .gz .tgz
  AddType application/x-bzip2 .bz2 .tz2
</IfModule>

<IfModule ssl_module>
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin
</IfModule>

<Directory "../html">
  AllowOverride All
</Directory>


Das Apache-Modul für "rewrite" brauche ich, damit ich solche Spielereien mit der Datei ".htaccess" in den Datenverzeichnissen machen kann:

RewriteEngine on
Options +FollowSymlinks
RewriteBase /

RewriteRule (.*)_(.*)_(.*).html$ /_start.php?cat=$1&id=$2&edit=$3
RewriteRule (.*)_(.*).html$ /_start.php?cat=$1&id=$2
RewriteRule (.*).html$ /_start.php?cat=$1


Ich habe da oben auch schon den Anfang einer SSL-Konfiguration angedeutet, aber natürlich funktioniert das nur, wenn man sich mit dem openssl-Programm ein eigenes Zertifikat baut, also einen private key. Dazu später vielleicht mal einen eigenen Artikel, wie man sich selbst zur root-CA-Instanz macht und dann für sich selbst Keys erzeugt und signiert.

Für eine erste Prüfung, ob diese httpd.conf auch wirklich funktioniert, ruft man "httpd.exe -t" auf (-t testet, ob eine Konfigurationsdatei einigermaßen funktionsfähig aussieht). Wenn man hier die Meldung "Syntax OK" erhält, kann man fast schon loslegen ;)

Für die bequeme Nutzung ist noch ein kleines Startskript vonnöten, das den Apache aufruft. Ich habe es "start.cmd" genannt und direkt in das Verzeichnis "PortableApache" gesteckt.

cd /D "%~dp0apache"
PATH %~dp0php;%PATH%
.\httpd.exe -f httpd.conf



Der Inhalt dieses kleinen Webservers wird nun angezeigt, wenn man mit einem Browser die URL "http://localhost" oder "http://127.0.0.1" aufruft.