Open File Cache #
Setiap kali Nginx menyajikan file statis, sistem operasi perlu membuka file tersebut: mencari inode di filesystem, membaca metadata, lalu membuka file descriptor. Untuk server yang menyajikan ribuan file statis dengan traffic tinggi, operasi ini bisa menjadi bottleneck.
open_file_cache menyimpan file descriptor yang terbuka dan metadata file (ukuran, waktu modifikasi) di memori. Request berikutnya untuk file yang sama langsung menggunakan file descriptor dari cache — tanpa syscall open() ke filesystem.
Cara Kerja #
Tanpa open_file_cache (setiap request):
1. Nginx terima request /static/app.js
2. Nginx panggil syscall open("/var/www/app.js")
3. OS cari inode di filesystem
4. Buka file descriptor
5. Baca dan kirim konten
6. Tutup file descriptor
Dengan open_file_cache (setelah request pertama):
1. Nginx terima request /static/app.js
2. Cek cache → file descriptor sudah ada
3. Langsung baca dan kirim konten (lewati langkah 2-4)
Manfaat terbesar terasa di server yang menyajikan banyak file kecil dengan traffic tinggi, atau di filesystem dengan latency lookup yang tinggi.
Konfigurasi #
http {
# max: jumlah maksimum file descriptor yang di-cache
# inactive: hapus dari cache jika tidak diakses selama ini
open_file_cache max=10000 inactive=30s;
# Berapa sering Nginx memvalidasi bahwa file di cache masih valid
# (belum dimodifikasi atau dihapus)
open_file_cache_valid 60s;
# File harus diakses minimal N kali selama periode inactive
# sebelum disimpan ke cache
# Ini mencegah file yang jarang diakses mengisi cache
open_file_cache_min_uses 2;
# Cache juga error "file not found" (404)
# Mencegah filesystem lookup berulang untuk file yang tidak ada
open_file_cache_errors on;
}
Memilih Nilai yang Tepat #
max=10000:
Berapa banyak file berbeda yang aktif diakses?
Untuk static file server biasa: 1000-5000
Untuk server dengan banyak user-uploaded content: bisa lebih tinggi
Masing-masing entry menggunakan ~500 bytes memori → 10000 = ~5MB
inactive=30s:
Seberapa sering file diakses?
File statis web yang sering diakses: 20-60s
File yang jarang diakses: lebih pendek agar memori terpakai untuk yang aktif
open_file_cache_valid=60s:
Seberapa sering file berubah di disk?
File statis production (jarang berubah): 60-300s
File yang sering di-deploy ulang: 10-30s
Nilai tinggi = lebih efisien, tapi file yang diupdate tidak langsung terdeteksi
Open File Cache untuk File Statis yang Banyak #
Konfigurasi yang dioptimalkan untuk server yang banyak menyajikan file statis:
http {
# Cache agresif untuk production static file server
open_file_cache max=50000 inactive=60s;
open_file_cache_valid 120s;
open_file_cache_min_uses 3;
open_file_cache_errors on;
server {
listen 443 ssl;
server_name static.example.com;
root /var/www/static;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
location ~* \.(css|js|png|jpg|woff2|ico)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
}
}
Interaksi dengan sendfile #
open_file_cache bekerja sinergis dengan sendfile:
http {
# sendfile: gunakan syscall sendfile() untuk mengirim file
# Lebih efisien dari read() + write() karena menghindari copy ke user space
sendfile on;
# tcp_nopush: kumpulkan data sebelum dikirim (mengurangi jumlah paket TCP)
# Hanya efektif saat sendfile on
tcp_nopush on;
# tcp_nodelay: kirim data segera tanpa delay Nagle algorithm
# Berguna untuk koneksi keepalive
tcp_nodelay on;
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
}
Ketiganya bersama-sama (sendfile, tcp_nopush, open_file_cache) adalah kombinasi optimal untuk menyajikan file statis dengan efisien.
Kapan open_file_cache Tidak Signifikan #
Open file cache paling bermanfaat untuk:
- Server yang banyak menyajikan file statis (HTML, CSS, JS, gambar)
- Server dengan traffic tinggi dan banyak file berbeda yang diakses
- Filesystem dengan latency lookup yang tinggi (network filesystem, filesystem yang sudah penuh)
Open file cache kurang bermanfaat untuk:
- Server yang terutama berfungsi sebagai reverse proxy (tidak menyajikan file dari disk)
- Server dengan sedikit file yang sudah di-cache oleh OS page cache
- Server dengan traffic rendah di mana overhead syscall tidak signifikan
Ringkasan #
open_file_cachemenyimpan file descriptor terbuka di memori — menghilangkan syscallopen()untuk setiap request ke file statis.open_file_cache_errors onjuga cache “file not found” — mencegah filesystem lookup berulang untuk URL yang tidak ada.open_file_cache_validmenentukan seberapa sering Nginx memvalidasi cache — nilai lebih tinggi lebih efisien tapi file yang diupdate tidak langsung terdeteksi.- Kombinasikan dengan
sendfile ondantcp_nopush onuntuk performa file statis yang optimal.- Manfaat paling signifikan untuk server static file dengan traffic tinggi — untuk pure reverse proxy, manfaatnya minimal.