1

I am maintaining a website with 3 different versions of the site, with 3 different languages, handles with a single system written in php, which takes in environment variables based on the domain name that is being accessed. These are the three sites:

  • myshop.com : english international version
  • myshop.eu : european version of site
  • myshop.ru : russian version of the site

when myshop.com is accessed from russia it is to be redirected to myshop.ru, and any country from europe accesses myshop.com, is redirected to myshop.eu, and international visitors stay at myshop.com, although they can go to the country specific site. All these redirections for the country is done using GeoIP apache2 mod in order to determine the country code, which is used in a RewriteCondition to state a RewriteRule, there are some exceptions of IPs that do not do the rewrite for, basically the IPs of the developer's PCs. The site has been doing just fine, until we decided to setup varnish to give the site a boost, it really did give it a great boost, but the country specific rewrites has become buggy.

What started to happen is that a russian visitor can go to myshop.com and won't be redirected, until he clicks a random link (perhaps a link not cached by varnish yet) and the user is redirected to their specific country.

For that i setup mod_rpaf, and for exceptions to the rewrite rule (for the developer's ip), i used this RewriteCond %{HTTP:X-FORWARDED-FOR} !^43\.43\.43\.43, and i restarted varnish and apache2, it worked for a while, then it messed up again.

And whole day i have been doing changes however i have little no clue as to what's going on, sometimes it works, and sometimes it doesn't, and sometimes it half works, etc...

As for geoip, i used a php to check the $_SERVER variable, and here is the general idea of the output

[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

Now, thanks to the "random" redirects, i hardly have a clue as to what is going on, so can you guys please give me some ideas as to what tools to use to debug this? I have tried to see the redirect logs, but they really dont show much, and varnishlog isn't helping much either - although i must admit i am no professional at varnish.

I believe the problem is with varnish trying to cache the url, and thus apache redirects are not being done properly, however visits the site first has a redirect, and based on that other users are served the content, depending on from where the user was when the cache was last updated, is it correct? if so, how can i solve the problem?

Also, i have the option of using geoip redirects on varnish3 instead of using apache2 to do the redirects, is that what the best practice is? Any suggestion as to debugging this or to fix this would be helpful!

thnx!

mercy
  • 131
  • 5

2 Answers2

1

There exist ways to use inline C in your VCL to have Varnish do your GeoIP detection. You need to do it there so that you redirect before the user gets served a cached page that might be intended for a different region.

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

Pax
  • 335
  • 2
  • 8
  • that's the thing i was dreading.. i was just hoping to get some other workaround it - hopeful thinking doesn't get you far.. i am just worried about downtime, this can possibly lead to more downtime then small changes to apache configurations, i will keep this question open, see if i can get any other workaround, probably wont, but worth a try -- also, thanks! – mercy Jun 28 '12 at 16:47
0

I still don't have enough rights to write a comment so this is why I will post my answer here.

Based on the problem there is a big chance that varnish is the cause, especially if you use a setup like that:

varnish -> backend .com http server (which decides based on IP rules where to redirect the request) -> (.ru|.eu) web server.

So if that's the case varnish has no clue that the same address/request can have different content based on the IP address. So I guess once varnish cache the content will keep it there until it expires.

What I would recommend is to use varnishlog and do some testing emulating an EU customer and a RU one. If you don't have access to an outside IP from Russia just use some Amazon EC2 instances :)

Hopefully this will help.

golja
  • 1,611
  • 10
  • 14