The Nginx IP2Location module enables user to easily perform client's IP to geographical location lookup by using IP2Location database.
The IP2Location database can be downloaded from https://lite.ip2location.com (Free) or https://www.ip2location.com (Commercial).
-
Download IP2location C library from https://github.com/chrislim2888/IP2Location-C-Library
-
Compile and install IP2Location C library.
-
Download IP2Location module and decompress the package.
wget https://github.com/ip2location/ip2location-nginx/archive/master.zip unzip master.zip rm master.zip
-
Download the latest Nginx source code from https://nginx.org/en/download.html
wget https://nginx.org/download/nginx-x.y.z.tar.gz
-
Decompress and go into Nginx source directory.
tar xvfz nginx-x.y.z.tar.gz cd nginx-x.y.z
-
Re-compile Nginx from source to include this module.
Static Module
./configure --add-module=/absolute/path/to/nginx-ip2location-master make make install
Dynamic Module
./configure --add-dynamic-module=/absolute/path/to/nginx-ip2location-master make make install
Insert the configuration below to your nginx.conf
.
Syntax : load_module modules/ngx_http_ip2location_module.so;
Default : -
Context : main
Description : Load IP2Location Nginx module if it was compiled as dynamic.
Syntax : ip2location_database path
Default : none
Context : http
Description : The absolute path to IP2Location BIN database.
Syntax : ip2location_proxy_recursive on|off
Default : off
Context : http
Description : Enable recursive search in the x-forwarded-for headers.
Syntax : ip2location_proxy cidr|address
Default : none
Context : http
Description : Set a list of proxies to translate x-forwarded-for headers for.
Example:
http {
...
ip2location_database /usr/share/ip2location/DB6.BIN;
ip2location_proxy_recursive on;
ip2location_proxy 192.168.1.0/24;
}
The following variables will be made available in Nginx:
$ip2location_country_short
$ip2location_country_long
$ip2location_region
$ip2location_city
$ip2location_isp
$ip2location_latitude
$ip2location_longitude
$ip2location_domain
$ip2location_zipcode
$ip2location_timezone
$ip2location_netspeed
$ip2location_iddcode
$ip2location_areacode
$ip2location_weatherstationcode
$ip2location_weatherstationname
$ip2location_mcc
$ip2location_mnc
$ip2location_elevation
$ip2location_usagetype
$ip2location_addresstype
$ip2location_category
$ip2location_district
$ip2location_asn
$ip2location_as
server {
listen 80 default_server;
root /var/www;
index index.html index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass php-fpm-sock;
fastcgi_index index.php;
include fastcgi.conf;
# Add custom header to view result in HTTP response
add_header X-Country-Code $ip2location_country_short;
add_header X-Country-Name $ip2location_country_long;
fastcgi_param IP2LOCATION_COUNTRY_SHORT $ip2location_country_short;
fastcgi_param IP2LOCATION_COUNTRY_LONG $ip2location_country_long;
fastcgi_param IP2LOCATION_REGION $ip2location_region;
fastcgi_param IP2LOCATION_CITY $ip2location_city;
fastcgi_param IP2LOCATION_ISP $ip2location_isp;
}
}
Notes: Restart Nginx and view your server response header to confirm the variables are added.
if ( $ip2location_country_short = 'US' ) {
return 444;
}
map $ip2location_country_short $blacklist_country {
default no;
AU yes;
IN yes;
NG yes;
}
server {
...
if ( $blacklist_country = yes ) {
return 444;
}
}
Use the IPv4 BIN file if you just need to query IPv4 addresses.
If you query an IPv6 address using the IPv4 BIN, you'll see the INVALID_IP_ADDRESS error.
Use the IPv6 BIN file if you need to query BOTH IPv4 and IPv6 addresses.
Please visit us at https://www.ip2location.com for services and databases we offer.
For support, please email us at [email protected]