利用Nginx加GeoIP MaxMind数据库获取用户的地理位置

标签: nginx geoip 地理位置 IP地址 maxmind
1866人阅读 评论(2) 收藏 举报
分类:

利用Nginx加GeoIP MaxMind数据库获取用户的地理位置

  • 版权声明:本文为博主chszs的原创文章,未获得博主授权均不能转载,否则视为侵权。
  • 本文讲述仅通过配置Nginx加上GeoIP MaxMind数据库,就能获得用户IP地址的实际物理位置,而无需编写任何代码。

地理位置数据在业务中有重要作用,这些数据可以用于向某些人群推广品牌、产品或服务,还有助于增强用户体验。
本文讲述仅通过配置Nginx加上GeoIP MaxMind数据库,就能获得用户IP地址的实际物理位置,而无需编写任何代码。
Nginx是一个开源的HTTP和IMAP/POP3代理服务器,主要用作Web服务器或反向代理服务器。Nginx的GeoIP模块(即ngx_http_geoip_module)使用了预编译的MaxMind数据库来设置变量,比如变量geoipcountrynamegeoip_country_code、变量$geoip_city等等,而这些值则取决于用户客户端的访问地址。

  • 先决条件:Ubuntu 16.04
  • 用例:在Ubuntu系统安装Nginx,配置Nginx使用GeoIP MaxMind数据库,再根据用户的IP地址查找具体的地理位置。
  • 概要:
    • 1)安装和配置
    • 2)使用客户端IP数据取回具体的地理位置

一、安装和配置

下面看在Ubuntu上安装和配置NGINX,安装GeoIP模块,下载GeoIP MaxMind GeoCity和GeoCountry数据库,并配置让Nginx使用GeoIP MaxMind数据库。

要安装和配置Ubuntu,执行以下操作。
要安装Nginx发布包,先获得官方的签名Key:

$ curl -s https://nginx.org/keys/nginx_signing.key | sudo apt-key add –

再使用以下命令把Nginx仓库添加到apt源:

$ sudo echo -e "deb https://nginx.org/packages/mainline/ubuntu/ `lsb_release -cs` nginx\n deb-src https://nginx.org/packages/mainline/ubuntu/ `lsb_release -cs` nginx" > /etc/apt/sources.list.d/nginx.list

使用以下命令重新同步apt源,并安装Nginx软件包:

$ sudo apt-get update
$ sudo apt-get install nginx

二、安装GeoIP模块

GeoIP模块用于查看连接到服务器的客户机的IP地址。
要安装GeoIP模块,执行以下的步骤。
使用以下命令下载并载入GeoIP模块到/usr/lib/Nginx/modules目录:

$ sudo add-apt-repository ppa:nginx/stable
$ sudo apt-get update
$ sudo apt-get install nginx-module-geoip

编辑Nginx的配置文件nginx.conf:

$ sudo nano /etc/nginx/nginx.conf

添加以下内容:

load_module "modules/ngx_http_geoip_module.so";

注意:如果–with-http-geoip-module已经存在于你安装的Nginx,那么跳过此步骤。

要检查GeoIP模块的存在,使用以下命令:

$ nginx -V

三、下载GeoIP MaxMind GeoCity和GeoCountry数据库

要在Ubuntu系统下载并提取MaxMind GeoCity和GeoCouontry数据库,使用以下命令:

mkdir - p / etc / nginx / geoip
cd / etc / nginx / geoip
wget http: //geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoI.dat.gz
gunzip GeoIP.dat.gz
wget http: //geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz

四、配置Nginx使用GeoIP MaxMind数据库

要配置Nginx使用GeoIP MaxMind GeoCity和GeoCountry数据库,需访问MaxMind geo-变量。执行以下命令:

load_module "modules/ngx_http_geoip_module.so";
worker_processes 1;
events {
 worker_connections 1024;
}
http {
 geoip_country / etc / nginx / geoip / GeoIP.dat;#
 the country IP database
 geoip_city / etc / nginx / geoip / GeoLiteCity.dat;#
 the city IP database
 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 /
  var / log / nginx / access.log main;#
 Set Geo variables in proxy headers
 proxy_set_header X_COUNTRY_CODE $geoip_country_code;
 proxy_set_header X_CITY_COUNTRY_CODE $geoip_city_country_code;
 proxy_set_header X_REGION $geoip_region;
 proxy_set_header X_CITY $geoip_city;
 proxy_set_header X_POSTAL_CODE $geoip_postal_code;
 server {
  listen 80;#
  All other traffic gets proxied right on through.
  location / {
   proxy_pass http: //127.0.0.1:3000;
  }
 }
}

五、使用客户端IP地址检索地理位置数据

