wget https://github.com/maxmind/libmaxminddb/releases/download/1.3.2/libmaxminddb-1.3.2.tar.gz
tar -zxvf libmaxminddb-1.3.2.tar.gz
cd libmaxminddb-1.3.2
./configure && make && make install
echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf
ldconfig
killall nginx / /application/nginx/sbin/nginx -s quit
mv /application/nginx/sbin/nginx /application/nginx/sbin/nginx_old
cd /application/software/
git clone https://github.com/leev/ngx_http_geoip2_module.git
cd /application/software/nginx-1.14.2/
# nginx -V
./configure --user=www --group=www --prefix=/application/nginx1.14.2 --with-openssl=/application/software/openssl-1.0.2o --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-ld-opt=-ljemalloc --add-module=/application/software/ngx_http_geoip2_module
# don't execute "make install"
make
cp objs/nginx /application/nginx/sbin/nginx
mkdir /application/nginx/modules
# if nginx compiled by dynamic
cp objs/ngx_http_geoip2_module.so /application/nginx/modules/
# https://www.maxmind.com/en/home christ1208@gmail.com / Airmacau@2019
# https://dev.maxmind.com/geoip/geoipupdate/
# https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=&suffix=tar.gz
download and upload GeoLite2-City.mmdb to /application/nginx/modules/
# nginx.conf
cp /application/nginx/conf/nginx.conf /application/nginx/conf/nginx.conf_20201204
cp /application/nginx/conf/vhost/web_api_app_admin_wx.conf /application/nginx/conf/vhost/bak/web_api_app_admin_wx.conf_20201204
vim /application/nginx/conf/nginx.conf
# resolve multiple IP addresses in X-Forwarded-For
map $http_x_forwarded_for $realip {
~^(\d+\.\d+\.\d+\.\d+) $1;
default $remote_addr;
}
geoip2 /application/nginx/modules/GeoLite2-City.mmdb {
auto_reload 5m;
$geoip2_metadata_country_build metadata build_epoch;
$geoip2_continent_code source=$realip continent code;
$geoip2_continent_name source=$realip continent names en;
$geoip2_data_country_name source=$realip country names en;
$geoip2_data_country_code source=$realip country iso_code;
$geoip2_data_city_name source=$realip city names en;
$geoip2_data_time_zone source=$realip location time_zone;
}
map $geoip2_continent_code $allowed_status {
default no;
# Asia
AS yes;
# Africa
AF no;
# Antarctica
AN no;
# Europe
EU no;
# North america
NA no;
# Oceania
OC no;
# South america
SA no;
}
log_format mmdb_visit escape=json
'{'
'"allowed_status":"$allowed_status",'
'"client_ip": "$realip",'
'"time_local":"$time_local",'
'"request_method":"$request_method",'
'"request":"$request",'
'"response_status": "$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"geoip_city": "$geoip2_data_city_name",'
'"geoip_country_code": "$geoip2_data_country_code",'
'"geoip_country_name": "$geoip2_data_country_name",'
'"geoip_continent_code": "$geoip2_continent_code",'
'"geoip_continent_name": "$geoip2_continent_name",'
'"geoip_timezone": "$geoip2_data_time_zone"'
'}';
vim /application/nginx/conf/vhost/web_api_app_admin_wx.conf
access_log /application/logs/nginx/web_app_api_wx_admin_mmdb_visit.log mmdb_visit;
if ($allowed_status = no) {
return 500;
}
location /ip {
default_type text/plain;
return 200 "RemoteIP: $realip \n
City name: $geoip2_data_city_name \n
Country code: $geoip2_data_country_code \n
Country name: $geoip2_data_country_name \n
Continent code: $geoip2_continent_code \n
Continent name: $geoip2_continent_name \n";
}
/application/nginx/sbin/nginx -s reload
tail -f /application/logs/nginx/web_app_api_wx_admin_mmdb_visit.log
# testing
mmdblookup --file /application/nginx/modules/GeoLite2-City.mmdb --ip 202.175.105.131