10 Abr, 2009

Instalación de mod_geoip en Lighttpd para geolocalización basada en País/Ciudad

Posted by: leopoldomaestro In: lighttpd|Linux

Este howto es el primero de una serie de traducciones de howto´s realizados por Vivek Gite (cyberciti.biz) y HowtoForge.

light_logo

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;
?>

Sin Respuestas en "Instalación de mod_geoip en Lighttpd para geolocalización basada en País/Ciudad"

Haz un comentario

Categorias

Publicidad

Sobre el blog

Blog personal de Leopoldo Maestro en el que se cubren noticias, curiosidades y experiencias relacionadas con la Administración de Sistemas, Networking, Negocios, Tecnología...

Publicidad