sunting: Jawaban saya hanya mencakup pertanyaan asli yang belum diedit, yang merupakan apakah hal semacam ini tipikal dalam load balancers / reverse proxy. Saya tidak yakin apakah nginx / produk X memiliki dukungan untuk ini, 99,9% pengalaman proksi terbalik saya adalah dengan HAproxy.
Benar. HTTP Keep-Alive di sisi klien, tetapi tidak di sisi server.
Mengapa?
Jika Anda menguraikan beberapa detail, Anda dapat dengan cepat melihat mengapa ini menguntungkan. Untuk contoh ini, mari kita berpura-pura sedang memuat halaman www.example.com dan halaman itu mencakup 3 gambar, img [1-3] .jpg.
Browser memuat halaman, tanpa Keep-Alive
- Klien membuat koneksi TCP ke www.example.com pada port 80
- Klien melakukan permintaan GET HTTP untuk "/"
- Server mengirimkan konten HTML dari URI "/" (yang mencakup tag HTML yang mereferensikan 3 gambar)
- Server menutup koneksi TCP
- Klien membuat koneksi TCP ke www.example.com pada port 80
- Klien melakukan permintaan GET HTTP untuk "/img1.jpg"
- Server mengirimkan gambar
- Server menutup koneksi TCP
- Klien membuat koneksi TCP ke www.example.com pada port 80
- Klien melakukan permintaan GET HTTP untuk "/img2.jpg"
- Server mengirimkan gambar
- Server menutup koneksi TCP
- Klien membuat koneksi TCP ke www.example.com pada port 80
- Klien melakukan permintaan GET HTTP untuk "/img3.jpg"
- Server mengirimkan gambar
- Server menutup koneksi TCP
Perhatikan bahwa ada 4 sesi TCP terpisah yang dibuat dan kemudian ditutup.
Browser memuat halaman, dengan Keep-Alive
HTTP Keep-Alive memungkinkan koneksi TCP tunggal untuk melayani beberapa permintaan HTTP, satu demi satu.
- Klien membuat koneksi TCP ke www.example.com pada port 80
- Klien melakukan permintaan GET HTTP untuk "/", dan juga meminta server untuk menjadikan ini sesi Keep-Alive HTTP.
- Server mengirimkan konten HTML dari URI "/" (yang mencakup tag HTML yang mereferensikan 3 gambar)
- Server tidak menutup koneksi TCP
- Klien melakukannya dan permintaan GET HTTP untuk "/img1.jpg"
- Server mengirimkan gambar
- Klien melakukannya dan permintaan GET HTTP untuk "/img2.jpg"
- Server mengirimkan gambar
- Klien melakukannya dan permintaan GET HTTP untuk "/img3.jpg"
- Server mengirimkan gambar
- Server menutup koneksi TCP jika tidak ada lagi permintaan HTTP yang diterima dalam periode waktu habis HTTP Keep-Alive-nya
Perhatikan bahwa dengan Keep-Alive, hanya 1 koneksi TCP yang dibuat dan akhirnya ditutup.
Mengapa Keep-Alive lebih baik?
Untuk menjawab ini, Anda harus memahami apa yang diperlukan untuk membuat koneksi TCP antara klien dan server. Ini disebut jabat tangan TCP 3 arah.
- Klien mengirimkan paket SYN (chronise)
- Server mengirimkan kembali SYN (chronise) ACK (nowledgement), SYN-ACK
- Klien mengirimkan paket ACK (sekarang)
- Koneksi TCP sekarang dianggap aktif oleh klien dan server
Jaringan memiliki latensi, sehingga setiap langkah dalam jabat tangan 3-arah membutuhkan waktu tertentu. Katakanlah bahwa ada 30 ms antara klien dan server, pengiriman paket IP bolak-balik yang diperlukan untuk membangun koneksi TCP berarti dibutuhkan 3 x 30 ms = 90 ms untuk membuat koneksi TCP.
Ini mungkin kedengarannya tidak banyak, tetapi jika kita menganggap bahwa dalam contoh asli kita, kita harus membuat 4 koneksi TCP terpisah, ini menjadi 360ms. Bagaimana jika latensi antara klien dan server adalah 100 ms, bukan 30 ms? Kemudian 4 koneksi kami membutuhkan 1200ms untuk dibangun.
Lebih buruk lagi, halaman web biasa mungkin memerlukan lebih dari hanya 3 gambar untuk memuat, mungkin ada beberapa CSS, JavaScript, gambar atau file lain yang perlu diminta klien. Jika halaman memuat 30 file lain dan latensi klien-server adalah 100 ms, berapa lama kita habiskan membuat koneksi TCP?
- Untuk membangun 1 koneksi TCP dibutuhkan 3 x latensi, yaitu 3 x 100 ms = 300 ms.
- Kita harus melakukan ini 31 kali, sekali untuk halaman, dan 30 kali untuk setiap file lainnya yang dirujuk oleh halaman. 31 x 300 ms = 9,3 detik.
9,3 detik dihabiskan untuk membuat koneksi TCP untuk memuat halaman web yang mereferensikan 30 file lainnya. Dan itu bahkan tidak menghitung waktu yang dihabiskan untuk mengirim permintaan HTTP dan menerima tanggapan.
Dengan HTTP Keep-Alive, kita hanya perlu membuat 1 koneksi TCP, yang membutuhkan 300ms.
Jika HTTP Keep-Alive begitu hebat, mengapa tidak menggunakannya di sisi server juga?
Proxy reverse HTTP (seperti HAproxy) biasanya digunakan sangat dekat dengan server backend yang mereka proksi. Dalam kebanyakan kasus, latensi antara proxy terbalik dan server backendnya berada di bawah 1 ms, jadi membangun koneksi TCP jauh lebih cepat daripada di antara klien.
Itu hanya setengah alasannya. Server HTTP mengalokasikan sejumlah memori untuk setiap koneksi klien. Dengan Keep-Alive, itu akan membuat koneksi tetap hidup, dan dengan ekstensi itu akan menjaga sejumlah memori yang digunakan di server, sampai batas waktu Keep-Alive tercapai, yang mungkin mencapai 15-an, tergantung pada konfigurasi server .
Jadi jika kita mempertimbangkan efek dari menggunakan Keep-Alive pada sisi server dari HTTP reverse proxy, kami meningkatkan kebutuhan akan memori, tetapi karena latensi antara proxy dan server sangat rendah, kami tidak mendapatkan manfaat nyata dari pengurangan waktu yang diperlukan untuk jabat tangan 3-arah TCP, jadi biasanya lebih baik menonaktifkan Keep-Alive antara proxy dan server web dalam skenario ini.
Penafian: ya, penjelasan ini tidak memperhitungkan fakta bahwa browser biasanya membuat beberapa koneksi HTTP ke server secara paralel. Namun, ada batasan berapa banyak koneksi paralel yang dilakukan browser ke host yang sama, dan biasanya ini masih cukup kecil untuk membuat keep-live diinginkan.