lighttpd mit mod_geoip

Auch wenn ein entsprechendes Modul namens mod_geoip für den lighttpd existiert, muss es leider händisch integriert werden. Da ich das Ganze vor ein paar Tagen machen musste, hab ich aus meinen Notizen ein kurzes Howto verfasst. Basissystem war in meinem Fall Debian 4.0, die aktuell stabile lighttpd-Version ist 1.4.18. Es gilt wie immer: Verzeichnisse sind entsprechend anzupassen, Handwerkszeug wie C-Compiler besorgst du dir, sofern nicht schon vorhanden, über deinen Paketmanager.

Als erstes solltest du dir alle benötigten Sourcen besorgen:

cd /usr/local/src
wget http://www.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.bz2
wget -O mod_geoip.c \
http://trac.lighttpd.net/trac/attachment/wiki/Docs/ModGeoip/mod_geoip.5.c?format=raw

Wir haben jetzt die Sourcen von Maxmind für ihre API, lighttpd selbst und das Modul mod_geoip.
Als erstes sollten wir uns daran machen die API von Maxmind zu übersetzen.

tar zxf GeoIP.tar.gz
cd GeoIP-1.4.4
./configure --prefix=/usr/local/GeoIP-1.4.4
make
make install

Jetzt ist lighty selbst dran. Als erstes muss das GeoIP-Modul in das src-Verzeichnis von lighttpd geschoben werden.

cd /usr/local/src
tar jxf lighttpd-1.4.18.tar.bz2
mv mod_geoip.c lighttpd-1.4.18/src/
cd lighttpd-1.4.18

Du musst die Datei src/Makefile.am verändern und folgenden Abschnitt nach dem letzten Modul hinzufügen:

lib_LTLIBRARIES += mod_geoip.la
mod_geoip_la_SOURCES = mod_geoip.c
mod_geoip_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_geoip_la_LIBADD = $(common_libadd) -lGeoIP

Bei mir sieht der Abschnitt dann so aus

-- snip --

lib_LTLIBRARIES += mod_status.la
mod_status_la_SOURCES = mod_status.c
mod_status_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_status_la_LIBADD = $(common_libadd)

lib_LTLIBRARIES += mod_accesslog.la
mod_accesslog_la_SOURCES = mod_accesslog.c
mod_accesslog_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_accesslog_la_LIBADD = $(common_libadd)

lib_LTLIBRARIES += mod_geoip.la
mod_geoip_la_SOURCES = mod_geoip.c
mod_geoip_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_geoip_la_LIBADD = $(common_libadd) -lGeoIP


hdr = server.h buffer.h network.h log.h keyvalue.h \
response.h request.h fastcgi.h chunk.h \
settings.h http_chunk.h http_auth_digest.h \
md5.h http_auth.h stream.h \
fdevent.h connections.h base.h stat_cache.h \
plugin.h mod_auth.h \
etag.h joblist.h array.h crc32.h \
network_backends.h configfile.h bitset.h \
mod_ssi.h mod_ssi_expr.h inet_ntop_cache.h \
configparser.h mod_ssi_exprparser.h \
sys-mmap.h sys-socket.h mod_cml.h mod_cml_funcs.h \
splaytree.h proc_open.h status_counter.h \
mod_magnet_cache.h

DEFS= @DEFS@ -DLIBRARY_DIR="\"$(libdir)\"" -DSBIN_DIR="\"$(sbindir)\""

-- snip --

Nun muss das configure-Script noch auf den aktuellen Stand gebracht werden. (Zur Orientierung: pwd ergibt /usr/local/src/lighttpd-1.4.18)

aclocal && automake -a && autoconf
make clean

Jetzt können wir mit dem gewohnten Übersetzungsvorgang beginnen. Das configure-Parameter –enable-maintainer-mode muss gesetzt werden, alle anderen dürfen nach eigenen Vorstellungen weggelassen, verändert und hinzugefügt werden.

./configure --prefix=/usr/local/lighttpd-1.4.18 --enable-maintainer-mode
make
make install

In deiner lighttpd.conf müssen jetzt noch zwei Konfigurationsdirektiven hinzugefügt und eine ergänzt werden. Erst einmal muss die Liste der Server-Module erweitert werden. Meine sieht wie folgt aus (relevant ist natürlich “mod_geoip”):

server.modules = (
"mod_rewrite",
"mod_access",
"mod_auth",
"mod_fastcgi",
"mod_geoip",
"mod_secdownload",
"mod_accesslog" )

Die Konfiguration des GeoIP-Moduls sieht wie folgt aus:

geoip.db-filename = "/www/maxmind/GeoLiteCity.dat"
geoip.memory-cache = "enable"

db-filename ist die Datenbank von Maxmind. Wenn memory-cache aktiviert ist, wird die gesamte Datenbank im Arbeitsspeicher gehalten, dadurch werden die Lookups enorm beschleunigt.
Die monatlich aktualisierte Datenbank bekommt ihr unter http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz.

Jetzt steht dir das GeoIP-Modul zur Verfügung. Wenn du als Datenbank GeoLiteCity einsetzt, setzt Lighty folgende Environmentvariablen:

GEOIP_COUNTRY_CODE
GEOIP_COUNTRY_CODE3
GEOIP_COUNTRY_NAME
GEOIP_CITY_NAME
GEOIP_CITY_POSTAL_CODE
GEOIP_CITY_LATITUDE
GEOIP_CITY_LONG_LATITUDE
GEOIP_CITY_DMA_CODE
GEOIP_CITY_AREA_CODE
These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • StumbleUpon
  • Reddit
  • Webnews
  • MisterWong
  • Y!GG
  • Technorati
  • Facebook
  • Furl
  • Google Bookmarks
  • Slashdot
  • Ask
  • Hype
  • Netscape
  • Readster
  • YahooMyWeb