varnish3,mod_geoip 与 apache2 使用 mod_rewrite 和 mod_rpaf

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 mod 完成的,以确定国家/地区代码,该代码用于 RewriteCondition 中以声明 RewriteRule,有一些例外的 IP 不会执行重写,基本上是开发人员 PC 的 IP。该网站一直运行良好,直到我们决定安装 varnish 来提升网站,它确实给了它很大的提升,但特定国家/地区的重写出现了错误。

开始发生的情况是,俄罗斯访客可以访问 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 的专业人士。

我认为问题在于 varnish 尝试缓存 URL,因此 apache 重定向无法正确完成,但是访问网站时首先会进行重定向,并且根据上次更新缓存时用户所在的位置,其他用户会根据该重定向获得内容,这是正确的吗?如果是这样,我该如何解决这个问题?

另外,我可以选择在 varnish3 上使用 geoip 重定向,而不是使用 apache2 进行重定向,这是最佳做法吗?任何有关调试或修复此问题的建议都会有所帮助!

谢谢!

答案1

有几种方法可以在 VCL 中使用内联 C 来让 Varnish 进行 GeoIP 检测。您需要在那里执行此操作,以便在用户获得可能针对不同区域的缓存页面之前进行重定向。

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

答案2

我仍然没有足够的权限来发表评论,所以我会在这里发表我的答案。

根据问题情况,很有可能是由清漆引起的,特别是如果您使用如下设置:

varnish -> 后端 .com http 服务器(根据 IP 规则决定将请求重定向到何处)-> (.ru|.eu) 网络服务器。

因此,如果是这样的话,Varnish 不知道同一个地址/请求可以根据 IP 地址具有不同的内容。所以我猜一旦 Varnish 缓存了内容,它就会保留在那里,直到过期。

我建议使用 varnishlog 并模拟欧盟客户和俄罗斯客户进行一些测试。如果您无法从俄罗斯访问外部 IP,只需使用一些 Amazon EC2 实例 :)

希望这会有所帮助。

相关内容