首页 > 系统相关 >nginx根据ip的地理位置进行转发代理(GeoIP2)

nginx根据ip的地理位置进行转发代理(GeoIP2)

时间:2023-08-18 18:12:58浏览次数:46  
标签:geoip2 http ip data GeoIP2 nginx usr local

nginx要获取到ip地理位置,需要在nginx引用第三方ngx_http_geoip2_module模块,而ngx_http_geoip2_module模块依赖libmaxminddb;另外ip对应的地理位置离线的需要从GeoIP2站点上下载下来;最后在nginx.conf文件中引用ngx_http_geoip2_module模块,配置离线数据库才可以获取地理位置

nginx日志中的效果图
image

一、安装libmaxminddb

#下载包
wget https://github.com/maxmind/libmaxminddb/releases/download/1.7.1/libmaxminddb-1.7.1.tar.gz
tar -zxvf libmaxminddb-1.7.1.tar.gz
cd libmaxminddb-1.7.1/
#安装
./configure
make
make check
make install
#编译安装完成后需要将库的安装位置添加到系统路径中
sh -c "echo /usr/local/lib  >> /etc/ld.so.conf.d/local.conf"
ldconfig

二、nginx添加ngx_http_geoip2_module模块

下载地址:https://github.com/leev/ngx_http_geoip2_module/releases
tar -zxvf ngx_http_geoip2_module-3.4.tar.gz
mv ngx_http_geoip2_module-3.4 /usr/local/src/ngx_http_geoip2_module
#备份原来的编译后的nginx
cp -r /usr/local/nginx /usr/local/nginx_bak20230818
#进入源代码文件目录下重新安装
cd /usr/local/nginx-1.20.2
./configure --prefix=/usr/local/nginx --with-http_ssl_module --add-module=/usr/local/src/ngx_http_geoip2_module
make
#将编译后的nginxc程序复制到/usr/local/nginx/sbin目录下替换原来的nginx程序
cp objs/nginx /usr/local/nginx/sbin/nginx
#查看geoip模块是否添加成功
/usr/local/nginx/sbin/nginx -V

三、下载IP离线数据库,GeoIP2-Country和GeoIP2-City

1. 输入网址进入https://www.maxmind.com/


2. 进入下载页面
image


image


3.注册用户
image


4. 再次进入到刚才注册用户的界面,点击Download Files
image


image


四、nginx配置

引入geoip2

##
# GeoIP Setting
##

# 国家数据库
geoip2 /usr/local/nginx/conf/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 /usr/local/nginx/conf/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属地

 log_format  country '$remote_addr "$geoip2_data_country_name" "$geoip2_data_city_name" "$geoip2_data_province_name" "$time_local" "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  country;

完整配置

http {
    geoip2 /usr/local/nginx/conf/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 /usr/local/nginx/conf/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;
    }

    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;
    log_format  country '$remote_addr "$geoip2_data_country_name" "$geoip2_data_city_name" "$geoip2_data_province_name" "$time_local" "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  country;

记录用、nginx添加http_geoip_module模块

  1. 查看当前nginx已经安装的模块
    /usr/local/nginx/sbin/nginx -V
    image
    发现原来安装的配置是这个--prefix=/usr/local/nginx --with-http_ssl_module
    将原来配置后面再加一个geoip模块 --with-http_geoip_module
    安装命令变成了 ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_geoip_module
  2. nginx添加geoip模块
    #备份原来的编译后的nginx
    cp -r /usr/local/nginx /usr/local/nginx_bak20230818
    #进入源代码文件目录下重新安装
    cd /usr/local/nginx-1.20.2
    ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_geoip_module
    make
    #将编译后的nginxc程序复制到/usr/local/nginx/sbin目录下替换原来的nginx程序
    cp objs/nginx /usr/local/nginx/sbin/nginx
    #查看geoip模块是否添加成功
    /usr/local/nginx/sbin/nginx -V
    
    image

参考:https://blog.awolon.fun/archives/nginx-record-geoip-data.html
https://github.com/leev/ngx_http_geoip2_module
https://www.pianshen.com/article/39572688425/
https://m.php.cn/faq/557270.html

