本章目录
目录
-
- ngx_http_geoip2_module 下载
- Geoip2 模块编译动态链接库
- GeoLite2 数据库自动更新
-
- 1.使用GeoIP2模块请求客户端的IP地址国家省份经纬度展示
- 2.使用GeoIP2模块静止某一国家地区的IP地址访问网站
- 3.使用GeoIP2模块实现不同国家访问进入不同目录页面
-
- 问题1.非二进制方式安装Nginx GeoIP过程中可能会出现的错误问题如下,也帮大家列举出解决办法。
- 问题2: 如果在进行Nginx编译时出现
./configure: error: the GeoIP module requires the GeoIP library.You can either do not enable the module or install the library.
0x00 前言简述
描述: 为了实现根据访问者访问我们的网站时根据其IP显示其所属地,也为获取不同地区访问者的IP地址等相关信息为目的,所以在搜索引擎中查找解决方案,在网络上查询到如下几种方案 Nginx+GeoIP2、使用收费 IP 识别接口、DNS 根据地域解析
,然后经过多方面考究,最终还是使用Nginx+GeoIP2解决方案。
三种解决方案优缺点
-
Nginx + GeoIP2
可以拿到请求 IP 的国家和城市信息然后进行各种个性化 Nginx 配置
可以将请求 IP 的地理位置通过 php-fpm 传递 php 程序
定时更新 MaxMind 免费数据库(
GeoLite2-Country.mmdb + GeoLite2-City.mmdb
)完成完美闭环maxmind 公司 2002 年成立至今,靠谱
-
使用 IP 识别接口:稳定的需要收费(也不能保证 100% 高可用:限频、响应时间、接口异常等因素),免费的无法保证稳定性,接口远远没有将 GeoLite 数据放在本地稳定
-
DNS 根据地域解析:cloudflare 收费略贵,国内 cloudxns 已关闭免费服务(免费的东西说变就变,论 planB 的重要性)
所有在本章中,我将向您展示如何搭建与配置一个有效的 Nginx 和 Max Mind GeoIP2/GeoLite2 设置。 从安装部署包的下载、编译安装步骤以及命令使用、包括安装过程中可能会遇到的坑,在最后博主也通过几个实践例子,展示如何使用 GeoIP2 按国家/地区限制对某些 URL 的访问。
TIPS:MaxMind GeoIP 已经被弃用了一段时间。 对于您最新的地理定位需求,请改用 MaxMind GeoIP2(或免费版本的 GeoLite2)。
TIPS:当前网上大部分Nginx + GeoIP 的教程都是 GeoIP 老版本的已经不适用了当前最新版本的Nginx二进制编译安装,你可参照本章更快的进行实践使用。
TIPS:GeoUP 依赖 MaxMind 的 IP 数据,需要频繁更新,所以我们在安装配置后也实现了使用 crontab
服务,针对其国家城市数据库进行自动化脚本定时更新配置。
好了,不多说了,下面直接开始实践吧!
0x01 安装部署
环境说明
环境一览:
# 宿主机系统 $ uname -a 113-Ubuntu SMP Thu Feb 3 18:43:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/issue.net Ubuntu 20.04.1 LTS # 应用软件 nginx-1.22.0.tar.gz libmaxminddb-1.6.0.tar.gz ngx_http_geoip2_module-3.4.tar.gz GeoLite2-City_20220802.tar.gz GeoLite2-Country_20220802.tar.gz
温馨提示: 此处使用的是 Ubuntu 20.04 操作系统, 该系统已做安全加固和内核优化符合等保2.0要求【 SecOpsDev/Ubuntu-InitializeSecurity.sh at master · WeiyiGeek/SecOpsDev 】, 如你的Linux未进行相应配置环境可能与读者有些许差异, 如需要进行(windows server、Ubuntu、CentOS)安全加固请参照如下加固脚本进行加固, 请大家疯狂的 star 。
加固脚本地址:【 https://github.com/WeiyiGeek/SecOpsDev/blob/master/OS-操作系统/Linux/Ubuntu/Ubuntu-InitializeSecurity.sh 】
为了节省大家的实践时间,我已经把需要用到的源码包上传到空间中,有需要的朋友可以看一下,下载地址: http://share.weiyigeek.top/d/36158960-50338508-7c5982?p=2088(访问密码:2088)
温馨提示: 如提示证书不对,请点击高级继续访问即可.
原文地址: https://blog.weiyigeek.top
libmaxminddb 下载
描述: 首先安装 libmaxminddb 库,其提供了一个用于读取 MaxMind DB
文件的C库,包括来自MaxMind的GeoIP2数据库。这是一种自定义二进制格式,旨在促进 IP 地址的快速查找,同时允许在与地址关联的数据类型方面具有极大的灵活性。
项目地址: https://github.com/maxmind/libmaxminddb
下载构建:
wget -c https://github.com/maxmind/libmaxminddb/releases/download/1.6.0/libmaxminddb-1.6.0.tar.gz tar -zxvf libmaxminddb-1.6.0.tar.gz && cd libmaxminddb-1.6.0 ./configure make && make install tee -a /etc/ld.so.conf.d/libc.conf <<'EOF' # libc default configuration /usr/local/lib EOF sudo ldconfig
或使用apt命令进行安装:
$ sudo apt update $ sudo apt install libmaxminddb0 libmaxminddb-dev mmdb-bin geoipupdate
上面安装的软件包是:
- libmaxminddb0 libmaxminddb-dev – MaxMind 地理定位数据库
- mmdb-bin – 二进制。 从命令行调用的程序。 使用此命令手动定位 IP。
- geoipupdate – 帮助配置和更新 GeoIP2 / GeoLite2 的软件包。
ngx_http_geoip2_module 下载
描述: 下载 ngx_http_geoip2_module 使用基于客户端 IP(默认)或特定变量(同时支持 IPv4 和 IPv6)的 maxmind geoip2
数据库中的值创建变量,该模块现在支持nginx流,并且可以以与http模块相同的方式使用。
项目地址: https://github.com/leev/ngx_http_geoip2_module/
下载构建:
wget -c https://github.com/leev/ngx_http_geoip2_module/archive/refs/tags/3.4.tar.gz -O /usr/local/src/ngx_http_geoip2_module-3.4.tar.gz tar -zxf ngx_http_geoip2_module-3.4.tar.gz && ls ngx_http_geoip2_module-3.4/ # config LICENSE ngx_http_geoip2_module.c ngx_stream_geoip2_module.c README.md
Geoip2 模块语法
语法示例:
# HTTP http { ... geoip2 /etc/maxmind-country.mmdb { auto_reload 5m; $geoip2_data_country_code default=US source=$variable_with_ip country iso_code; } } # Stream stream { ... geoip2 /etc/maxmind-country.mmdb { auto_reload 5m; $geoip2_data_country_code default=US source=$remote_addr country iso_code; } ... }
参数说明:
-
auto_reload <interval>
: 启用自动重新加载将使 nginx 以指定的时间间隔检查数据库的修改时间,如果发生更改则重新加载。 -
$variable_name [default=<value] [source=$variable_with_ip] path ...
: 如果没有指定【default】参数,则如果未找到该变量将为空,如果没有指定【source】参数 $remote_addr 将用于执行查找。
从上面语法格式中您是否是一片茫然,不管你是不是反正我第一次看到就茫然了,那 country iso_code
关键字又是从何而来?
为了解决上面这个疑问,我们在来看看如下操作。
mmdblookup 命令
描述: 在前面编译安装 libmaxminddb
库后,我们便可以使用 mmdblookup 工具,查找所需数据的路径(例如:国家/地区名称),以JSON格式返回的,其中continent(洲) 、country (国家) 、registered_country(已注册的国家)对象包含了 code/geoname_id/names
键:
GeoLite2-Country.mmdb 库只带有 country 相关数据样本输出
$ mmdblookup --file ./GeoLite2-Country.mmdb --ip 223.6.6.6 { "continent": { "code": "AS" <utf8_string> "geoname_id": 6255147 <uint32> "names": { "de": "Asien" <utf8_string> "en": "Asia" <utf8_string> "es":