Day: April 9, 2014

  • I am paving my driveway

    之前找的波兰工人干的活实在让我忍无可忍,过完圣诞节我就没让他继续 driveway 的活,留下一个烂尾工程一直没找人接着干。

    image

    image

    自我反思一下,其实我早就不满意这个工人,我之所以忍了他那么长时间,其实是因为我懒:懒于换人、懒于监工,总觉得他干活总比我干活好一些吧。

    今天天气真好。我突然想,为什么不自己动手呢?虽然早有人警告说,做 driveway 要找 professionals,否则 driveway does not last。但是,专家者,砖家也,在 driveway 这件事上,我就直接无视了。Driveway 再不济,也不至于让上面停的车陷泥里去了吧。

    所以,我决定自己动手完成这活。今天花了两个小时,铺了大约 50 块 paving blocks,1 平米,自我感觉跟波兰工人成果差不多。就这个效率,两个月也能完工。

  • Hands on GeoIP for Nginx on Fedora and CentOS

    最近研究了一下如何根据用户的 IP 获得他的地理位置(我只关心 country 级,不关心 city 级),区别性地在 Ngnix 层面做一些限制性访问。这里用到 GeoIP 软件包和 MaxMind 的数据库。

    在 Fedora 20 下,Nginx (目前 1.4.7) 依赖于 GeoIP。等于说,装好 Nginx,ngx_http_geoip_module 自然就启用了,只要在两个配置文件略作修改。

    Fedora nginx -V output
    Fedora nginx -V output

    1. 在/etc/nginx/nginx.conf 里添加

    
    http {
    
    ...
    
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    
    ...
    
    }
    
    

    2. 在 /etc/nginx/fastcgi_params 里添加

    
    fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
     fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
    
    

    还有其他参数可用,请自行查手册。重启 Nginx 就可以使用 GeoIP 的信息了。

    在 CentOS 6.5 下,事情要复杂一些。网上说 CentOS 下的 Nginx 同样依赖于 GeoIP,可在我这里事实并非如此。同样是最新的 1.4.7 版,Nginx for CentOS 是不带 ngx_http_geoip_module 编译的。即使我用 yum install GeoIP 安装了 GeoIP 软件包,但 Nginx 不从源码编译就不能启用 geoip 模块。

    CentOS nginx -V output
    CentOS nginx -V output

    着重提一下,我说的 CentOS 6.5 是 VPS 版,Nginx 和 GeoIP 无依赖是不是这个版本特有的?不得而知。我不想为之专门装一次 CentOS 来探究。我也不想从源码编译 Nginx,因为我太喜欢 yum,就为一个 ngx_http_geoip_module 搞砸了其他功能就不值得了。

    退而求其次,CentOS 下不妨用 php 调用 GeoIP,只是感觉同样功能用 php 实现会消耗更多资源。另外,Nginx 能进行全面的限制,而 php 无法利用 GeoIP 信息限制对静态文件的访问。但是,Nginx 的全面限制也只能阻止低级用户,不可能阻止稍有点 IT 知识、一心要绕开地理位置限制来访问的用户,所以 php 对动态文件的限制其实也起到了相同的效果。

    CentOS 下,安装 GeoIP for php,首先要装有 GeoIP,前面已经说了,要单独装:

    
    yum install GeoIP
    
    

    然后,安装  php-pecl-geoip:

    
    yum install php-pecl-geoip
    
    

    哈哈,都是我喜欢的yum。然后重启一下 php-fpm,即可在 php 下获得 geoip 信息。函数有很多,geoip_country_code_by_name()、geoip_country_name_by_name() 等等,请自行查手册。

    顺便提一下,CentOS 6.5 VPS 版安装 GeoIP 后,带来的 country 数据库(GeoIP.dat, 6 Sep, 2011)有 1,183,408 字节,而 Fedora 20 的 GeoIP country(GeoLiteCountry.dat, 18 Jun, 2013) 数据库只有 581,110 字节,从 MaxMind 网站上下载最新的 GeoLite Country 数据库(GeoIP.dat, 每月第一个周二更新)也只有668,134 字节。考虑到 MaxMind 的数据库是分免费和收费的,那么,CentOS GeoIP.dat 这么大,是不是更接近于收费版?我不知道收费版是啥样的,因此无从考证。