标签:geoip2,http,ip,data,GeoIP2,nginx,usr,local
From: https://www.cnblogs.com/tonghaolang/p/17640155.html

相关文章

  • 深入探究 Nginx 负载均衡与反向代理
    在现代Web应用中,处理高并发和确保可用性是至关重要的。Nginx是一个强大的开源服务器,可以作为负载均衡器和反向代理来提供性能优化和高可用性。本文将深入探讨Nginx的负载均衡和反向代理原理,以及如何在后端架构中应用它。负载均衡的原理负载均衡是将传入的请求分发到多个服务器......
  • P1012 [NOIP1998 提高组] 拼数
     题解:这道题最大的坑:32和321,32321>32132 1#include<bits/stdc++.h>2usingnamespacestd;3stringa[25];4boolcmp(conststring&a,conststring&b)5{6return(a+b>b+a);//这里太妙了7}8intmain()9{10int......
  • 2023年爬虫有哪些好用的付费代理IP?芝麻代理品易代理快代理熊猫代理……
    在我加班到凌晨2点的时候,第N次收到HTTP代理返回:项目是没办法接着做了,回家也是不可能回家的,烦得很一时半会还没想走,这种情况谁懂?开始知乎摸鱼,翻到这个:哈?这不就是1*88源头厂家的意思?????说这个我可就立马福尔摩斯附体了啊,今天我可非得找到你这个家伙!中间曲折的过程我就不重复说了,直接给我......
  • 《Javascript中关于this作用域的箭头函数,普通函数以及回调函数中的特殊作用》
    开言这篇文章的内容很简单,一句话就是“涉及this指向谁”!!!但是涉及JavaScript的普通函数,箭头函数,WIndow,回调,Object等各种知识点其糅杂在一起,其知识点会很混乱,我们要理性头绪!!简单来说,普通函数可以看做管理严格的孩子,箭头函数是一个自由自在的孩子因此,在object中,使用箭头函数很危......
  • 7 JavaScript循环语句
    7循环语句在js中有三种循环语句.首先是while循环.它的逻辑和咱们python中的while几乎一模一样,就是符号上有些许的区别.//语法while(条件){循环体->里面可以有break和continue等关键字}/*判断`条件`是否为真,如果`真`,则执行`循环体`.执行完`循环体`,会再次......
  • 6 JavaScript条件判断
    6条件判断除了HTML以外.几乎所有的编程语言都有条件判断的功能.比如,python,我们用if语句来做条件判断.到了javascript中也是一样的,也使用javascript来做条件上的判断./*语法1*/if(条件1){代码块1}if(条件)a,b,c,d;该语法表示当条件为真.运......
  • vue3新语法糖——setup script
    vue3新语法糖——setupscriptCoCoyY12021-03-2712:5241480 前言vue3上线已经很久了,许多小伙伴应该都已经使用过vue3了。那么在使用vue3compositionAPI的时候有没有觉得整个过程会比较繁琐呢。比如当你定义了一个方法,然后发现模板需要使用该方法,然后就必须将方法返回......
  • 代理IP与Socks5代理:跨界电商智能引擎与数据安全守护
    一、代理IP在跨界电商中的关键作用多地区数据获取:代理IP允许企业模拟不同地区的IP地址,轻松访问各地网站,实现多地区市场信息和竞争数据的获取。规避反爬机制:跨界电商面临许多网站的反爬机制,代理IP的应用能够隐藏真实IP地址,规避反爬限制,确保数据采集的连贯性。隐私与安全保护:使用......
  • [转]如何在 JavaScript 中遍历对象
    原文地址:如何在JavaScript中遍历对象在JavaScript中,当你听到“循环”一词时,你可能会想到使用各种循环方法,例如 for 循环、forEach() 方法、map() 方法等等。但不幸的是,这些方法对于对象不起作用,因为对象是不可迭代的。这并不意味着我们不能循环遍历一个对象——只是我......
  • C++快速入门 第二十八讲:多继承(multiple inheritance)
    1多继承语法:23//助教类既继承于老师类,又继承于学生类4classAssistant:publicTeacher,publicStudent5{6};78当遇到的问题无法只用一个“是一个”关系来描述的时候,就是多继承出场的时候。例即是学生,又是人,还是助教。910#include<iostre......