nginx njs: memasang modul, mengatur js_set, dan menerapkan reload untuk membuat variabel JavaScript

nginx njs adalah modul resmi nginx yang memproses permintaan atau membuat nilai variabel dengan fungsi JavaScript di dalam konfigurasi nginx. Di server dengan konfigurasi Nginx + Apache, untuk menyamakan huruf besar-kecil URL permintaan yang tidak bisa diubah hanya dengan konfigurasi nginx, modul njs diinstal dengan versi yang sama dengan nginx yang terpasang, lalu variabel yang dibuat dengan js_set dimasukkan ke jalur file cache dan diterapkan dengan reload tanpa restart.
Fungsi contohnya hanya satu baris yang mengubah percent-encoding URL berhuruf Korea menjadi huruf kecil, dan cara membuat variabel dengan membaca nilai header atau argumen dari objek permintaan juga sama.
1️⃣ Apa itu nginx njs: modul yang memperluas fungsi nginx dengan JavaScript
njs bukan lingkungan eksekusi JavaScript yang berjalan sendiri seperti Node.js: tidak ada skrip awal atau event loop sendiri, dan kode hanya berjalan saat nginx memanggil fungsi yang ditentukan di konfigurasi, lalu pemrosesan kembali ke nginx.
Titik tempat nginx memanggil fungsi JavaScript sudah ditetapkan: tahap pemrosesan permintaan dan respons HTTP, tahap pemrosesan sesi TCP·UDP, perhitungan nilai variabel, dan timer berkala. Fungsi membaca URL, header, dan argumen dari objek permintaan yang diberikan nginx, lalu mengembalikan hasilnya sebagai respons atau nilai variabel.
Di sisi HTTP, [js_import] memuat file skrip, [js_set] membuat nilai variabel, [js_content] membuat isi respons, serta [js_header_filter] dan [js_body_filter] mengolah header dan isi respons. Direktif yang dipakai dalam penerapan ini ada dua: [js_import] dan [js_set].
Mesin bawaan modul njs mengimplementasikan ECMAScript 5.1 (strict mode) ditambah sebagian fitur ECMAScript 6 dan sesudahnya. Pengolahan string setingkat penggantian regex dan fungsi berjalan dalam cakupan ini.
2️⃣ Kapan njs diperlukan: nilai variabel yang tidak bisa diubah hanya dengan konfigurasi nginx
Plugin WordPress WP Rocket memberi nama folder cache artikel ber-URL huruf Korea dengan percent-encoding huruf kecil, sedangkan browser meminta URL yang sama dengan pengodean huruf besar. Situs WordPress berjalan di server ini.
Jika nginx membuat jalur file cache langsung dari URL permintaan, huruf besar-kecilnya tidak cocok sehingga file tidak ditemukan, dan permintaan diteruskan ke Apache dan PHP.
Nilai ini tidak bisa diubah menjadi huruf kecil hanya dengan konfigurasi nginx. [map] hanya memilih salah satu nilai yang ditetapkan dan tidak bisa mengubah string, dan sebelum instalasi, baik keluaran [nginx -V] maupun folder modul tidak memuat modul perl atau lua.
Jika URL yang perlu diubah hanya beberapa, tabel padanan [map] pun bisa menanganinya, tetapi tabel harus dibuat ulang dan di-reload setiap kali ada artikel baru. Jika setiap URL perlu diubah dengan aturan yang sama, satu fungsi [js_set] menangani juga URL artikel baru, tag, dan kategori.

[perl_set] dari modul perl juga bisa dipakai di titik yang sama, dan repositori punya paket yang berpasangan dengan nginx, tetapi dokumentasi resmi nginx menyebut modul perl sebagai modul eksperimental.
3️⃣ Instalasi nginx njs: dengan versi yang sama dengan nginx yang terpasang
Menginstal hanya dengan nama paket modul terlihat seperti hanya menambah njs, tetapi njs terbaru di repositori memerlukan nginx terbaru sehingga nginx ikut ditingkatkan. Pada pemeriksaan sebelum instalasi, perintah instalasi tanpa versi menampilkan rencana menaikkan nginx 1.28.0 ke 1.30.6.
Karena itu, periksa dulu versi nginx yang terpasang saat ini.
rpm -q nginxnginx-1.28.0-1.el9.ngx.x86_64Repositori memiliki paket njs tersendiri yang berpasangan dengan setiap versi nginx; dalam nomor versinya, bagian sebelum + adalah versi nginx dan bagian sesudahnya adalah versi njs.
dnf list --showduplicates nginx-module-njs | grep '1.28.0+'nginx-module-njs.x86_64 1:1.28.0+0.9.4-1.el9.ngx @nginx-stable
nginx-module-njs.x86_64 1:1.28.0+0.8.10-1.el9.ngx nginx-stable
nginx-module-njs.x86_64 1:1.28.0+0.9.0-1.el9.ngx nginx-stable
nginx-module-njs.x86_64 1:1.28.0+0.9.1-1.el9.ngx nginx-stable
nginx-module-njs.x86_64 1:1.28.0+0.9.2-1.el9.ngx nginx-stable
nginx-module-njs.x86_64 1:1.28.0+0.9.3-1.el9.ngx nginx-stable
nginx-module-njs.x86_64 1:1.28.0+0.9.4-1.el9.ngx nginx-stableVersi yang berpasangan dengan nginx 1.28.0 ada enam, dari 0.8.10 sampai 0.9.4, dan baris @nginx-stable paling atas adalah versi yang sudah terinstal. Instalasi dilakukan dengan versi terbaru, 0.9.4, dengan menuliskan nomor versinya lengkap.
dnf install nginx-module-njs-1:1.28.0+0.9.4-1.el9.ngxVersi nginx yang diperlukan paket yang terinstal bisa diperiksa dengan rpm.
rpm -q --requires nginx-module-njs | grep nginxnginx-r1.28.0rpm -ql nginx-module-njs | grep -v build-id/usr/bin/njs
/usr/lib64/nginx/modules/ngx_http_js_module-debug.so
/usr/lib64/nginx/modules/ngx_http_js_module.so
/usr/lib64/nginx/modules/ngx_stream_js_module-debug.so
/usr/lib64/nginx/modules/ngx_stream_js_module.so
/usr/share/doc/nginx-module-njs
/usr/share/doc/nginx-module-njs/CHANGES
/usr/share/doc/nginx-module-njs/COPYRIGHTFile yang terinstal adalah modul HTTP, modul stream yang menangani TCP·UDP, versi debug masing-masing, dan alat baris perintah njs. Dalam pengaturan ini, file yang dimuat hanya satu, yaitu modul HTTP [ngx_http_js_module.so].
4️⃣ Pengaturan js_set: dari memuat modul sampai jalur file cache
Menginstal paket tidak membuat nginx memuat modul secara otomatis; nginx.conf memerlukan baris [load_module] di bagian paling atas. Menurut dokumentasi resmi, [load_module] adalah direktif konteks main sehingga ditempatkan di luar blok events·http.
# Bagian paling atas /etc/nginx/nginx.conf (di luar blok events·http)
load_module modules/ngx_http_js_module.so;Fungsi konversi disimpan di file .js terpisah dari file konfigurasi, dan konfigurasi nginx memuat fungsi yang diekspor dengan export default di baris terakhir.
// /etc/nginx/njs/rocket.js — hanya percent-encoding %XX yang diubah ke huruf kecil
function lc(r) {
return r.variables.request_uri.replace(/%[0-9A-F]{2}/g, function (m) { return m.toLowerCase(); });
}
export default { lc };Fungsi membaca variabel [request_uri] dari objek permintaan r, mengubah ke huruf kecil hanya dua karakter setelah tanda persen yang berhuruf besar, lalu mengembalikannya. Huruf Latin dibiarkan apa adanya sehingga URL berbahasa Inggris yang bercampur huruf besar tidak berubah, dan aturannya sama dengan cara WP Rocket menamai folder cache.
# Di dalam blok http (file .conf di conf.d)
js_import rkt from /etc/nginx/njs/rocket.js;
js_set $rocket_uri rkt.lc;rkt di [js_import] adalah nama untuk memanggil fungsi di dalam modul, dan [js_set] mengubah hasil fungsi itu menjadi variabel [$rocket_uri]. Menurut dokumentasi resmi, fungsi ini dijalankan saat variabel pertama kali dirujuk dalam permintaan dan hanya mendukung pemrosesan sinkron.
# Blok server — $request_uri di jalur file cache diganti $rocket_uri
set $rocket_file '/wp-content/cache/wp-rocket/example.com${rocket_uri}index$rocket_mobile-https.html';Yang berubah hanya satu baris yang membuat jalur file cache ini; penentuan yang mengecualikan cookie login, kueri, dan permintaan POST dari cache tetap seperti semula.
5️⃣ Penerapan dan pemeriksaan: log galat dan header respons setelah reload
Jalankan uji konfigurasi terlebih dahulu, lalu reload jika lolos.
nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulsystemctl reload nginxBaris [load_module] yang baru ditambahkan berlaku dengan reload tanpa restart. Log galat mencatat baris inisialisasi mesin virtual njs, dan tidak ada galat JavaScript.
grep 'js vm init' /var/log/nginx/error.log | head -12026/10/17 18:21:35 [notice] 27992#27992: js vm init njs: 0000559FDF6D0E00njs di akhir baris adalah nama mesin yang sedang dipakai. Baris yang sama juga dicatat saat konfigurasi diuji dengan [nginx -t], jadi cocokkan dengan waktu reload.
curl -sI 'https://example.com/-/' | grep -i 'x-rocket\|content-type'content-type: text/html
x-rocket-nginx-serving-file: HITBahkan pada URL berhuruf Korea yang dikodekan dengan huruf besar, header penanda bahwa nginx menyajikan file cache tetap muncul. Permintaan dengan kueri atau cookie login, serta permintaan POST, tetap diteruskan ke PHP tanpa header penanda itu setelah penerapan.
6️⃣ Mengembalikan njs dan memperbarui nginx
Untuk mengembalikan, ganti [$rocket_uri] di jalur file cache menjadi [$request_uri], hapus file konfigurasi [js_import]·[js_set] dan baris [load_module], lalu jalankan uji konfigurasi dan reload.
# Blok server — kembali ke variabel semula
set $rocket_file '/wp-content/cache/wp-rocket/example.com${request_uri}index$rocket_mobile-https.html';Paket boleh dibiarkan: tanpa baris [load_module], nginx tidak memuatnya, jadi hapus paket hanya jika ingin dihapus sepenuhnya.
dnf remove nginx-module-njsSaat memperbarui nginx, paket njs juga harus naik ke versi yang berpasangan dengan nginx baru. Sebelum pembaruan, periksa dengan [dnf list --showduplicates] apakah pasangan njs untuk versi nginx baru ada di repositori.
🔢 FAQ & Konten yang Direkomendasikan














ℹ️ Pemberitahuan Afiliasi
Konten di situs ini berisi tautan afiliasi. Jika pengunjung membeli produk atau layanan melalui tautan tersebut, situs ini menerima komisi dari penjual. Harga yang dibayar pembeli(turun saat ada diskon promo ↓), tidak naik karena hal ini. Harga, diskon, dan informasi stok yang ditampilkan berlaku pada saat penulisan dan bisa berbeda dengan kondisi sebenarnya, jadi pastikan kembali di situs penjual sebelum membeli. Pemilihan dan penilaian produk dibuat berdasarkan standar kami sendiri, dan ada tidaknya komisi tidak memengaruhi urutan maupun isi penilaian.

