企业运维实践-Nginx使用geoip2模块并利用MaxMind的GeoIP2数据库实现处理不同国家或城市的访问最佳...

本章目录

目录

    • 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":
            
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误提示说明在加载NGINXGeoIP2模块时,无法找到对应的共享对象文件。出现这种情况的原因可能是以下几种: 1. 没有正确安装GeoIP2库和NGINX GeoIP2模块。请确保已按照官方文档正确安装了这些组件。 2. GeoIP2库和NGINX GeoIP2模块的路径设置不正确。请检查相关配置文件,并确保路径正确。 3. 无法加载GeoIP2共享对象文件。这可能是因为文件权限不正确,或者文件被删除或移动。请检查文件权限,并确保文件存在于指定的路径中。 解决此问题的步骤如下: 1. 确认已正确安装GeoIP2库和NGINX GeoIP2模块。可以使用以下命令检查是否安装: ``` nginx -V 2>&1 | grep geoip2 ``` 如果没有输出,则表示未安装GeoIP2模块。 2. 检查GeoIP2库和NGINX GeoIP2模块的路径设置是否正确。可以在NGINX配置文件中使用以下指令: ``` geoip2 /path/to/GeoIP2-Country.mmdb { $geoip2_data_country_code country iso_code; } ``` 并确保指定的路径与实际路径匹配。 3. 检查文件权限和路径是否正确。可以使用以下命令检查文件权限: ``` ls -l /usr/local/nginx/modules/ngx_http_geoip2_module.so ``` 如果文件不存在,则需要重新安装GeoIP2库和NGINX GeoIP2模块,并确保文件存在于指定的路径中。 4. 如果文件权限不正确,则需要使用以下命令更改文件权限: ``` chmod 644 /usr/local/nginx/modules/ngx_http_geoip2_module.so ``` 希望以上方法可以帮助你解决NGINX GeoIP2模块的错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值