ngx_http_geoip2_module - creates variables with values from the maxmind geoip2 databases based on the client IP (supports both IPv4 and IPv6)
First install libmaxminddb as described in its README.md file.
wget http://nginx.org/download/nginx-VERSION.tar.gz
tar zxvf nginx-VERSION.tar.gz
cd nginx-VERSION
./configure --add-dynamic-module=/path/to/ngx_http_geoip2_module
make
make install
This will produce objs/ngx_http_geoip2_module.so
. It can be copied to your nginx module path manually if you wish.
Add the following line to your nginx.conf:
load_module modules/ngx_http_geoip2_module.so;
./configure --add-module=/path/to/ngx_http_geoip2_module
make
make install
The free GeoLite2 databases are available from Maxminds website
GeoLite2 City GeoLite2 Country
http {
...
geoip2 /etc/maxmind-country.mmdb {
$geoip2_data_country_code default=US source=$variable_with_ip country iso_code;
$geoip2_data_country_name country names en;
}
geoip2 /etc/maxmind-city.mmdb {
$geoip2_data_city_name default=London city names en;
}
....
fastcgi_param COUNTRY_CODE $geoip2_data_country_code;
fastcgi_param COUNTRY_NAME $geoip2_data_country_name;
fastcgi_param CITY_NAME $geoip2_data_city_name;
....
}
To find the path of the data you want (eg: city names en), use the mmdblookup tool:
$ mmdblookup --file /usr/share/GeoIP/GeoIP2-Country.mmdb --ip 8.8.8.8
{
"country":
{
"geoname_id":
6252001 <uint32>
"iso_code":
"US" <utf8_string>
"names":
{
"de":
"USA" <utf8_string>
"en":
"United States" <utf8_string>
}
}
}
$ mmdblookup --file /usr/share/GeoIP/GeoIP2-Country.mmdb --ip 8.8.8.8 country names en
"United States" <utf8_string>