ngx_http_geoip_module是一个Nginx模块,用于根据客户端IP地址获取地理位置信息,如国家、城市等。它依赖于MaxMind的数据库。文章介绍了如何下载和配置GeoIP数据库,安装相关库,以及在Nginx中启用和配置模块,包括geoip_countryfile和geoip_cityfile指令。此外,还提供了示例配置和测试方法。
ngx_http_geoip_module模块使用预编译的MaxMind数据库,根据客户端IP地址创建变量值 ,读取ip所在地信息。
当使用支持IPv6的数据库(1.3.12, 1.2.7)时,IPv4地址被查找为IPv4映射的IPv6地址。
默认情况下不构建此模块,应 使用 --with-http_geoip_module 配置参数启用它。
此模块需要 MaxMind GeoIP 库
Example Configuration
http {
geoip_country GeoIP.dat;
geoip_city GeoLiteCity.dat;
geoip_proxy 192.168.100.0/24;
geoip_proxy 2001:0db8::/32;
geoip_proxy_recursive on;
...
}
使用场景:
句法:geoip_country file;
默认:—
配置项:http
功能:指定用于根据客户端 IP 地址确定国家/地区的数据库。使用此数据库时可以使用以下变量:
句法:geoip_city file;
默认:—
配置项:http
功能:指定用于根据客户端IP地址确定国家、地区和城市的数据库。使用此数据库时可以使用以下变量:
句法:geoip_org file;
默认:—
配置项:http
功能:该指令出现在版本 1.0.3 中。指定用于根据客户端 IP 地址确定组织的数据库。使用此数据库时,以下变量可用:
句法:geoip_proxy address | CIDR;
默认:—
配置项:http
功能:定义可信地址。当请求来自受信任的地址时,将使用“X-Forwarded-For”请求标头字段中的地址。
3.1、下载IP数据库
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
上面的地址已失效(Maxmind不再支持Geolite产,仅支持Geolite2),可以从GeoIP Legacy Databases下载
在目录下会生成2个.gz的文件, 解压生成2个.dat文件然后将它们拷贝至/etc/nginx/geoip目录下:
$ gzip -d -k GeoIP.dat.gz
$ gzip -d -k GeoLiteCity.dat.gz
$ sudo mkdir /etc/nginx/geoip
$ sudo cp GeoIp.dat /etc/nginx/geoip
$ sudo cp GeoLiteCity.dat /etc/nginx/geoip
IP 地域数据库(GeoIP.dat)文件是二进制的,需要用GeoIP库来读取。所以除了要下载 GeoIP.dat 文件外,还需要安装能读取这个文件的库。
$ wget https://launchpadlibrarian.net/96958425/GeoIP-1.4.8.tar.gz
# http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz失效
$ tar -zxvf GeoIP-1.4.8.tar.gz
$ cd GeoIP-1.4.8 # 注意这个解压出的版本随时在变,我解压时,是1.4.8版本的
$ ./configure
$ make; make install
上面的操作,将工具安装到了/usr/local/lib目录下,我们需要让其生效。
$ echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf
$ ldconfig
查看有没有geoip模块:若没有 则 使用 --with-http_geoip_module 配置参数编译nginx
# 引入地域ip文件
geoip_country /etc/nginx/geoip/GeoIp.dat;
geoip_city /etc/nginx/geoip/GeoLiteCity.dat;
server {
listen 8088;
server_name localhost;
root /usr/share/nginx/html/;
#set $geoip_country_code "hh";
#set $geoip_country_name "china";
#set $geoip_city "nj";
# 所在国代码不是CN则拦截,返回403
location / {
if ($geoip_country_code != CN) {
return 403;
}
index index.html index.htm;
}
# 测试本地ip的所在国名称/所在国代码/所在城市名称
location /myip {
default_type text/plain;
add_header X-Geo $geoip_country_code;
add_header X-Geo3 $geoip_country_code3;
return 200 "$remote_addr $geoip_country_name $geoip_country_code $geoip_city";
}
}
阿里云机器,ECS公网IP: 47.103.25.92
在代理的情况下($geoip_country_code不为CN)访问nginx, 结果如下:
在无代理的情况下用本地ip($geoip_country_code为CN)访问nginx, 结果如下: