Another option:
- Download the cities database from http://download.geonames.org/export/dump/
- Add each city as a lat/long -> City mapping to a spatial index such as an R-Tree (some DBs also have the functionality)
- Use nearest-neighbour search to find the closest city for any given point
Advantages:
- Does not depend on an external server to be available
- Very fast (easily does thousands of lookups per second)
Disadvantages:
- Not automatically up to date
- Requires extra code if you want to distinguish the case where the nearest city is dozens of miles away
- May give weird results near the poles and the international date line (though there aren’t any cities in those places anyway