本文介绍如何使用GeoIP模块让nginx实现限制某个地区用户访问的功能。nginx要加上 –with-http_geoip_module 参数进行编译。
1、首先我们检查一下nginx是否编译了GeoIP模块
nginx -V
如果你在输出界面看到了 –with-http_geoip_module,那么就说明nginx已经编译了GeoIP模块。
2、接下来我们安装GeoIP数据库
在Debian/Ubuntu系统,我们可以执行下面的命令进行安装:
apt-get install geoip-database libgeoip1
CentOS安装办法: yum -y install geoip-devel
安装完成之后,GeoIP数据库会被安装在 /usr/share/GeoIP/GeoIP.dat。
这个GeoIP.dat是GeoIP数据库文件,使用apt-get命令安装的话这个文件不是最新的,我们可以从 http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz 这里下载最新的GeoIP数据库文件。
mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak
cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
3、现在来配置nginx.conf文件
vi /etc/nginx/nginx.conf
将下面的内容添加进 http {} 区域,并且要放在任何 include 语句之前。
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default yes;
FK no;
FM no;
EH no;
}
上面这些语句是除了 FK,FM,EH这三个地区的用户允许其它地区的用户访问。
也可以只允许部分地区用户访问:
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default no;
FK yes;
FM yes;
EH yes;
}
上面这些语句是除了 FK,FM,EH这三个地区的用户其它地区的用户都不允许访问。
上面的语句只是设置了一个 $allowed_country 变量,要最终实现禁止设置的地区用户访问,我们要对 $allowed_country 变量进行判断处理。
在 server {} 区域里添加以下内容:
if ($allowed_country = no) {
return 403;
}
也可以针对某个特定url进行限制:
location /special {
if ($allowd_country = no) {
return 403;
}
}
配置 中国用户访问其他目录 nginx,在相关地方加上如下的配置就可以了:
这样,当来自中国的 IP 访问网站后就自动访问到预定的 /home/vpsee/cn 页面。关于 Nginx + GeoIP 还有很多有用的用法,比如做个简单的 CDN,来自中国的访问自动解析到国内服务器、来自美国的访问自动转向到美国服务器等。MaxMind 还提供了全球各个城市的 IP 信息,还可以下载城市 IP 数据库来针对不同城市做处理。
4、重启nginx
/etc/init.d/nginx reload
这样我们就实现了nginx限制某个地区用户访问的功能。
这个模块基于客户端的IP地址创建一些ngx_http_geoip_module变量,并与MaxMindGeoIP文件进行匹配,该模块仅用于0.7.63和0.8.6版本之后。
使用前提
这个模块需要geo数据库和读取数据库的库文件。
#Get the free database of geo_city
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
#Get the free database of geo_coundty
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
#Get the libgeoip. In debian you can do like this:
sudo apt-get install libgeoip-dev
#In other systems, you can download the source and compile it youself.
wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
CentOS中可以使用yum:
yum install geoip-devel
编译:
./configure –with-http_geoip_module
示例配置:
http {
geoip_country GeoIP.dat;
geoip_city GeoLiteCity.dat;
…
·指令
geoip_country
语法:geoip_country path/to/db.dat;
默认值:none
使用字段:http
这个指令决定参观者IP所在国家需要使用的.dat文件,设置后该模块会创建以下变量:
·$geoip_country_code; – 两个字母的国家代码,如:”RU”, “US”。
·$geoip_country_code3; – 三个字母的国家代码,如:”RUS”, “USA”。
·$geoip_country_name; – 国家的完整名称,如:”Russian Federation”, “United States”。
如果只需要国家名,则可以使用geoip_country数据库(1.1M),因为geoip_city数据库大小为43M,并且它们在进行查找时是完全缓存到内存中的。
geoip_city
语法:geoip_city path/to/db.dat;
默认值:none
使用字段:http
这个指令决定参观者IP所在国家、地区和城市需要使用的.dat文件,设置后该模块会创建以下变量:
·$geoip_country_code – 两个字母的国家代码,如:”RU”, “US”。
·$geoip_country_code3 – 三个字母的国家代码,如:”RUS”, “USA”。
·$geoip_country_name – 国家的完整名称,如:”Russian Federation”, “United States”(如果可用)。
·$geoip_region – 地区的名称(类似于省,地区,州,行政区,联邦土地等),如:”Moscow City”, “DC”(如果可用)。
·$geoip_city – 城市名称,如”Moscow”, “Washington”(如果可用)。
·$geoip_postal_code – 邮政编码(如果可用)。
·$geoip_city_continent_code(如果可用)。
·$geoip_latitude – 所在维度(如果可用)。
·$geoip_longitude – 所在经度(如果可用)。
·参考文档
Original Documentation
Nginx Http GeoIP Module