Tras la guía básica de cómo preparar tu sistema para compilar módulos (la cual la puedes encontrar aquí), es hora de que aprendamos a compilar GeoIP2 en OpenResty. Para empezar lo haremos con este módulo, el cual es relativamente fácil de compilar. Yo uso Debian por norma, por lo que los pasos los haré para Debian 10.

Supongo que has llegado aquí porque sabes qué es el módulo GeoIP2. Si no lo sabes, es un modulo que te permitirá geolocalizar a los usuarios a través de su dirección IP. Así podrás saber de qué país vienen y bloquear países por ejemplo. Incluye más datos, como ciudad e incluso CP, pero cuanto más ajustado quieras que sea más margen de error puede tener. Dispone de la versión de pago la cual es más precisa, pero aquí hablaré de la versión gratuita.

Bueno, continuando con lo que nos interesa, lo primero que tienes que hacer es preparar Debian para que puedas compilar, para lo cual te recomiendo si no lo hiciste, pasarte por el enlace del post que hay en el primer párrafo.

Una vez preparado el servidor, crearemos una carpeta temporal para todo el trabajo, por ejemplo /tmp/compile, y entraremos en ella:

mkdir /tmp/compile && cd /tmp/compile

Una vez ahí nos descargaremos el código fuente del OpenResty que corresponda con la versión instalada y lo descomprimiremos. Para ello podemos utilizar estos comandos:

wget https://openresty.org/download/openresty-$(openresty -v 2>&1|cut -d "/" -f2).tar.gz
tar xvf openresty-$(openresty -v 2>&1|cut -d "/" -f2).tar.gz

Una vez que tengamos descomprimido el código fuente, tendremos que descargar el código fuente del módulo GeoIP2 desde este enlace. Crearemos una carpeta llamada modules en la carpeta del código fuente del OpenResty, y luego descargaremos el código fuente de GeoIP2:

mkdir /tmp/compile/openresty-$(openresty -v 2>&1|cut -d "/" -f2)/modules
cd /tmp/compile/openresty-$(openresty -v 2>&1|cut -d "/" -f2)/modules
git clone https://github.com/leev/ngx_http_geoip2_module.git

Una vez hecho, nos habrá creado una carpeta llamada ngx_http_geoip2_module dentro de la que acabamos de crear, con el código fuente del módulo GeoIP2. Lo siguiente a hacer es instalar los requisitos básicos de la librería, para lo que usaremos el siguiente comando:

apt-get install libmaxminddb0 libmaxminddb-dev

Una vez instalado, navegaremos a la carpeta donde está el código fuente del Nginx dentro de la carpeta bundle, y ejecutar los comandos de compilación:

# Navega a la carpeta del código fuente del Nginx
cd ../bundle/nginx-$(openresty -v 2>&1|cut -d "/" -f2|grep -oP '^\d+.\d+.\d+')

# Variables de entorno necesarias para la compilación
export LUAJIT_LIB="/usr/local/openresty/luajit/lib/"
export LUAJIT_INC="../LuaJIT-*/src/"

# Recuperamos las opciones con las que está compilado
# OpenResty para evitar el error de binario no compatible
COMPILEOPTIONS=$(openresty -V 2>&1|grep -i "arguments"|cut -d ":" -f2-)

# Configuramos la compilación con las opciones 
# recuperadas arriba, y añadiendo GeoIP2 como
# módulo dinámico
eval ./configure $COMPILEOPTIONS --add-dynamic-module=../../modules/ngx_http_geoip2_module

# Compilamos el módulo.
make modules

Una vez que haya terminado la compilación del módulo, lo tendremos en la carpeta obj que está en la misma carpeta que estamos ahora mismo (la del código fuente del Nginx):

ls -la objs/ngx_stream_geoip2_module.so

Utiliza el módulo GeoIP2 en OpenResty

Copiarlo y activarlo

