Nginx geoip

Nginx geoip

Nginx GeoIP 过滤器根据来自 Maxmind GeoLite2 数据库的数据添加有关 IP 地址的地理位置的信息。 通过 IP 区别国内或国外,从而跳转到不同的页面,最终用 nginx 的第三方 module。

Nginx geoip使用场景

如果想屏蔽某个地区的 IP 访问的话,用 iptables 把来自某个国家的 IP 重定向到预定页面不是特别灵活的办法,如果只有一个 IP 可用而有多个网站在同一 VPS 上怎么办?用 iptable 屏蔽某个网站的话也会屏蔽同一 VPS 上的其他网站的访问。所以正统的办法还是用 GeoIP 配合对应的 web 服务器模块,比如:apache + mod_geoip 或者 nginx + http_geoip_module 等。

Nginx安装geoip模块

检查GeoIP是否安装

首先需要确认当前安装的 Nginx 是否安装了 GeoIP 模块,我们使用 Nginx -V 命令,我们在控制台输出,如下命令:

nginx -V

执行完毕后,此时,如下图所示:

06_nginx geoip.png

如果版本信息中包含 --with-http_geoip_module,则说明已经支持该模块,我们看到,此时我们没有安装 geo-ip 模块。

安装GeoIP

首先安装依赖

yum -y install zlib zlib-devel

安装 GeoIP

$ wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz $ tar -zxvf GeoIP.tar.gz $ cd GeoIP-1.4.8 $ ./configure $ make $ make install

使用 ldconfig 将库索引到系统中

$ echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf $ ldconfig

检查库是否加载成功

$ ldconfig -v | grep GeoIP libGeoIPUpdate.so.0 -> libGeoIPUpdate.so.0.0.0 libGeoIP.so.1 -> libGeoIP.so.1.4.8 libGeoIPUpdate.so.0 -> libGeoIPUpdate.so.0.0.0 libGeoIP.so.1 -> libGeoIP.so.1.5.0

Nginx geoip使用

首先查看本地是否已有 GeoIP 数据库

$ cd /usr/local/share/GeoIP $ ll -rw-r--r--. 1 root root 1183408 Mar 31 06:00 GeoIP.dat -rw-r--r--. 1 root root 20539238 Mar 27 05:05 GeoLiteCity.dat

如果没有这两个库,则手动下载

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz gzip GeoLiteCity.dat.gz wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz gzip GeoIP.dat.gz

将库地址配置到 nginx.conf 中这个位置

http{ ... geoip_country /usr/local/share/GeoIP/GeoIP.dat; geoip_city /usr/local/share/GeoIP/GeoLiteCity.dat; server { location / { root /www; if( $geo_country_code = CN ){ root /www/zh; } } } }

其他参数解释如下:

参数 说明
$geoip_country_code 两个字母的国家代码,如:”RU”, “US”。
$geoip_country_code3 三个字母的国家代码,如:”RUS”, “USA”。
$geoip_country_name 国家的完整名称,如:”Russian Federation”, “United States”。
$geoip_region 地区的名称(类似于省,地区,州,行政区,联邦土地等),如:”30”。 30 代码就是广州的意思
$geoip_city 城市名称,如”Guangzhou”, “ShangHai”(如果可用)。
$geoip_postal_code 邮政编码。
$geoip_city_continent_code
$geoip_latitude 所在维度。
$geoip_longitude 所在经度。

Nginx geoip配置实例

允许某些地区访问

server { ··· set $where_are_you_from 0; if ($geoip_country_code = CN) { set $where_are_you_from 1; } location /Document/ { default_type text/html; charset utf-8; if ($where_are_you_from = 0) { return 200 'This resource is not available in your country!'; } } ···}

禁止部分地区访问

map $geoip_country_code $disallowed_country { default no; US yes; CN no;}server { ··· location /Document/ { default_type text/html; charset utf-8; if ($disallowed_country) { return 200 'This resource is not available in your country!'; } } ···}

Nginx geoip总结

Nginx GeoIP 过滤器根据来自 Maxmind GeoLite2 数据库的数据添加有关 IP 地址的地理位置的信息。 通过 IP 区别国内或国外,从而跳转到不同的页面,最终用 nginx 的第三方 module。