nginx通过GeoIP模块限制国家地区用户访问(Debian/Ubuntu/CentOs环境)

本文介绍如何使用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,在相关地方加上如下的配置就可以了:

# vi /etc/nginx/nginx.conf

http {
...
geoip_country /home/vpsee/GeoIP.dat;
fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3;
fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
...
}

server {
...
        location / {
            root   /home/vpsee/www;
            if ($geoip_country_code = CN) {
                root /home/vpsee/cn;
            }
            ...
        }
...
}

这样,当来自中国的 IP 访问网站后就自动访问到预定的 /home/vpsee/cn 页面。关于 Nginx + GeoIP 还有很多有用的用法,比如做个简单的 CDN,来自中国的访问自动解析到国内服务器、来自美国的访问自动转向到美国服务器等。MaxMind 还提供了全球各个城市的 IP 信息,还可以下载城市 IP 数据库来针对不同城市做处理。

4、重启nginx

/etc/init.d/nginx reload

这样我们就实现了nginx限制某个地区用户访问的功能。

nginx通过GeoIP模块限制国家地区用户访问(Debian/Ubuntu/CentOs环境)》有1个想法

  1. fredzeng

    这个模块基于客户端的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

评论已关闭。