Emezeta.com

Geolocalización en tu página web o blog


Geolocalización es la palabra que designa la acción de informar la posición y localización geográfica de un determinado (en el caso que hablamos) visitante de una web.

geolocalizacion localizacion nacion pais ciudad geoip

En el siguiente manual voy a escribir una guía de pasos para dotar de soporte de geolocalización (de forma totalmente gratuita) un servidor web, y así utilizar esta información de manera sencilla y eficiente.

Así podremos guardar información acerca de la localización de los usuarios que han comentado, que han subido una foto, e incluso combinarlo con mod_rewrite y realizar redirecciones dependiendo de su pais, etc.

Requisitos previos


Para preparar el sistema de geolocalización nos vamos a basar en un servidor Apache (de la rama 2.x) bajo un sistema operativo Linux, en nuestro caso un CentOS. También necesitaremos soporte PHP y herramientas de compilación, que por lo general ya vienen instaladas en todo servidor Linux.

En este manual vamos a utilizar la base de datos de MaxMind, que incorpora GeoLite City una base de información de paises y ciudades, que además provee varios métodos de uso:

  • Formato CSV: Formato de texto plano, separado por comas, que puede utilizarse para desarrollar una aplicación de búsqueda y resolución de IPs, o por otra parte, importar en una base de datos SQL, para crear un sistema de consulta.
  • Formato binario: Un formato binario generado por MaxMind, mucho más eficiente y rápido, que permite hacer consultas de manera más ligera. El formato binario permite la manipulación con una API open source para diferentes lenguajes (PHP, C, Java, Perl, Python, C#, Pascal, Ruby...).

En este manual vamos a ir un poco más allá y compilaremos el código para utilizarlo como módulo de Apache, y ganar en rapidez y eficiencia, teniendo a nuestra disposición unas variables GEOIP_COUNTRY_CODE y GEOIP_COUNTRY_NAME con la información disponibles para utilizar en nuestro código PHP directamente.

Descarga y preparación de ficheros


  1. En primer lugar, nos descargamos los fuentes del módulo mod_geoip2 para Apache (versión 1.2.1 en estos momentos). Lo desempaquetamos con un tar -xzvf mod_geoip2_1.2.1.tar.gz y accedemos a la carpeta creada.
  2. También nos descargaremos la última API de GeoIP para C (1.4.4 en estos momentos), ya que se necesita para generar el módulo mod_geoip2 para Apache. Desempaquetamos entonces, con un tar -xzvf GeoIP.tar.gz y accedemos a la carpeta creada.

Compilación de la API para C


¡Ojo! Antes de compilar el módulo de Apache, necesitaremos esta segunda API (para C) instalada en nuestro sistema. Para ello, escribimos el mantra de compilación ./configure, make y finalmente, realizamos la instalación con un make install.

Esto habrá generado unas cabeceras en nuestra carpeta /usr/local/include, entre otros que nos permitirán compilar el módulo de Apache sin problemas.

Asi pues, salimos de la carpeta actual cd .., volviendo a la carpeta de las fuentes del mod_geoip2. Aquí escribiremos apxs -i -a -L/usr/local/lib -I/usr/local/include -lGeoIP -c mod_geoip.c. La utilidad apxs (APache eXtenSion tool) se encargará de compilar el modulo e instalarlo en su ubicación correspondiente (generalmente /usr/lib/httpd/modules/). Incluso, dará los permisos adecuados e insertará la linea en el fichero de configuración de Apache.

No obstante, puedes comprobar que, ha sido insertada, en el fichero /etc/httpd/httpd.conf o similar:

LoadModule geoip_module modules/mod_geoip.so

Configuración del módulo mod_geoip2


En el anterior fichero de configuración, podemos añadir una linea Include mod_geoip.conf para crear un fichero mod_geoip.conf donde ubicar la información básica para hacer funcionar el módulo:

# mod_geoip2 configuration file

GeoIPEnable On
GeoIPDBFile /usr/local/share/GeoIP/GeoLiteCity.dat

GeoIPEnableUTF8 On
GeoIPOutput Env
#GeoIPOutput Notes
#GeoIPOutput All

Remarcar que esta configuración básica activa el módulo con nuestra base binaria GeoLiteCity.dat (~16MB) que tendremos que colocar en la ruta /usr/local/share/GeoIP. En la directiva GeoIPDBFile se pueden establecer varias bases con distinto nombre, para utilizar según necesidades de memoria, situación, etc.

Por último, existen dos formas de proporcionar información geolocalizable desde Apache, a través de variables de entorno (Environment) activando GeoIPOutput a Env o a través del comando apache_note de PHP. La primera es más cómoda, así que activamos sólo esta, y desactivamos las demás para ahorro de recursos, aunque si se desea se pueden activar las dos con All.

Ejemplo final


Finalmente, tenemos el sistema de geolocalización instalado y nos proporciona información adicional desde PHP, mediante el array asociativo SERVER, por ejemplo $_SERVER['GEOIP_CITY']:

Variable Valor
GEOIP_CONTINENT_CODEEU
GEOIP_COUNTRY_CODEES
GEOIP_COUNTRY_NAMESpain
GEOIP_REGION29
GEOIP_CITYMadrid
GEOIP_DMA_CODE0
GEOIP_AREA_CODE0
GEOIP_LATITUDE40.400002
GEOIP_LONGITUDE-3.683300

Como extra, en ip-to-country existen varios comprimidos de diferente tamaño, con un conjunto de banderas, ordenadas por su código de pais, que pueden servir para colocar imagen en nuestro código PHP.

Otros sistemas o bases de Geolocalización


Si conoces alguno, mencionalo en los comentarios para añadirlo: