Bagaimana cara membuat HAProxy menulis ulang ke back-end yang berbeda ketika file pertama hilang? Yang saya butuhkan hanyalah errorloc
membuat penulisan ulang alih-alih redirect, sehingga klien tidak mengetahui redirect.
Kami telah mengembangkan aplikasi dengan mempertimbangkan NginX, yang merupakan proksi penyeimbang beban mundur dan server web untuk file statis. Aplikasi didasarkan pada kerangka Opa yang membutuhkan sesi sticky berdasarkan cookie - didukung oleh NginX dan HAproxy. Fitur aplikasi yang menjadi masalah adalah pembuatan konten dinamis. Ini menghasilkan gambar sesuai permintaan, tetapi setelah generasi disimpan dalam disk dan dapat diakses secara statis dengan jalur deterministik.
Masalah mudah diselesaikan dengan NginX - ia mencoba membaca file lokal dan menggunakan load back-end yang seimbang hanya jika file tersebut hilang (belum dibuat):
server {
server_name wkaliszu.pl;
location /thumb {
root /path_on_disk/to_cached_content;
expires 7d;
# try to access already generated content
try_files $uri @wkaliszu;
}
location / {
# reverse proxy to the application
[...]
}
location @wkaliszu {
# reverse proxy to the application
[...]
}
}
Server dimigrasikan dan sekarang menggunakan HAPproxy untuk load balancing, yang bukan server web dan tidak mendukung fitur ini. Sekarang pembuatan perangkat lunak dinamis dilakukan setiap kali klien mencoba mengakses sumber daya, yang jauh lebih lambat dan membuang-buang sumber daya. Akan lebih baik jika dapat menggunakan back-end berikutnya jika yang pertama (server web caching sederhana untuk file statis) gagal dengan kesalahan 404, tetapi saya tidak dapat menemukan cara untuk melakukannya dengan cara sederhana. Mengarahkan kembali /thumb
ke NginX, yang mencoba membaca file statis dan kembali menulis ulang ke HAproxy dengan header HTTP baru hanya muncul di benak saya, tetapi saya ingin menemukan sesuatu yang lebih baik.
Jawaban:
Backend HAProxy naik atau turun (atau sedang naik / turun).
Ada berbagai cara untuk memeriksa kesehatan backend tetapi saya tidak mengetahui ada yang menyediakan pelacakan berdasarkan permintaan. Setelah permintaan gagal, backend itu akan ditandai sebagai turun atau akan gagal (dalam perjalanan untuk dianggap turun).
Logika ini sangat berbeda dari pengaturan Nginx Anda yang merutekan permintaan berdasarkan permintaan.
Saya melihat beberapa opsi di sini:
Caching Proxy
Di HAProxy, Anda akan menggunakan ACL untuk merutekan permintaan konten statis ke backend tertentu. Node backend tersebut akan menjalankan nginx dengan proxy caching. Jika nginx memiliki file di-cache, itu hanya akan menyajikannya. Jika tidak, itu akan memanggil backend Anda.
Gunakan Server Aplikasi untuk Konten Statis
Jika server aplikasi Anda efisien dalam menyajikan konten statis, Anda mungkin tidak perlu membagi permintaan dalam haproxy. Cukup kirim semua permintaan ke aplikasi Anda backend. Bangun logika ke dalamnya untuk menyajikan konten statis jika tersedia dan jika tidak mengirim permintaan ke backend.
Opsi CDN
Jika Anda dapat menggunakan domain khusus untuk konten statis, Anda mungkin dapat menggunakan CDN. Di CDN, Anda cukup arahkan ke URL sumber ke node aplikasi Anda. Anda kemudian dapat mengontrol caching di tingkat CDN. Ini mirip dengan caching Nginx di atas kecuali penyedia CDN menanganinya untuk Anda.
sumber