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. " (via $ipaddress) " ; } else { $ipaddress = getenv(REMOTE_ADDR); echo "Your IP address is : $ipaddress"; } $country = getenv(GEOIP_COUNTRY_NAME); echo "<br />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; ?>
References:
- mod_geoip Patch (for Lighttpd version 1.4)
- Lighttpd web server
- Maxmind Database
- Shell Script To Update MaxMind GeoIP Database
🐧 Get the latest tutorials on Linux, Open Source & DevOps via:
- RSS feed or Weekly email newsletter
- Share on Twitter • Facebook • 10 comments... add one ↓
Category | List of Unix and Linux commands |
---|---|
File Management | cat |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Network Utilities | dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • jobs • killall • kill • pidof • pstree • pwdx • time |
Searching | grep • whereis • which |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
Hello Vivek..
I installed mod_geoip from EPEL repository and tried the ‘What is my IP address’ code above and it worked. Great! 🙂
Now, is there a chance to also display country flags alongside the name of the country? I have those country flags named ‘uk.png, us.png, tr.png’… but frankly have no idea how to do this.
I followed this tutorial exactly the way you wrote it, but for some reason I can’t see the GeoIP commands in my PHP $_SERVER variable. I did this tutorial about 10 times already and I still can’t figure out the problem. I’m running lighttpd on ubuntu karmic. Any ideas what could be the problem?
this works..thanks..
I am using in wordpress with translation plugin 😀
Hi..
Thanks for the detailed tutorial..
helped me a lot..
@svr / Ross:
Yes, Apache got mod_geoip2
Is there is any such module available in apache?
Any chance we may be able to get this tutorial in apache?
Great one. Thank you for the tutorial and is the installation of the paid version is the same………And one request is that could be please even cover tutorial for gentoo Linux…. If you give so I will be grateful to you……………Thanks
Bala
Good post. I had another one, can’t remember the site, but it was XML & MYSQL extracts, however they never updated regularly at all. Monthly is not bad.
Great info! Thanks!