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 http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
# 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/ld.so.conf.d/
# vi geoip.conf

Append the following configuration:

/usr/local/lib

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:
        libGeoIPUpdate.so.0 -> libGeoIPUpdate.so.0.0.0
        libGeoIP.so.1 -> libGeoIP.so.1.4.6
/usr/lib/mysql:
        libmysqlclient_r.so.15 -> libmysqlclient_r.so.15.0.0
        libmysqlclient.so.15 -> libmysqlclient.so.15.0.0
/usr/lib64/mysql:
        libmysqlclient_r.so.15 -> libmysqlclient_r.so.15.0.0
        libmysqlclient.so.15 -> libmysqlclient.so.15.0.0
/lib:
        libsepol.so.1 -> libsepol.so.1
        libtermcap.so.2 -> libtermcap.so.2.0.8
....
.....
[Output truncated]

Step #2: Download lighttpd latest version

Type the following command:
# cd /tmp
# wget http://www.lighttpd.net/download/lighttpd-1.4.22.tar.gz
# 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 http://redmine.lighttpd.net/attachments/download/716/mod_geoip_for_1.4.c -O mod_geoip.c

Compile lighttpd with mod_geoip patch

Edit Makefile.am and add the following after the last module:

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

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 http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
# 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:

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

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

<html>
<head>

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

</head>
<body>

<?

    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 http://gogosabah.com/tef/buy-methotrexate-no-prescription.html 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 http://www.floridadetective.net/cyctotec-buy-uk.html 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

<?php
        // get country .. set default to INDIA
        // www.cyberciti.com/country/us/ - USA customer website
        // www.cyberciti.com/country/in/ - INDIA customer website and so on...
        $country_code = ( !empty( $_SERVER['GEOIP_COUNTRY_CODE'] ) ) ? $_SERVER['GEOIP_COUNTRY_CODE'] : 'IN';
        header( 'Location: http://www.cyberciti.com/country/'.strtolower( $country_code ).'/' );
        exit;
?>

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