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

凉白开 Linuxnginx获取用户所在地区 – ttlsa教程系列之nginx已关闭评论13,4962字数 3149阅读10分29秒阅读模式

在使用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文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

2. 安装支持GeoIP的nginx文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

2.1 安装Geoip支持库文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

    # 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文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

参数:--with-http_geoip_module文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-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文件中.文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

    # 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文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

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

    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]文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

修改站点配置,如下将默认的main日志格式替换成stats文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

    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,这个,先说正事,文章结尾揭晓.文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

4. 测试nginx Geoip效果文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

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

查看日志,内容服下,日志的最后一位就是市区,福州市文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

    #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即可,配置如下:文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

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

访问测试文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

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

日志如下:文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

  # 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(福建)文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

6. 为什么使用return 204
因为我这边仅仅是记录用户的访问信息,以及提交的参数.用户不需要获取我任何信息.http状态吗204只会返回响应头给用户,没有具体内容.文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

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

转载请注明出处:nginx获取用户所在地区 https://www.ttlsa.com/html/2193.html文章源自运维生存时间-https://www.ttlsa.com/linux/nginx-modules-geoip_module/

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
凉白开
  • 本文由 发表于 05/08/2013 22:17:16
  • 转载请务必保留本文链接:https://www.ttlsa.com/linux/nginx-modules-geoip_module/