Назад | Перейти на главную страницу

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

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

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

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

Для этого я установил mod_rpaf, а для исключений из правила перезаписи (для ip разработчика) я использовал это RewriteCond %{HTTP:X-FORWARDED-FOR} !^43\.43\.43\.43, и я перезапустил varnish и 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 тоже мало помогает - хотя должен признать, что я не профессионал в лаке.

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

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

спасибо!

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

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

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

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

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

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

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

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