10 Abr, 2009
Instalación de mod_geoip en Lighttpd para geolocalización basada en País/Ciudad
Este howto es el primero de una serie de traducciones de howto´s realizados por Vivek Gite (cyberciti.biz) y HowtoForge.
El software de geolocalización es usado para conseguir la localización geográfica de un visitante por medio de su dirección IP. Es posible determinar un país, organización y conjeturar la localización del visitante. Esto es util para
a) Detección de fraudes
b) Geo marketing y servicios de publicidad
c) Contenido para un público objetivo
d) Lucha contra el Spam
e) Y mucho más
mod_geoip dispone de un modulo de Lighttpd para la resolución rapida de ip/localización. En este tutoriál vas a aprender como instalar mod_geoip y te mostrare algunos ejemplos en PHP de lado servidor para determinar el país del visitante.
mod_geoip usa las bases de datos MaxMind GeoIP / GeoCity, las cuales disponen de dos versiones:
- Versión gratuita: La base de datos de paises y ciudades son gratuitas, con un 99,5% de exactitud.
- Versión de pago: Si necesitas un 99,8 % de exactitud y otros fantásticos detalles acerca de la dirección IP, la versión de pago es tu elección.
Echa un vistazo a está página para una comparativa entre las versiones de pago y gratuitas.
Una nota para los usuarios de CentOS / RHEL / Fedora
Si estas usando un repositorio de terceras partes (ver el FAQ de RPMforge y EPEL para su instalación), puedes instalar un paquete binario de mod_geoip e ir directamente a la parte de configuración:
# yum install lighttpd-mod_geoip
Paso # 1: Instalar C API para mod_geoip
Escribimos el siguiente comando para descargar y extraer el C API de MaxMind:
# cd /tmp
# wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
# tar -zxvf GeoIP.tar.gz
Configurar, compilar y instalar C API:
# cd GeoIP-1.4.6
# ./configure
# make
# make install
Configurar GNU ld
Es necesario linkar mod_geoip usando la C API. Configuramos el enlazador dinamico para realizar el enlace dinamico en tiempo de ejecución:
# cd /etc/ld.so.conf.d/
# vi geoip.conf
Añadimos la siguiente configuración al fichero:
/usr/local/lib Guardamos y cerramos el archivo. Lanzamos ldconfig para activar la configuración:
# ldconfig
Verificamos que el nombre de cada directorio incluyendo /usr/local/lib es comprobado, y que todos los enlaces son creados:
# ldconfig -v | less
Ejemplo de salida:
/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 .... ..... [Salida cortada]
Paso #2: Descargar la última versión de Lighttpd
Escribimos el siguiente comando:
# 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
Paso #3: Descargar el parche mod_geoip
Lanzamos el siguiente comando:
# cd lighttpd-1.4.22/src
# wget http://redmine.lighttpd.net/attachments/download/716/mod_geoip_for_1.4.c -O mod_geoip.c
Compilar lighttpd con el parche mod_geoip
Editamos el archivo Makefile.am y añadimos lo siguiente después del último modulo:
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 Salvamos el archivo y salimos. Pasamos a compilar lighttpd:
# cd ..
# aclocal
# automake -a
# autoconf
# make clean
Ahora debes usar el flag –enable-maintainer-mode:
# ./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
Paso # 4: Descargar la base de datos Geo Lite (Versión gratuita)
Escribimos el siguiente comando:
# wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
# gunzip GeoIP.dat.gz
# ls -lh GeoIP.dat
Ejemplo de salida:
-rw-r--r-- 1 root root 1.1M Mar 9 21:13 GeoIP.dat
Instalar el archivo GeoIP.dat :
# mkdir /usr/local/GeoIP
# cp -v GeoIP.dat /usr/local/GeoIP
Paso # 5: Configurar Lighttpd
Abrimos el fichero lighttpd.conf y añadimos la siguiente configuración. Primero, habilitaremos mod_geoip
server.modules += "mod_geoip" Finalmente, configuramos la ruta al fichero GeoIP.dat y activamos el cacheo en memoria para resoluciones más rapidas:
geoip.db-filename = "/usr/local/GeoIP/GeoIP.dat" geoip.memory-cache = "enable"
Salvamos el fichero de configuración y reiniciamos Lighttpd
# /etc/init.d/lighttpd restart
Paso # 6: Comprobar la configuración
mod_geoip va a establecer las siguientes variables de entorno:
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 Es posible usar diversos lenguajes de programación de lado servidor para determinar la GEO localización del visitante. A continuación pongo algunos ejemplos en PHP:
What is my IP address – determine or retrieve my IP address
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 «Your country : $country»;
?>
// 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;
?>