Nginx使用GeoIP2模块记录请求IP地理位置
在分析Web日志中直接记录ip地理位置,为分辨恶意请求/用户位置等功能提供支持,同时建立一个简易myip查询站点。
一、简介
首先你需要了解的是nginx官方模块里不支持geoip2,我们需要手动下载模块并安装至nginx
nginx有两种模块加载方式,分别为静态/动态加载,静态即在nginx编译时将模块编译进去,动态加载编译开启nginx动态加载模块的能力,后期需要添加模块只需要单独编译模块,将模块放入nginx模块文件夹重启即可加载,这里我们只尝试静态加载,所以我们需要在编译nginx源码的时候将geoip2模块编译进去
这里由于我使用的是maxmind mmdb数据库,所以需要先安装libmaxminddb依赖库,然后安装ngx_http_geoip2_module模块
二、准备工作
1.安装libmaxminddb依赖库
访问maxmind/libmaxminddb并下载release
或者直接访问1.6.0版本下载直链
解压压缩文件
tar -xf libmaxminddb-1.6.0.tar.gz
cd libmaxminddb-1.6.0
开始编译操作
!如果无法正常编译请访问此链接来安装基础编译工具
./configure
make
make check
sudo make install
make check用与检查能否正常编译,非必须
编译安装完成后需要将库的安装位置添加到系统路径中
sudo sh -c "echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf"
ldconfig
2.安装ngx_http_geoip2_module模块
访问leev/ngx_http_geoip2_module并下载release
或者直接访问3.4版本源代码下载直链
解压文件,并将模块放置到模块路径下(该路径可以自行指定,之后要用到)
tar -xf ngx_http_geoip2_module-3.4.tar.gz
mv ngx_http_geoip2_module-3.4 /usr/local/src/ngx_http_geoip2_module
重新编译nginx
- 对于有编译经验的同学来说直接使用nginx -V获取先前nginx编译参数,只需向其最后追加如下内容即可
--add-module=/usr/local/src/ngx_http_geoip2_module
❗需要注意的是如果你解压完模块没有移动到我这里写的位置,别忘了自行替换以上内容的模块位置,否则下一步configure会报找不到依赖模块错误
然后使用如下格式的编译设置指令
./configure 先前编译参数 追加参数
最后使用make命令编译nginx
进入obj路径即可看到新编译的二进制文件
使用./nginx -V来测试新二进制文件是否成功加入模块
使用./nginx -t来测试是否与当前配置文件兼容
- 如果你没有编译nginx的经验请参考这一篇文章Ubuntu 将Apt安装的Nginx 1.18.0 平滑升级到1.22.0
其中也讲解了如何为nginx添加新模块
3.获取geoip2数据库
访问maxmind网站注册账号下载免费版的数据库,可以下载到国家和城市的数据库,我这里有现成的国家数据库也放到这里,可以直接访问直链下载使用
GeoLite2-Country_20220927.tar.gz
三、为nginx添加geoip模块
上一步你已经成功安装了geoip2模块到nginx中,下一步只需要在nginx配置文件中引入geoip模块即可使用相关变量
这里我把我的nginx.conf的geoip模块相关配置贴出来
##
# GeoIP Setting
##
# 国家数据库
geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb {
#国家代码
$geoip2_data_country_code default=China source=$remote_addr country iso_code;
#国家名称
$geoip2_data_country_name country names en;
#洲代码
$geoip2_data_continent_code continent code;
#洲名称
$geoip2_data_continent_name continent names en;
}
# 城市数据库
geoip2 /etc/nginx/geoip/GeoLite2-City.mmdb {
#城市名称
$geoip2_data_city_name city names en;
#省份代码
$geoip2_data_province_code subdivisions 0 iso_code;
#省份名称
$geoip2_data_province_name subdivisions 0 names en;
}
在以上配置中我同时使用了国家城市ip数据库,如过你不需要城市信息或者没有城市数据库只使用国家数据库也可以
保存后使用nginx -t 测试ok即表明geoip2安装成功
四、简易myip查询站点
以上我们已经向nginx配置文件中添加了geoip2的变量,接下来我们只需在普通站点配置文件中使用变量即可
你可以选择两种方式建立一个简单的查询站点
- 如果你有绑定域名而且可以设置子域名例如myip.awolon.fun,那么你可以使用前者部署
- 如果你只希望在一个站点下通过路径访问例如www.awolon.fun/myip,那么你可以使用后者
1.子域名
在/etc/nginx/sites-enabled路径下新建myip的文件,并向其写入如下内容
server
{
listen 443 ssl http2;
#如不需要https访问,只监听80端口
#listen 80;
#server_name 自行更改
server_name myip.awolon.fun;
default_type text/plain;
charset utf-8;
return 200 "你的IP是:$remote_addr\n城市:$geoip2_data_city_name\n省份:$geoip2_data_province_code-$geoip2_data_province_name\n国家:$geoip2_data_country_code-$geoip2_data_country_name\n洲:$geoip2_data_continent_code-$geoip2_data_continent_name\n";
#https证书请替换成自己的,如不需要可以直接删除
ssl_certificate /path/to/fullchain.pem; # managed by Certbot
ssl_certificate_key /path/to/privkey.pem; # managed by Certbot
}
保存后重载配置文件访问域名即可查看效果
2.子路径
打开任意你想添加子路径的虚拟主机配置文件,向其添加以下内容
location /myip{
default_type text/plain;
charset utf-8;
return 200 "你的IP是:$remote_addr\n城市:$geoip2_data_city_name\n省份:$geoip2_data_province_code-$geoip2_data_province_name\n国家:$geoip2_data_country_code-$geoip2_data_country_name\n洲:$geoip2_data_continent_code-$geoip2_data_continent_name\n";
}
保存后重载配置文件访问子路径
五、在access.log日志中添加ip地理位置信息
如果想要记录位置信息到日志中就需要使用log_format命令手动指定日志格式,然后在虚拟主机配置文件中使用自定义的日志格式
1.设置log_format
编辑/etc/nginx/nginx.conf文件,并向其中添加以下内容
log_format country '$remote_addr "$geoip2_data_country_name" "$time_local" "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
通过以上设置我新建了一个名为country的日志记录等级,分别记录了客户端ip,城市名称,时间,请求,状态,body大小,来源,ua等信息,接下来只需在虚拟主机的log_access中指定该日志等级
2.设置虚拟主机log_access
编辑虚拟主机配置,以第四章简易myip查询站点为例,只需在上方的配置文件后添加如下内容即可
access_log /var/log/nginx/myip.log country;
error_log /var/log/nginx/myip-error.log;
即指定了myip虚拟站点使用自定义的日志等级来记录日志
六、参考链接
Nginx之IP国家代码ngx_http_geoip2_module模块简介和使用
Nginx配置中的log_format用法梳理(设置详细的日志格式)
How to Configure Custom Access and Error Log Formats in Nginx
文章作者:四文鱼Max
本文链接:https://blog.awolon.fun/archives/nginx-record-geoip-data.html
许可协议:CC BY-SA 4.0