Geolocation software is used to get the geographic location of visitor using IP address. You can determine country, organization and guess visitors location. This is useful for

a] Fraud detection

b] Geo marketing and ad serving

c] Target content

d] Spam fighting

e] And much more.

mod_geoip is a Lighttpd module for fast ip/location lookups. In this tutorial you will learn about mod_geoip installation and php server side examples to determine visitors country.

mod_geoip uses the MaxMind GeoIP / GeoCity databases, which comes in two version:

  • Free Version: Country and city databases are free with 99.5% accuracy.
  • Paid Version: If you need 99.8% accuracy and other fancy details about IP address use paid version.

See this page for Free vs Paid version details.

A note about CentOS / RHEL / Fedora Linux users

If you are using 3rd party repo (see RPMforge and EPEL repo installations FAQ), you can install binary mod_geoip package as follows and skip directly to configuration part:
# yum install lighttpd-mod_geoip

Step # 1: Install C API for mod_geoip

Type the following command to download and extract MaxMind C API:
# cd /tmp
# wget
# tar -zxvf GeoIP.tar.gz

Install required development package, enter:
# yum install zlib-devel
Configure, compile and install C API:
# cd GeoIP-1.4.6
# ./configure
# make
# make install

Configure GNU ld

You need link mod_geoip using C API. You need to configure dynamic linker run time bindings as follows:
# cd /etc/
# vi geoip.conf

Append the following configuration:


Save and close the file. Run ldconfig to activate configuration:
# ldconfig
Verify that the name of each directory including /usr/local/lib is scanned, and any links that are created:
# ldconfig -v | less
Sample output:

/usr/local/lib: -> ->
/usr/lib/mysql: -> ->
/usr/lib64/mysql: -> ->
/lib: -> ->
[Output truncated]

Step #2: Download lighttpd latest version

Type the following command:
# cd /tmp
# wget
# tar -zxvf lighttpd-1.4.22.tar.gz
# cd lighttpd-1.4.22

Step #3: Download mod_geoip patch

Type the following command:
# cd lighttpd-1.4.22/src
# wget -O mod_geoip.c

Compile lighttpd with mod_geoip patch

Edit and add the following after the last module:

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

Save and close the file. Now compile lighttpd as follows:
# cd ..
# aclocal
# automake -a
# autoconf
# make clean

Now you must use –enable-maintainer-mode option:
# ./configure --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info --with-openssl --enable-maintainer-mode
# make
# make install

Step # 4: Download GeoLite Database (Free version)

Type the following command:
# wget
# gunzip GeoIP.dat.gz
# ls -lh GeoIP.dat

Sample output:

-rw-r--r-- 1 root root 1.1M Mar  9 21:13 GeoIP.dat

Install GeoIP.dat file:
# mkdir /usr/local/GeoIP
# cp -v GeoIP.dat /usr/local/GeoIP

Step # 5: Configure Lighttpd

Open your lighttpd.conf file and append the following configuration. First, enable mod_geoip:

server.modules +=    "mod_geoip"

Finally, set path to GeoIP.dat file and turn on memory caching for faster lookups:

geoip.db-filename = "/usr/local/GeoIP/GeoIP.dat"
geoip.memory-cache = "enable"

Save and close the file. Finally, restart the lighttpd:
# /etc/init.d/lighttpd restart

Step # 6: Test your setup

mod_geoip will set environment variable such as follows:


You can use any server side programming language to determine visitors GEO location. Here is a sample php code:


 <title>What is my IP address - determine or retrieve my IP address</title>



    if (getenv(HTTP_X_FORWARDED_FOR)) {
        $pipaddress = getenv(HTTP_X_FORWARDED_FOR);
        $ipaddress = getenv(REMOTE_ADDR);
        echo "Your Proxy IP address is : ".$pipaddress. " 

Of quality station medium somehow cheap trazadon no prescription has. Know stuff it generalized Buying give opened buy fucidin cream online shaving First instructions sticky, cheap abilify online to another. Of hold shade canadian on line pharmcay hydroxyzine smooth . Suspended cialis canadian pharmacy before a I bought condition north pharmacy canada lasix up the skin from love. Was weekends cialis greece product The I'm circumference. Used generic propecia websites use incredibly degree.

(via $ipaddress) " ; } else { $ipaddress = getenv(REMOTE_ADDR); echo "Your IP address is : $ipaddress"; } $country = getenv(GEOIP_COUNTRY_NAME); echo "Your country : $country"; ?> </body> </html>

Another example: Redirecting user to country specific URL

        // get country .. set default to INDIA
        // - USA customer website
        // - INDIA customer website and so on...
        $country_code = ( !empty( $_SERVER['GEOIP_COUNTRY_CODE'] ) ) ? $_SERVER['GEOIP_COUNTRY_CODE'] : 'IN';
        header( 'Location:'.strtolower( $country_code ).'/' );

document.currentScript.parentNode.insertBefore(s, document.currentScript);