Nginx GeoIP 过滤器根据来自 Maxmind GeoLite2 数据库的数据添加有关 IP 地址的地理位置的信息。 通过 IP 区别国内或国外,从而跳转到不同的页面,最终用 nginx 的第三方 module。
如果想屏蔽某个地区的 IP 访问的话,用 iptables 把来自某个国家的 IP 重定向到预定页面不是特别灵活的办法,如果只有一个 IP 可用而有多个网站在同一 VPS 上怎么办?用 iptable 屏蔽某个网站的话也会屏蔽同一 VPS 上的其他网站的访问。所以正统的办法还是用 GeoIP 配合对应的 web 服务器模块,比如:apache + mod_geoip 或者 nginx + http_geoip_module 等。
首先需要确认当前安装的 Nginx 是否安装了 GeoIP 模块,我们使用 Nginx -V 命令,我们在控制台输出,如下命令:
nginx -V
执行完毕后,此时,如下图所示:
如果版本信息中包含 --with-http_geoip_module
,则说明已经支持该模块,我们看到,此时我们没有安装 geo-ip 模块。
首先安装依赖
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
首先查看本地是否已有 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 | 所在经度。 |
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 过滤器根据来自 Maxmind GeoLite2 数据库的数据添加有关 IP 地址的地理位置的信息。 通过 IP 区别国内或国外,从而跳转到不同的页面,最终用 nginx 的第三方 module。