下面创建一个简单的Web应用(Node.js程序),它可以返回JSON格式的请求报头参数。把自定义geo-字段添加到请求报头,并且可以从应用程序访问它。此Web应用通过Nginx进行反向代理。

要获得用户的地理位置数据,代码如下:

// This sample web application returns request headers in response
 const express = require('express')
 const app = express()
 var count = 1;
// Location "/show_my_identity" hosts the incoming request headers in response in JSON format
 app.get('/show_my_identity', function (req, res) {
 res.send(JSON.stringify(req.headers));
 console.log('Request',count++,'received from country : ',req.headers.x_country_code);
 })
// Default "/" message
 app.get('/', function (req, res) {
 res.send("Welcome to Treselle lab");
 })
// Application listening on port 3000
 app.listen(3000, function () {
 console.log('Treselle Lab - App listening on port 3000!')
 })

具有地理定位数据的应用程序的输出看起来与此类似:
这里写图片描述

注意:要运行此Node.js应用程序,相关的依赖模块要安装。
具有地理位置数据的应用程序日志与以下内容类似:
这里写图片描述
就是这些!

查看评论

大型高并发与高可用的三层缓存架构总结

大型高并发与高可用的三层缓存架构总结 对于高并发架构,毫无疑问缓存是最重要的一环,对于大量的高并发,可以采用三层缓存架构来实现,nginx+redis+ehcache nginx ...
  • huangshulang1234
  • huangshulang1234
  • 2018-02-02 10:24:42
  • 141

Nginx+lua+mysql实时存日志

Nginx+lua+mysql实时存日志准备材料 Nginx.1.12安装包下载 mysql 自行安装 Lua 相关包 LuaJIT 下载 ngx_devel_kit 下载 ngx_lua 下载 p...
  • guoyuguang0
  • guoyuguang0
  • 2017-08-06 14:13:37
  • 908

基于nginx的TCP Proxy实现数据库读写分离

nginx很早就支持tcp proxy,但是一直不知道其使用,最近在nginx blog上看见了,一些实践者将其运用到数据库访问的负载均衡以及实现读写分离,来提高数据库的吞吐量,这里我不会讲具体的搭建...
  • zhx6044
  • zhx6044
  • 2016-02-26 15:33:20
  • 3267

通过GeoIP2分析访问者IP获取地理位置信息

MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容、诈欺检测、广告定向、网站流量分析、执行规定、地理目标定位、地理围栏定位 (geo-fencing)...
  • johnnycode
  • johnnycode
  • 2014-12-19 19:53:14
  • 25044

Geo Location 地理位置信息小结

一、通过 IP 地址获得用户的地理位置信息 二、通过 W3C Geo API 获得用户地理位置 三、移动领域...
  • hgk
  • hgk
  • 2010-08-19 14:19:00
  • 2496

服务器数据库系列 - Nginx防攻击的三种方法

1. ngx_http_limit_conn_module 可以用来限制单个IP的连接数: ngx_http_limit_conn_module 模块可以按照定义的键限定每个键值的连接数。特别的...
  • initphp
  • initphp
  • 2013-04-17 09:18:35
  • 7264

nginx日志插入数据库中,进行前端分析处理

把前一分钟nginx的日志导入数据库中。 #!/bin/bash #获取某个时间点的nginx的日志,插入数据库user=admin password=12345nginx_dir=/nginx/...
  • qq_33880971
  • qq_33880971
  • 2018-01-31 16:50:55
  • 342

安装GeoIP数据库

1.安装GeoIP数据库 cd /usr/local/logstash/etc curl -O "http://geolite.maxmind.com/download/geoip/database...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2016-09-02 18:11:48
  • 1804

Geoip MaxMind DB 生成指南

目前MaxMind对MMDB的读写支持如下 Writer: perl Reader: C C# Java Perl PHP Python 所以...
  • openex
  • openex
  • 2016-12-08 16:03:58
  • 1819

nginx + mongodb

/确保你已经安装了mongodb和git工具 // 下载nginx-gridfs 注意: 需要特定版本的nginx-gridfs //安装 nginx tar -zxvf n...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2016-01-27 15:49:40
  • 2295
    个人资料
    持之以恒
    等级:
    访问量: 613万+
    积分: 5万+
    排名: 63
    一名路过的黑客

    大家好,我是黑客,专门盗账号的。现在这个人的帐号被我盗了,但看这个人平时的博客空间,一直过着艰苦努力、持之以恒的技术研究生活,勤奋刻苦,积极分享,无私奉献,我被深深的感动了,这是一个纯粹的人,人品这样的高尚,希望大家看到我这条消息后,可以私聊他,多鼓励他,不缺钱的就多给他一些经济上的资助,让他再接再厉!就这样吧,我下线了,眼框湿湿的难受。

    文章存档