Pilihan mata uang default berbasis GeoIP di belakang Varnish

14

Saya ingin toko secara cerdas memilih mata uang default berdasarkan IP pelanggan menggunakan GeoIP ketika mereka pertama kali mengunjungi (tanpa cookie mata uang yang dipilih sebelumnya). Toko ini berada di belakang Varnish menggunakan ekstensi Turpentine Nexcess yang sangat baik.

Perpanjangan menangani mata uang dengan baik selama cookie mata uang Magento standar ditetapkan pada permintaan yang diberikan.

Pikiran saya pada tahap ini adalah:

  1. Tambahkan VCL ke dalam konfigurasi Varnish untuk melakukan pencarian GeoIP (dalam C) dan mengatur cookie pada permintaan masuk, jika belum diatur, tentu saja.
  2. Tambahkan blok cache per-pengguna yang melakukan pencarian dan mengatur cookie (meskipun ini kemudian tidak berlaku pada pemuatan halaman pertama)

Apakah saya kehilangan teknik yang jelas - mungkin beberapa JS sisi klien ke jalur URL yang tidak di-cache yang membuat penentuan?

Adakah yang tahu cara terbaik untuk melakukan ini?

Ashley Schroder
sumber

Jawaban:

4

Kami memiliki sesuatu yang berjalan seperti ini dalam produksi (kami mengaktifkan atau menonaktifkan tambahkan ke keranjang dan harga tergantung pada lokasi pelanggan).

Kami membuat dan memasang "modul Varnish GeoIP" dari https://github.com/leed25d/geoip-vmod ... Ini menetapkan header "X-GeoIP" di setiap permintaan yang mencapai Magento yang menunjukkan negara pengguna. Di dalam Magento Anda perlu mendeteksi tajuk ini dan menyesuaikan konten sesuai kebutuhan.

Masalah terakhir yang harus diatasi adalah bahwa Varnish akan melakukan cache halaman yang dihasilkan dan menyajikannya kepada semua pelanggan terlepas dari negara mereka. Anda bisa "mematikan" caching untuk halaman itu, tetapi kinerjanya buruk, jadi itu juga tidak ideal. Solusi kami adalah mengirim header "Vary" dalam respons HTTP kami, yang memberitahu Varnish untuk men-cache objek yang berbeda untuk nilai yang berbeda dari header X-GeoIP, jadi kami memiliki halaman yang berbeda di-cache untuk masing-masing negara pengunjung.

Salah satu kolega saya di Aligent telah membuat modul Magento yang berisi penolong untuk mengambil kode negara dari header X-GeoIP (dengan fallback ke IP jika tidak ada, yang berguna untuk pengembangan), dan pengamat untuk mengirim " Header berbeda ". Kami telah membuka sumber modul, periksa https://github.com/aligent/Aligent_GeoIP jika Anda menginginkan detail implementasi.

Jim OHalloran
sumber
1

Anda dapat mencoba dan mengatur variabel server X-Forwarded-For dan menggunakannya dengan geoip

 remove req.http.X-Forwarded-For;
 set req.http.X-Forwarded-For = client.ip;
Anton S
sumber
Tapi itu hanya akan membantu backend mengatur dengan benar mata uang untuk permintaan pertama untuk mengatakan halaman produk. Tampilan kedua dan selanjutnya dari halaman produk itu, oleh pengguna mana pun, akan di-cache oleh Varnish dan sehingga kode mata uang di backend tidak akan berjalan dengan benar? Saya pikir pengaturan default cookie harus terjadi sebelum hits backend?
Ashley Schroder
AJAX atau ESI termasuk jika ekstensi magento-pernis Anda mendukungnya.
Dmytro Zavalkin
1

Saya belum pernah melakukan ini sebelumnya, tetapi apa yang terlintas di benak saya:

Gunakan libvmod-geoip untuk menentukan kode negara (belum menggunakan ekstensi pernis ini, berhati-hatilah ;-)) https://github.com/lampeh/libvmod-geoip

Kemudian Anda memperluas fungsi hash via sub vcl_hash()untuk menambahkan kode negara ke kunci cache. Itu memungkinkan Anda untuk men-cache semuanya berdasarkan kode negara.

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

Anda juga menambahkan kode negara sebagai tajuk, seperti set req.http.X-GeoIP = geoip.client_country_code();agar server magento dapat menentukan negara yang benar dan mengirimkan barang yang benar.

Ini hanya sebuah ide, Anda mungkin perlu memperbaikinya, tetapi semoga membantu Anda menemukan solusi yang baik :)

Anda juga dapat mengakses cookie pelanggan dan memeriksa kode negara / mata uang dan, jika diatur, gunakan cara yang berbeda dan jangan panggil fungsi geoip ...

otak
sumber
0

Anda menyarankan per caching pengguna, yang gila. Cache hit rate Anda akan hampir nol membatalkan manfaat menggunakan Varnish. Belum lagi Varnish akan bekerja sangat keras melalui mekanisme LRU untuk membuang entri cache per pengguna yang lama untuk memberi ruang bagi entri cache pengguna yang baru.

Anda punya beberapa pilihan,

  1. Pertahankan pernis, gunakan modul pernis geoip, gunakan per cache pengguna, dapatkan 0% hit rate dan buang semua sumber daya server Anda pada instance pernis.
  2. Pertahankan pernis, gunakan modul geoip pernis, gunakan ESI untuk semua blok mata uang terkait. Anda harus men-cache esi, jika tidak, sekali lagi, tingkat klik akan menjadi nol.
  3. Pertahankan Varnish, gunakan modul geoip varnish, dan ubah struktur URL Anda. Jika Anda memiliki url yang berbeda untuk setiap mata uang (mis. / Usd, / bisa), maka Anda akan memiliki nilai hit yang tidak berkurang, dan itu akan bekerja hampir tanpa cacat.
  4. Parit pernis, maka semuanya akan berfungsi sebagaimana dimaksud.
choco-loo
sumber