Ahora que ya tenemos el módulo compilado, podremos empezar a usarlo en nuestro OpenResty. Este módulo es simple, pero nos permite realizar cosas muy interesantes, como bloquear países que no queramos que entren a nuestro servidor, llevar estadísticas de países, redireccionar a otros dominios…

Para poder usarlo tendremos que haberlo copiado antes a una carpeta donde OpenResty tenga acceso, por ejemplo podemos crear la carpeta módules:

mkdir /usr/local/openresty/nginx/modules/

Si seguimos en la carpeta donde compilamos anteriormente el módulo, lo copiaremos con el siguiente comando:

cp obj/ngx_stream_geoip2_module.so /usr/local/openresty/nginx/modules/

Y por último añadiremos la siguiente línea al fichero de configuración de OpenResty, el cual es en /usr/local/openresty/nginx/conf/nginx.conf:

load_module modules/ngx_http_geoip2_module.so;

Esta línea iría al principio del fichero, y con ella ya quedaría activado el módulo. Obviamente, no sería útil porque no dispone de BBDD ni de configuración, por lo que aprenderemos a hacerlo en la siguiente sección.

Descargar BBDD de GeoIP2

Ahora que ya tenemos el módulo GeoIP2 en OpenResty, tendremos que descargar la BBDD de GeoIP2. Para ello deberemos ir a la página de MaxMind y registrarnos (ahora es obligatorio):

https://dev.maxmind.com/geoip/geoip2/geolite2/

Recomiendo bajar la BBDD GeoIP Country, ya que es más que suficiente para saber los países de nuestros clientes, aunque también se puede usar la BBDD GeoIP City.

Una vez que tengamos la BBDD descargada, la descomprimiremos y la subiremos a nuestro servidor. Es muy importante que la pongamos en un sitio localizado, ya que necesitaremos la ruta más adelante. En mi caso, siguiendo el esquema del post, la copiaré a la carpeta:

/usr/local/openresty/nginx/maxmind/

Y con eso ya tendríamos la BBDD copiada al servidor y lista para ser usada.

Configurar OpenResty

Ahora que ya tenemos la BBDD, hay que decirle a OpenResty que la use. Para ello volvemos a abrir el fichero de configuración de antes (/usr/local/openresty/nginx/conf/nginx.conf), y añadimos las siguiente líneas dentro del apartado http del mismo:

geoip2 /usr/local/openresty/nginx/maxmind/maxmind-country.mmdb {
    auto_reload 5m;
    $geoip2_metadata_country_build metadata build_epoch;
    $geoip2_data_country_code default=US source=$remote_addr country iso_code;
    $geoip2_data_country_name country names en;
}

En estas líneas estamos configurando:

  • Que recargue el fichero cada 5 minutos por si se hubiese actualizado. Útil para automatizar su actualización sin tener que hacer reload del OpenResty.
  • Guardará en la variable $geoip2_data_country_code el código del país en formato de dos letras (iso3166), siendo por defecto US si no lo tuviera.
    Más info: https://dev.maxmind.com/geoip/legacy/codes/iso3166/
  • La variable $geoip2_data_country_name contendrá el nombre completo del país en el idioma indicado al final. Disponemos de los siguientes idiomas:
    • de: Alemán
    • en: Inglés
    • es: Español
    • fr: Francés
    • ja: Japonés
    • pt-BR: Portugués de Brasil
    • ru: Ruso
    • zh-CN: Chino

A partir de ahora, ya podremos utilizar las variables indicadas arriba para lo que queramos. Hay más variables además de las indicadas arriba, de las cuales encontrarás más información en la web de MaxMind.

Como siempre, espero que esta guía os sirva, y no olvidéis de compartir y/o dejar algún comentario si os ha gustado.

¡Un saludo!

Daniel Carrasco

DevOps con varios años de experiencia, y arquitecto cloud con experiencia en Google Cloud Platform y Amazon Web Services. En sus ratos libres experimenta con Arduino y electrónica.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.