varnish3, mod_geoip с apache2 с использованием mod_rewrite и mod_rpaf

Я поддерживаю веб-сайт с 3-мя различными версиями сайта, с 3-мя разными языками, работает с единой системой, написанной на php, которая принимает переменные окружения на основе имени домена, к которому осуществляется доступ. Это три сайта:

  • myshop.com: английская международная версия
  • myshop.eu: европейская версия сайта
  • myshop.ru: русская версия сайта

При доступе к myshop.com из России он должен быть перенаправлен на myshop.ru, а любая страна из Европы получает доступ к myshop.com, перенаправляется на myshop.eu, а иностранные посетители остаются на myshop.com, хотя они могут перейти на сайт конкретной страны. Все эти перенаправления для страны выполняются с помощью мода GeoIP apache2, чтобы определить код страны, который используется в RewriteCondition для определения RewriteRule, есть некоторые исключения из IP-адресов, которые не выполняют перезапись, в основном для IP-адресов ПК разработчика. С сайтом все было в порядке, пока мы не решили настроить лак, чтобы придать сайту импульс, он действительно дал ему хороший импульс, но переписывание по конкретной стране стало ошибочным.

Стало происходить то, что российский посетитель может перейти на myshop.com и не будет перенаправлен, пока не нажмет случайную ссылку (возможно, ссылку, еще не кэшированную лаком) и пользователь не будет перенаправлен в свою страну.

Для этого я настроил mod_rpaf и для исключений из правила перезаписи (для ip разработчика), я использовал это RewriteCond %{HTTP:X-FORWARDED-FOR} !^43\.43\.43\.43, и я перезапустил лак и apache2, какое-то время работало, потом опять все испортилось.

И целый день я делал изменения, но я мало что понимаю, что происходит, иногда это работает, иногда нет, иногда половина работает и т. Д.

Что касается geoip, я использовал php, чтобы проверить $_SERVER переменная, и вот общее представление о выходе

[HTTP_X_FORWARDED_FOR] => 43.43.43.44
[HTTP_X_VARNISH] => 1705675599
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 43.43.43.44
[GEOIP_ADDR] => 43.43.43.44
[GEOIP_CONTINENT_CODE] => EU
[GEOIP_COUNTRY_CODE] => FR
[GEOIP_COUNTRY_NAME] => France

Теперь, благодаря "случайным" перенаправлениям, я почти не знаю, что происходит, поэтому вы, ребята, не могли бы вы дать мне несколько идей относительно того, какие инструменты использовать для их устранения? Я пытался просмотреть журналы перенаправления, но они действительно не показывают много, и varnishlog также не очень помогает - хотя я должен признать, что я не профессионал в лаке.

Я полагаю, что проблема заключается в том, что лак пытается кэшировать URL-адрес, и, следовательно, перенаправление apache не выполняется должным образом, однако при посещении сайта сначала происходит перенаправление, и в зависимости от того, где другие пользователи получают контент, в зависимости от того, где он находился когда кэш последний раз обновлялся, это правильно? если так, как я могу решить проблему?

Кроме того, у меня есть возможность использовать редиректы geoip на varnish3 вместо использования apache2 для выполнения перенаправлений, это лучший метод? Любое предложение относительно отладки этого или исправления этого было бы полезно!

Thnx!

2 ответа

Существуют способы использования встроенного C в вашем VCL, чтобы Varnish выполнял обнаружение GeoIP. Вы должны сделать это там, чтобы вы перенаправили, прежде чем пользователь получит кешированную страницу, которая может быть предназначена для другого региона.

https://www.varnish-cache.org/trac/wiki/GeoipUsingInlineC

У меня все еще нет прав, чтобы написать комментарий, поэтому я опубликую свой ответ здесь.

Исходя из этой проблемы, существует большая вероятность, что причиной является лак, особенно если вы используете такую ​​настройку:

varnish -> backend.com http-сервер (который на основе правил IP решает, куда перенаправить запрос) -> (.ru|.eu) веб-сервер.

Так что в этом случае лак не имеет понятия, что один и тот же адрес / запрос может иметь разное содержимое в зависимости от IP-адреса. Так что, я думаю, однажды лак кеширует содержимое, пока оно не истечет.

Я бы порекомендовал использовать varnishlog и провести некоторое тестирование, имитирующее клиента из ЕС и RU. Если у вас нет доступа к внешнему IP из России, просто используйте несколько экземпляров Amazon EC2:)

Надеюсь, это поможет.

Другие вопросы по тегам