Seleção de moeda padrão baseada em GeoIp por trás do Varnish

14

Desejo que uma loja escolha inteligentemente uma moeda padrão com base no IP do cliente usando o GeoIP na primeira visita (sem cookie de moeda pré-selecionado). A loja fica atrás da Varnish usando a excelente extensão Turpentine da Nexcess.

A extensão manipula bem a moeda, desde que o cookie de moeda Magento padrão seja definido em uma determinada solicitação.

Meus pensamentos nesta fase são:

  1. Adicione VCL na configuração do Varnish para fazer a pesquisa GeoIP (em C) e defina o cookie na solicitação de entrada, se ainda não estiver definida, é claro.
  2. Adicione um bloco em cache por usuário que faça a pesquisa e defina o cookie (embora isso não se aplique no carregamento da primeira página)

Estou perdendo uma técnica óbvia - talvez algum JS do lado do cliente para um caminho de URL em cache não-verniz que faça a determinação?

Alguém sabe a melhor maneira de fazer isso?

Ashley Schroder
fonte

Respostas:

4

Temos algo parecido com isso em produção (estamos ativando ou desativando a adição ao carrinho e o preço, dependendo da localização do cliente).

Criamos e instalamos o "módulo Varnish GeoIP" em https://github.com/leed25d/geoip-vmod ... Isso define um cabeçalho "X-GeoIP" em cada solicitação que chega ao Magento, indicando o país do usuário. No Magento, você precisa detectar esse cabeçalho e personalizar o conteúdo conforme necessário.

O problema final a ser superado é que o Varnish armazenará em cache a página gerada e a servirá a todos os clientes, independentemente do país. Você pode "desativar" o cache dessa página, mas o desempenho é prejudicado, portanto também não é o ideal. Nossa solução foi enviar um cabeçalho "Vary" em nossa resposta HTTP, que informa ao Varnish para armazenar em cache objetos diferentes para valores diferentes do cabeçalho X-GeoIP, para que tenhamos uma página em cache diferente para o país de cada visitante.

Um dos meus colegas da Aligent criou um módulo Magento que contém um auxiliar para buscar o código do país no cabeçalho X-GeoIP (com fallback para IP, se não estiver presente, o que é útil para o desenvolvimento) e um observador para enviar o " Varie "cabeçalho. Abrimos a fonte do módulo, confira https://github.com/aligent/Aligent_GeoIP se você quiser os detalhes da implementação.

Jim OHalloran
fonte
1

Você pode tentar definir a variável de servidor X-Forwarded-For e usá-la com geoip

 remove req.http.X-Forwarded-For;
 set req.http.X-Forwarded-For = client.ip;
Anton S
fonte
Mas isso só ajudará o back-end a definir corretamente a moeda da primeira solicitação para dizer uma página de produto. A segunda e subsequente exibição dessa página do produto, por qualquer usuário, será armazenada em cache pelo Varnish, para que o código da moeda no back-end não funcione corretamente? Eu acho que a configuração padrão do cookie precisa acontecer antes que ele atinja o back-end?
Ashley Schroder
AJAX ou ESI incluem se a sua extensão magento-verniz suportar.
Dmytro Zavalkin
1

Eu não fiz isso antes, mas o que é isso que me passa pela cabeça:

Use libvmod-geoip para determinar o código do país (não use esta extensão de verniz, tenha cuidado ;-)) https://github.com/lampeh/libvmod-geoip

Em seguida, você estende a função hash via sub vcl_hash()para adicionar o código do país às chaves de cache. Isso permite que você armazene em cache tudo com base no código do país.

sub vcl_hash {
    #...
    set req.hash += geoip.client_country_code();
    #...
}

Você também adiciona o código do país como um cabeçalho, set req.http.X-GeoIP = geoip.client_country_code();assim o servidor magento é capaz de determinar o país correto e entregar o material correto.

Esta é apenas uma ideia, pode ser necessário melhorá-la, mas espero que ajude você a encontrar uma boa solução :)

Você também pode acessar os cookies dos clientes e verificar o código do país / moeda e, se definido, seguir um caminho diferente e não chamar a função geoip ...

thebod
fonte
0

Você sugeriu o cache por usuário, o que é loucura. Suas taxas de acerto no cache quase não anularão nenhum benefício do uso do Varnish. Sem mencionar que o Varnish trabalhará muito duro por meio de seu mecanismo LRU para descartar entradas antigas de cache por usuário para criar espaço para novas entradas de cache por usuário.

Você tem poucas opções,

  1. Mantenha o verniz, use o módulo geoip do verniz, use o cache por usuário, tenha taxas de acerto de 0% e desperdice todos os recursos do servidor na instância de verniz.
  2. Mantenha o verniz, use o módulo geoip do verniz, use um ESI para qualquer bloco relacionado à moeda. Você precisará armazenar em cache o esi, caso contrário, novamente, as taxas de acerto serão nulas.
  3. Mantenha o verniz, use o módulo geoip do verniz e apenas altere sua estrutura de URL. Se você tiver um URL diferente para cada moeda (por exemplo, / usd, / can), terá taxas de acerto não diminuídas, e ele funcionará quase na perfeição.
  4. Vala de verniz, então tudo funcionará como pretendido.
choco-loo
fonte