使用nginx获取用户地区名

3070阅读 0评论2015-05-06 ykyx00
分类:LINUX

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

1. 软件需求
        Geo:http://dev.maxmind.com/geoip/legacy/geolite/
        Geo C api:
        Nginx:

2.安装支持GeoIP的nginx
     

      2.1 安装GeoIP支持库

    # cd /usr/local/src
    # wget 
    # 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 
    # tar -xzf nginx-1.4.1.tar.gz
    # cd nginx-1.4.1
    # ./configure --prefix=/usr/local/nginx-1.4.1 --with-http_stub_status_module --with-http_geoip_module
    # make
    # make install

2.3 加载GeoIP库

    # cd /usr/loca/src
    # wget 
    # 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';

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

修改站点配置,如下将默认的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. 测试效果(获取市区名)

    curl 多访问几次

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

    #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  //多访问几次

日志如下:

    #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在反响代理后面,可以使用模块.

 
    转载请注明出处:


上一篇:sysVinit、UpStart、systemd
下一篇:将小工具添加有鼠标右键!