DEV Community

Cover image for Série Nginx #5: Trabalhando com Geolocalização por IP
Valdeir S.
Valdeir S.

Posted on • Edited on

Série Nginx #5: Trabalhando com Geolocalização por IP

Opa!!! Vamos aprender a configurar nosso primeiro módulo externo. 🤓🤓

Aprenderemos como realizar bloqueio e balancear requisições conforme a região do usuário.

Para realizar o bloqueio por cidade ou país, utilizaremos o módulo GeoIP.

Caso você não saiba instalar um módulo, acesse o capítulo Série Nginx #4: Instalando módulos de terceiros.

Após instalar o módulo, carregue-o no arquivo de configuração do Nginx.

echo "load_module modules-available/ngx_http_geoip2_module.so;" \
    | sudo tee -a /etc/nginx/modules-enabled/geoip2.conf
Enter fullscreen mode Exit fullscreen mode

GeoIP2 Databases

Agora é necessário baixar os arquivos .mmdb. Eles possuem as configurações e regras necessárias para o módulo. Para isso, acesse o site https://dev.maxmind.com/geoip/geolite2-free-geolocation-data e realize o download. Após baixá-los, extraia em uma pasta como /etc/nginx/GeoIP2, por exemplo.


Configurando o módulo

Para configurar é simples. Iremos carregar o arquivo baixado e criar nossas variáveis que terão os valores de código de país, cidade e/ou continente.

http {
    ...

    # Cria variáveis relacionadas ao país de acesso
    #
    geoip2 GeoIP2/GeoLite2-Country.mmdb {
        $geoip2_data_continent_code   default="NU" continent code;
        $geoip2_data_country_iso_code country iso_code;
        $geoip2_metadata_country_build metadata build_epoch;
    }

    # Cria variáveis relacionadas à cidade de acesso
    #
    geoip2 GeoIP2/GeoLite2-City.mmdb {
        $geoip2_data_city_name   city names en;
        $geoip2_data_postal_code postal code;
        $geoip2_data_latitude    location latitude;
        $geoip2_data_longitude   location longitude;
        $geoip2_data_state_name  subdivisions 0 names en;
        $geoip2_data_state_code  subdivisions 0 iso_code;
    }
}
Enter fullscreen mode Exit fullscreen mode

Ainda no bloco http, criaremos uma variável com a diretiva map para definir quais países terão permissão ou não de acesso.

http {
    ...

    # Permite apenas países lusófonos
    #
    map $geoip2_data_country_code $country_blocked {
        default 1;

        AO 0;
        BR 0;
        CV 0;
        GW 0;
        MZ 0;
        PT 0;
        ST 0;
        TL 0;
        GQ 0;
    }
}
Enter fullscreen mode Exit fullscreen mode

Permite todos os países que possua o valor "0" tenham permissão de acesso.

No contexto server, definiremos nossa condição.

server {
    server_name valdeir.dev;

    if ($country_blocked) {
        return 403;
    }
}
Enter fullscreen mode Exit fullscreen mode

Reincie o Nginx e faça o teste.

nginx -s reload
Enter fullscreen mode Exit fullscreen mode

Load Balancer

Além de bloqueios, podemos usar o módulo de GeoIP2 para criar um load balancer por país ou continente, por exemplo.

upstream all {
    server default1.valdeir.dev:8080;
    server default2.valdeir.dev:8080;
}

upstream eu {
    server eu1.example.com:8080;
    server eu2.example.com:8080;
}

upstream as {
    server as1.example.com:8080;
    server as2.example.com:8080;
}

http {
    geoip2 GeoIP2/GeoLite2-Country.mmdb {
        $geoip2_data_continent_code continent code;
    }

    map $geoip2_data_continent_code $nearest_server {
        default all;

        EU      eu;
        AS      as;
    }

    server {
        listen 80;
        proxy_pass http://$nearest_server;
    }
}
Enter fullscreen mode Exit fullscreen mode

Conclusão

Parabéns! Concluímos mais uma etapa. Caso tenha dúvidas ou sugestões, só deixar nos comentários.

Top comments (0)