简述

  1. 使用nginx采用GeoIP库来实现IP的判断。

  2. GeoIP库可以获取一个IP的国家和城市等等信息,由 maxmind 提供。提供免费版本与收费版本。并且每月第一周的周二都会更新(更新后下载可自行替换字典)。

  3. GeoIP不仅可以用nginx来做屏蔽与国际化,还可以与php,c,java,c# 等语言使用。

  4. 官方:https://www.maxmind.com/zh/home

  5. GeoIP库有GeoIP与GeoIP2。GeoIP为旧版本(不推荐使用), GeoIP2新版本(推荐使用)。且GeoLite2是GeoIP2的免费版。见: https://dev.maxmind.com/zh-hans/

使用

1. http_geoip_module 模块

因为要用到 http_geoip_module 模块,系统自带的 nginx 一般不带这个模块,所以要下载 nginx 源代码后自行编译(安装不作为重点,这里将简单描述,更详细的安装过程请参考目录中的安装过程)。

  1. $ wget http://nginx.org/download/nginx-0.9.6.tar.gz
  2. $ tar zxvf nginx-0.9.6.tar.gz
  3. $ cd nginx-0.9.6
  4. $ # 如果已有nginx还是先根据已装的库做更新,具体方法百度
  5. $ ./configure --without-http_empty_gif_module --with-poll_module
  6. --with-http_stub_status_module --with-http_ssl_module
  7. --with-http_geoip_module
  8. $ make; make install

2. 安装 GeoIP 库

  1. $ wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
  2. $ tar -zxvf GeoIP.tar.gz
  3. $ cd GeoIP-1.4.6
  4. $ ./configure
  5. $ make; make install

库自动安装到 /usr/local/lib 下,所以这个目录需要加到动态链接配置里以便运行相关程序的时候能自动绑定到这个 GeoIP 库:

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

3. 下载 IP 数据

MaxMind 提供了免费的 IP 地域数据库(GeoIP.dat),不过这个数据库文件是二进制的,需要用 GeoIP 库来读取,所以除了GeoIP 外,还要下载 GeoIP.dat 文件。
可前往下载最新的二进制dat库 https://dev.maxmind.com/zh-hans/geoip/legacy/geolite/

采用GeoIP库屏蔽国外ip访问或根据国家做国际化 - 图1

  1. $ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
  2. $ gunzip GeoIP.dat.gz

4. 配置ginx

  1. # 一个最简单的例子
  2. http {
  3. geoip_country /home/vpsee/GeoIP.dat;
  4. fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
  5. fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3;
  6. fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
  7. }
  8. server {
  9. listen 9999;
  10. server_name localhost;
  11. location / {
  12. if ($geoip_country_code != CN) {
  13. return 403;
  14. }
  15. }
  16. }

1. ngx_http_geoip2_module 模块

因为要用到 ngx_http_geoip2_module 模块,系统自带的 nginx 一般不带这个模块,所以要下载 nginx 源代码后自行编译(安装不作为重点,这里将简单描述,更详细的安装过程请参考目录中的安装过程)。

  1. $ # 获取ngx_http_geoip2_module
  2. $ cd /usr/local/src
  3. $ # 如果安装过git命令可直接使用,无git命令可先下载后上传到指定文件夹也可。
  4. $ git clone --recursive https://github.com/leev/ngx_http_geoip2_module
  5. $ wget http://nginx.org/download/nginx-0.9.6.tar.gz
  6. $ tar zxvf nginx-0.9.6.tar.gz
  7. $ cd nginx-0.9.6
  8. $ # 如果已有nginx还是先根据已装的库做更新,具体方法百度
  9. $ ./configure --without-http_empty_gif_module --with-poll_module
  10. --with-http_stub_status_module--with-http_ssl_module
  11. --add-module=/usr/local/src/ngx_http_geoip2_module
  12. $ make; make install

2. 安装 libmaxminddb 依赖库

需要先安装libmaxminddb依赖库。libmaxminddb是一个C库文件,用于读取MaxMind DB文件,包括MaxMind下的GeoIP2数据文件。

  1. $ cd /usr/local/src
  2. $ # 如果安装过git命令可直接使用,无git命令可先下载后上传到指定文件夹也可。
  3. $ git clone --recursive https://github.com/maxmind/libmaxminddb
  4. $ cd libmaxminddb
  5. $ ./bootstrap
  6. $ ./configure
  7. $ make
  8. $ make install
  9. $ sh -c "echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf"
  10. $ ldconfig

3. 下载 IP 数据库

MaxMind 提供了免费的 IP 地域数据库,这个数据库是二进制的,不能用文本编辑器打开,需要上面的 GeoIP 库来读取:
可前往下载最新的二进制MaxMind DB库:
https://dev.maxmind.com/zh-hans/geoip/geoip2/geolite2-%e5%bc%80%e6%ba%90%e6%95%b0%e6%8d%ae%e5%ba%93/
采用GeoIP库屏蔽国外ip访问或根据国家做国际化 - 图2

  1. $ wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
  2. $ gunzip GeoLite2-Country.mmdb.gz

4. 配置nginx

  1. # 一个最简单的例子
  2. http {
  3. #国家
  4. geoip2 /usr/local/nginx/conf/GeoLite2-Country.mmdb {
  5. $geoip2_data_country_code default=US country iso_code;
  6. $geoip2_data_country_name country names en;
  7. }
  8. #城市
  9. geoip2 /usr/local/nginx/conf/GeoLite2-City.mmdb {
  10. $geoip2_data_city_name default=London city names en;
  11. # subdivisions这里有个数组,所以写法有别于city
  12. $geoip2_data_province_name subdivisions 0 names en;
  13. $geoip2_data_province_isocode subdivisions 0 iso_code;
  14. }
  15. }
  16. server {
  17. listen 9999;
  18. server_name localhost;
  19. location / {
  20. if ($geoip2_data_country_code != CN) {
  21. return 403;
  22. }
  23. }
  24. }