自己写了一个查询IP的动态链接库,里面使用geoip的扩展,但是访问时候报错:
nginx: worker process: symbol lookup error: /usr/local/lib/libletvip.so: undefined symbol: GeoIP_open
下面是lua代码
local ffi = require 'ffi'
ffi.cdef[[
int reload_ipdata(const char * geoipfn,const char * myipfn);
char *IP_country_by_addr(const char *addr);
]]
local ip = ngx.var.arg_ip
local libletvip = ffi.load('libletvip')
local ret = libletvip.reload_ipdata("/root/libletvip/geoip.dat","/root/libletvip/iptable.csv");
if ip then
country = libletvip.IP_country_by_addr(ip)
ngx.say(country)
end
C代码
int reload_ipdata(const char * geoipfn,const char * myipfn)
{
//新内存数据...
int gipcount_new = 0;
IPStruct_t* giptable_new = initalize(myipfn,&gipcount_new);
GeoIP *geoip_new = GeoIP_open(geoipfn, GEOIP_STANDARD | GEOIP_MEMORY_CACHE);
if( (NULL==giptable_new)||(NULL==geoip_new) )
return 0;
//交换数据,其实应该加锁才能操作---
//m_rw_lock_iprut.WRLock();
IPStruct_t* tempiptb = giptable;
giptable = giptable_new;
giptable_new = tempiptb;
//m_rw_lock_iprut.RWUnLock();
usleep(13000);
free(giptable_new);
//----------------------------------
//m_rw_lock_iprut.WRLock();
GeoIP* tempgeoip = geoip;
geoip = geoip_new;
geoip_new = tempgeoip;
//m_rw_lock_iprut.RWUnLock();
usleep(13000);
GeoIP_delete(geoip_new);
return 1;
}