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数据库使用的所有内存可以由所有实例共享。