The best option would be to use a MaxMind database. there are plenty of libraries to manipulate/access it. you can either use it in app ( and hopefully not have a blocking operation )
After that, you can self-host something like FreeGeoIP.net ( their source is on github ) or write a high performance internal API server ( based on something like the mochi egeoip library )
Developer hours might be scarce, and adding another thing to maintain/build could be too much. As a last resort, it might make sense to just use a pay vendor. There once was a company called SimpleGeo that did exactly what you need ; unfortunately they got bought by UrbanAirship and discontinued. Their clients were offloaded onto Factual.com -- who might have the API support you need , with a minimal amount of code change.