1. 首页 > 服务器运维

nginx获取用户所在地区 – ttlsa教程系列之nginx

在使用nginx负载均衡或者做日志统计可能会需要获取用户的地区名, GeoIP完美的解决了这个需求,可以使用GeoIP实现基于地区的负载均衡, 使得不同地区访问不同服务器,达到负载均衡的目的; 也可以使用GeoIP将IP记录到nginx日志中,并用于后续的日志统计中, Geoip通过IP获取地区名并且记录到日志中作为日志统计这个功能已经用在我们公司, 跑了大半年,非常稳定,so推荐大家使用,不放心的朋友可以自行测试.
前面讲到如何安装nginx第三方模块,这边记录下如何使用nginx获取地区名, 但是这边不算第三方模块,它属于nginx内置的模块,不过如果你之前未把geo编译到nginx中,那么你需要重新编译一次nginx,接着将make生成的nginx文件覆盖老的nginx即可,如果不知道怎么做也可以参考下如何安装nginx第三方模块.

1. 软件需求
Geo:http://dev.maxmind.com/geoip/legacy/geolite/
Geo C api: http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
Nginx:http://nginx.org/download/nginx-1.4.1.tar.gz

2. 安装支持GeoIP的nginx

2.1 安装Geoip支持库

# cd /usr/local/src
    # wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
    # tar -xzf GeoIP.tar.gz
    # cd GeoIP-1.4.8
    # ./configure
    # make
    # make install

2.2 安装nginx

参数:--with-http_geoip_module

# cd /usr/local/src
    # wget http://nginx.org/download/nginx-1.4.1.tar.gz
    # tar -xzf nginx-1.4.1.tar.gz
    # cd nginx-1.4.1
    # ./configure --prefix=/usr/local/nginx-1.4.1 --with-http_geoip_module 
      --with-http_stub_status_module
    # make
    # make install

2.3 将Geo IP地址库加入nginx,所有的IP地区信息都保存在GeoLiteCity.dat文件中.

# cd /usr/loca/src
    # wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
    # gzip -d GeoLiteCity.dat.gz
    # mv GeoLiteCity.dat /usr/local/nginx-1.4.1/conf/

3. 配置支持GeoIP的nginx

3.1 nginx加载GeoIP库
我这边的日志比较粗略,只记录了用户地址,url参数(参数中包含了各种我要的信息:例如用户系统,浏览器,屏幕分辨率等等,大家可以看看百度统计,也是这么做的).如下配置加入nginx.conf的http配置段中,定义了一个叫stats的日志格式以及载入geoip_city.

geoip_city /usr/local/nginx-1.4.1/conf/GeoLiteCity.dat;
    log_format stats '$time_local | $query_string?s?$remote_addr?s?=$geoip_city';

[warning]备注:
1. ?s?是日志分隔符,做日志切割用的,大家可以自行决定.
2. GeoLiteCity.data这里用绝对路径,相对路径有事报文件不存在,还望知道原因的兄弟给个指教.[/warning]

修改站点配置,如下将默认的main日志格式替换成stats

server {
        listen        80;
        server_name  stats.ttlsa.com;
        index index.shtml;

        location /
        {
                access_log off;
        }
        location = /stats.gif
        {
                add_header Cache-Control no-store;
                #access_log /data/logs/nginx/stats.ttlsa.com_access.log main;
                # 将上面的main改为下面的stats
                access_log /data/logs/nginx/stats.ttlsa.com_access.log stats;
                return 204;
        }
    }

大家一定会很好奇我为什么要返回一个204,这个,先说正事,文章结尾揭晓.

4. 测试nginx Geoip效果

curl http://stats.ttlsa.com/stats.gif?screen=1024x768&os=win8.1

查看日志,内容服下,日志的最后一位就是市区,福州市

#tail -f  /data/logs/nginx/stats.ttlsa.com_access.log                  
    05/Aug/2013:21:45:58 +0800 | screen=1024x768&os=win8.1?s?121.207.231.99?s?=Fuzhou
    05/Aug/2013:21:46:09 +0800 | screen=1024x768&os=win8.1?s?121.207.231.99?s?=Fuzhou
    05/Aug/2013:21:46:14 +0800 | screen=1024x768&os=win8.1?s?121.207.231.99?s?=Fuzhou

5. nginx获取省份信息
这边geoIP获取到的是市区,那我如何使用nginx获取用户的省份呢,很简单,只要将$geoip_city改成$geoip_region_name即可,配置如下:

log_format stats '$time_local | $query_string?S?$remote_addr?s?=$geoip_city';

访问测试

# curl http://stats.ttlsa.com/stats.gif?screen=1024x768&os=win8.1

日志如下:

# tail -f  /data/logs/nginx/stats.ttlsa.com_access.log  
  05/Aug/2013:21:53:50 +0800 | screen=1024x768&os=win8.1?s?121.207.231.99?s?=Fujian
  05/Aug/2013:21:53:51 +0800 | screen=1024x768&os=win8.1?s?121.207.231.99?s?=Fujian
  05/Aug/2013:21:53:52 +0800 | screen=1024x768&os=win8.1?s?121.207.231.99?s?=Fujian

可以看到出现拼音Fujian(福建)

6. 为什么使用return 204
因为我这边仅仅是记录用户的访问信息,以及提交的参数.用户不需要获取我任何信息.http状态吗204只会返回响应头给用户,没有具体内容.

7.注意事项
nginx根据请求端的ip地址在geoip库中查找地区名,所以geoip在CDN的环境下,大家要慎用.如果在nginx在反响代理后面,可以使用nginx-realip模块.realip模块的用法请自行查看相关资料或者等我后续的文章介绍

本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https://zhuji.jb51.net/yunwei/8270.html

联系我们

在线咨询:点击这里给我发消息

微信号:

工作日:8:30-17:30,节假日休息