HTTP/2 #
HTTP/2 adalah versi mayor pertama dari protokol HTTP sejak HTTP/1.1 di tahun 1997. Ia dirancang khusus untuk mengatasi bottleneck performa yang ada di HTTP/1.1, terutama untuk halaman web modern yang memuat puluhan hingga ratusan resource (CSS, JS, gambar, font).
Masalah yang Diselesaikan HTTP/2 #
HTTP/1.1 punya batasan fundamental: satu request per koneksi pada satu waktu. Browser mengatasi ini dengan membuka banyak koneksi TCP paralel (biasanya 6 per domain), tapi ini punya overhead sendiri dan tidak efisien.
HTTP/1.1:
Koneksi 1: req → resp → req → resp → req → resp (serial per koneksi)
Koneksi 2: req → resp → req → resp
Koneksi 3: req → resp → req → resp
... (hingga 6 koneksi)
HTTP/2 (multiplexing):
Satu koneksi: stream1, stream2, stream3, stream4... (paralel, semua di satu koneksi)
Multiplexing adalah fitur utama HTTP/2 — banyak request dan response bisa berjalan bersamaan dalam satu koneksi TCP, menghilangkan bottleneck serialisasi HTTP/1.1.
Fitur lain HTTP/2:
- Header compression (HPACK): Header HTTP sering berulang antar request, kompresi mengurangi overhead signifikan
- Binary protocol: Lebih efisien untuk parsing dibanding format teks HTTP/1.1
- Stream prioritization: Klien bisa memberi tahu server resource mana yang lebih penting
Mengaktifkan HTTP/2 di Nginx #
Nginx 1.25.1 ke atas (cara baru) #
server {
listen 443 ssl;
http2 on; # Directive terpisah sejak Nginx 1.25.1
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# ...
}
Nginx sebelum 1.25.1 (cara lama) #
server {
listen 443 ssl http2; # http2 sebagai parameter listen
server_name example.com;
# ...
}
Cara mana yang digunakan tergantung versi Nginx kamu. Cara lama masih berfungsi tapi deprecated di versi baru.
# Cek versi Nginx
nginx -v
HTTP/2 Membutuhkan HTTPS #
Secara teknis, HTTP/2 bisa berjalan di atas HTTP (biasa disebut h2c — HTTP/2 Cleartext). Tapi dalam praktiknya, semua browser hanya mendukung HTTP/2 di atas HTTPS. Jadi mengaktifkan HTTP/2 di Nginx hanya relevan di server block yang menggunakan SSL.
Verifikasi HTTP/2 Aktif #
# Gunakan curl untuk cek protokol yang digunakan
curl -I --http2 https://example.com
# Perhatikan "HTTP/2" di baris pertama response
# Atau cek dengan verbose
curl -v --http2 https://example.com 2>&1 | grep "< HTTP"
# < HTTP/2 200
# Di browser: buka DevTools → Network → klik request
# Kolom Protocol harus menampilkan "h2"
Tuning untuk HTTP/2 #
Dengan HTTP/2, beberapa optimasi lama HTTP/1.1 tidak lagi diperlukan atau bahkan bisa kontraproduktif:
http {
# HTTP/2 settings
# Ukuran window untuk flow control (default 65535 bytes, bisa dinaikkan)
http2_chunk_size 8k;
# Jumlah request dalam satu koneksi HTTP/2 sebelum koneksi ditutup
# (untuk mencegah satu koneksi tumbuh tak terbatas)
keepalive_requests 1000;
}
Tidak lagi perlu dengan HTTP/2:
- Domain sharding (memisahkan asset ke beberapa subdomain) — justru merugikan dengan HTTP/2 karena memecah satu koneksi menjadi banyak
- CSS/JS bundling agresif — HTTP/2 multiplexing sudah menangani banyak file kecil dengan efisien, tapi bundling masih berguna untuk mengurangi parse overhead di browser
- Sprite gambar — tidak signifikan lagi dengan HTTP/2
Server Push (Fitur yang Jarang Berguna) #
HTTP/2 Server Push memungkinkan server mengirimkan resource sebelum klien memintanya — misalnya, server mengirim CSS dan JS bersamaan dengan HTML tanpa menunggu browser parse HTML terlebih dahulu.
location = /index.html {
http2_push /style.css;
http2_push /app.js;
}
Dalam praktik, Server Push jarang memberikan manfaat yang signifikan dibanding <link rel="preload"> di HTML, dan bisa boros bandwidth jika klien sudah punya file tersebut di cache. Banyak browser bahkan sudah menghapus support untuk Server Push. Abaikan fitur ini kecuali ada kebutuhan yang sangat spesifik.
HTTP/3 dan QUIC: Apa yang Akan Datang #
HTTP/3 menggunakan protokol transport QUIC (berbasis UDP) alih-alih TCP. Keuntungan utamanya: mengatasi “head-of-line blocking” di level transport yang masih ada di HTTP/2 over TCP.
Nginx mulai mendukung HTTP/3 di versi 1.25.0 (mainline), tapi masih berstatus eksperimental:
# HTTP/3 di Nginx (experimental, butuh nginx >= 1.25.0 dengan QUIC support)
server {
listen 443 quic reuseport; # UDP untuk QUIC
listen 443 ssl; # TCP untuk HTTP/1.1 dan HTTP/2
http3 on;
http2 on;
# Beritahu browser bahwa HTTP/3 tersedia
add_header Alt-Svc 'h3=":443"; ma=86400';
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
HTTP/3 belum siap untuk semua production environment — perlu binary Nginx yang dikompilasi dengan library QUIC (seperti BoringSSL atau quictls). Untuk mayoritas kasus, HTTP/2 sudah lebih dari cukup.
Ringkasan #
- HTTP/2 mengaktifkan multiplexing — banyak request paralel dalam satu koneksi TCP, mengatasi bottleneck HTTP/1.1.
- Di Nginx ≥ 1.25.1 gunakan
http2 onsebagai directive terpisah; di versi lama gunakanlisten 443 ssl http2.- HTTP/2 di browser hanya berjalan di atas HTTPS — tidak ada manfaat mengaktifkan HTTP/2 tanpa SSL.
- Dengan HTTP/2, domain sharding dan beberapa optimasi HTTP/1.1 lainnya tidak lagi perlu.
- Server Push jarang memberikan manfaat nyata — lewati saja kecuali ada kebutuhan spesifik yang sudah diukur.
← Sebelumnya: Optimasi Konfigurasi SSL Berikutnya: Basic Auth →