GeoIP插件

geoip 插件添加新的路由变量到你的内部路由子系统中。 GeoIP变量前缀为”geoip”标签。要构建geoip插件,你需要官方的GeoIP C库和它的头文件。支持的数据库是country和city,它们会在启动的时候完全加载到内存中。

可以访问country数据库的以下变量:

  • ${geoip[country_code]}
  • ${geoip[country_code3]}
  • ${geoip[country_name]}

而以为存储数据而增长的内存使用为代价,city数据库提供更多变量

  • ${geoip[continent]}
  • ${geoip[country_code]}
  • ${geoip[country_code3]}
  • ${geoip[country_name]}
  • ${geoip[region]}
  • ${geoip[region_name]}
  • ${geoip[city]}
  • ${geoip[postal_code]}
  • ${geoip[latitude]} (${geoip[lat]})
  • ${geoip[longitude]} (${geoip[lon]})
  • ${geoip[dma]}
  • ${geoip[area]}

启用geoip查询

要启用GeoIP查询系统,你需要加载至少一个数据库。在加载完geoip插件后,你会获得2个新的选项:

  • --geoip-country 指定一个country数据库
  • --geoip-city 指定一个city数据库

如果你没有至少指定一个数据库,那么,该系统将会总是返回空字符串。

一个例子

[uwsgi]
plugin = geoip
http-socket = :9090
; load the geoip city database
geoip-city = GeoLiteCity.dat
module = werkzeug.testapp:test_app
; first some debug info (addvar will ad WSGI variables you will see in the werkzeug testapp)
route-run = log:${geoip[country_name]}/${geoip[country_code3]}
route-run = addvar:COUNTRY=${geoip[country_name]}
route-run = log:${geoip[city]}/${geoip[region]}/${geoip[continent]}
route-run = addvar:COORDS=${geoip[lon]}/${geoip[lat]}
route-run = log:${geoip[region_name]}
route-run = log:${geoip[dma]}/${geoip[area]}

; then something more useful
; block access to all of the italians (hey i am italian do not start blasting me...)
route-if = equal:${geoip[country_name]};Italy break:403 Italians cannot see this site :P
; try to serve a specific page translation
route = ^/foo/bar/test.html static:/var/www/${geoip[country_code]}/test.html

内存使用

country数据库很小,因此你在使用它的时候一般没有问题。反而,city数据库能很大 (从20MB到大于40MB)。如果你有大量使用GeoIP的city数据库的实例,并且是使用最近的 Linux系统,那么考虑使用 在uWSGI中使用Linux KSM 来减少内存使用。 GeoIP数据库使用的所有内存可以由所有实例共享。