Избегайте запуска GeoIP на каждой странице

Это модуль, с которым я работаю: http://wiki.nginx.org/HttpGeoipModule

Из того, что я вижу, поскольку он настроен в конфигурации nginx и uwsgi, похоже, что нет другого выбора, кроме как запускать geoip на каждой странице, а затем собирать и использовать переменную только при необходимости.

С точки зрения производительности я бы предпочел, чтобы он был таким, чтобы я запрашивал геоIP ТОЛЬКО при необходимости, кэшировал его в файле cookie или сеансе, а затем не запрашивал его снова, чтобы ускорить работу сайта.

Кто-нибудь может сказать мне, возможно ли это?


person Jimmy    schedule 23.11.2012    source источник


Ответы (2)


С точки зрения производительности я бы предпочел, чтобы он был таким, чтобы я запрашивал геоIP ТОЛЬКО при необходимости, кэшировал его в файле cookie или сеансе, а затем не запрашивал его снова, чтобы ускорить работу сайта. Кто-нибудь может сказать мне, возможно ли это?»

Да, это возможно. Но с точки зрения производительности вам не стоит беспокоиться, так как база данных geoip хранится в памяти (на этапе чтения конфигурации) и nginx очень быстро выполняет поиск.

В любом случае, если вы хотите, вы можете использовать что-то вроде:

set $country $cookie_country;

if ($country == '') {
    set $country $geoip_country_code;
    add_header Set-Cookie country=$geoip_country_code; 
}

uwsgi_param GEOIP_COUNTRY $country;
person VBart    schedule 23.11.2012

Нет, вы не можете заставить nginx выполнять поиск GeoIP только по запросу. Поскольку вы определяете директиву geoip_country или geoip_city, nginx будет запрашивать данные из базы данных GeoIP независимо от того, будет ли ответ использован позже или нет. Но вы можете получить данные GeoIP вообще без nginx, т.е. напрямую с вашим приложением. Взгляните на библиотеку python geoip: http://dev.maxmind.com/geoip/downloadable#Python-5

person kernel    schedule 23.11.2012
comment
Вы совершенно не правы. Переменные в Nginx оцениваются только по запросу. Если при обработке запроса не использовалась переменная $geoip_*, то поиск базы данных geoip не производился. - person VBart; 23.11.2012
comment
Итак, если я не вызову переменную geoip на своей странице, модуль geoip вообще не будет выполняться? Меня беспокоит загрузка страниц, поэтому на других страницах я не буду ее вызывать, поэтому я хочу знать, что она не будет загружена или не замедлит работу страницы. - person Jimmy; 23.11.2012
comment
Значит, если я не вызову переменную geoip на своей странице, модуль geoip вообще не будет выполняться? Да, именно так. - person VBart; 23.11.2012
comment
Пожалуйста. =) На самом деле, много интересной информации о nginx есть в официальных списках рассылки: mailman.nginx.org/ почтальон/информация о списке - person VBart; 25.03.2013