nginx njs: module installeren, js_set instellen en met reload toepassen om JavaScript-variabelen te maken

Affiliatemelding v3.1
Affiliatemelding v3.2 (mobiel)
Testomgeving RHEL-familieAlmaLinux 9.8Nginx 1.28 + Apache 2.4njs 0.9.4WP Rocket 3.23.5.1Gecontroleerd op 17-10-2026

nginx njs is een officiële nginx-module die in de nginx-configuratie verzoeken afhandelt of variabelewaarden maakt met JavaScript-functies. Op een server met Nginx + Apache werd, om hoofdletters en kleine letters in verzoek-URL's gelijk te trekken, wat met nginx-configuratie alleen niet kan, de njs-module geïnstalleerd in dezelfde versie als de geïnstalleerde nginx, en werd een variabele die met js_set is gemaakt in het pad van het cachebestand gezet en met een reload toegepast, zonder herstart.

De voorbeeldfunctie is een eenregelige functie die de percent-encoding van Koreaanse URL's naar kleine letters omzet, en variabelen maken door headers of argumentwaarden uit het request-object te lezen werkt op dezelfde manier.

1️⃣ Wat is nginx njs: een module die nginx uitbreidt met JavaScript

njs is geen zelfstandige JavaScript-runtime zoals Node.js: het heeft geen eigen opstartscript of event loop, en code draait alleen wanneer nginx een functie aanroept die in de configuratie is genoemd, waarna de verwerking terugkeert naar nginx.

De punten waarop nginx JavaScript-functies aanroept liggen vast: de verwerkingsfasen van HTTP-verzoeken en -antwoorden, de verwerkingsfasen van TCP/UDP-sessies, het berekenen van variabelewaarden en periodieke timers. Een functie leest de URL, headers en argumenten uit het request-object dat nginx doorgeeft, en geeft het resultaat terug als antwoord of als variabelewaarde.

Aan de HTTP-kant laadt [js_import] een scriptbestand, maakt [js_set] een variabelewaarde, maakt [js_content] de body van het antwoord, en passen [js_header_filter] en [js_body_filter] de headers en body van het antwoord aan. Deze opzet gebruikte twee directives: [js_import] en [js_set].

🧭 Waar nginx njs-functies aanroept
Uitlegdiagram
📌 Aanroeppunt
📥 Verzoek
🖥️ nginx
Verwerkingsfase · punt uit de configuratie
js_setBerekening van variabelewaarde
js_contentBody van het antwoord
js_header_filter · js_body_filterHeaders · body van het antwoord aanpassen
Aanroep→
📜 njs-functie
Request-object van nginx
URL · headers · argumenten lezen
↩️ Teruggegeven als variabelewaarde
↩️ Teruggegeven als antwoord
↩️ Teruggegeven als aangepaste headers · body
❌ Draait niet zelfstandig zoals Node.jsGeen opstartscript · geen eigen event loop
Teruggave→
🖥️ nginx
Verwerking gaat verder
VariabelewaardeHier gebruikt · in het pad van het cachebestand
Body van het antwoordAntwoordt met de body die de functie maakte
Headers · body van het antwoordAntwoordt met de aangepaste headers en body
📤 Antwoord
[js_set] roept de functie aan op het punt waar nginx een variabelewaarde berekent; de waarde die de functie teruggeeft, wordt de variabelewaarde, en de verwerking keert terug naar nginx.
[js_content] roept de functie aan op het punt waar de body van het antwoord wordt gemaakt, en nginx verstuurt het antwoord dat de functie uit het request-object heeft opgebouwd.
[js_header_filter] en [js_body_filter] roepen de functie aan terwijl het antwoord wordt verstuurd om de headers en body aan te passen, en daarna keert de verwerking terug naar nginx.

De standaardengine van de njs-module implementeert ECMAScript 5.1 (strict mode) plus een deel van de functies uit ECMAScript 6 en later. Stringbewerking op het niveau van regex-vervanging en functies werkt binnen dat bereik.

2️⃣ Wanneer je njs nodig hebt: variabelewaarden die nginx-configuratie alleen niet kan wijzigen

De WordPress-plugin WP Rocket geeft de cachemappen van berichten met Koreaanse URL's namen in percent-encoding met kleine letters, terwijl browsers dezelfde URL met hoofdletters gecodeerd opvragen. Op deze server draait een WordPress-site.

Als nginx het pad van het cachebestand ongewijzigd uit de verzoek-URL opbouwt, kloppen hoofdletters en kleine letters niet, wordt het bestand niet gevonden en gaat het verzoek door naar Apache en PHP.

Met nginx-configuratie alleen kun je deze waarde niet naar kleine letters omzetten. [map] kiest alleen een van de waarden die je instelt en kan geen strings omzetten, en vóór de installatie stond er in de uitvoer van [nginx -V] en in de modulemap ook geen perl- of lua-module.

Moeten maar een paar URL's veranderen, dan kan een [map]-tabel het afhandelen, maar dan moet je de tabel opnieuw maken en reloaden telkens als er een nieuw bericht verschijnt. Moet elke URL een eigen waarde krijgen volgens dezelfde regel, dan dekt één [js_set]-functie ook nieuwe berichten, tags en categorie-URL's.

[perl_set] van de perl-module kan op dezelfde plek worden gebruikt, en de repository heeft een pakket dat bij nginx past, maar de officiële nginx-documentatie beschrijft de perl-module als experimenteel.

3️⃣ nginx njs installeren: in dezelfde versie als de geïnstalleerde nginx

Installeren met alleen de pakketnaam lijkt alleen njs toe te voegen, maar de nieuwste njs in de repository vereist de nieuwste nginx, dus nginx wordt ook geüpgraded. Bij de controle vóór de installatie liet het installatiecommando zonder versie een plan zien om nginx van 1.28.0 naar 1.30.6 te brengen.

Begin dus met het controleren van de nginx-versie die nu geïnstalleerd is.

rpm -q nginx
nginx-1.28.0-1.el9.ngx.x86_64

De repository heeft voor elke nginx-versie een apart bijpassend njs-pakket; in het versienummer is het deel vóór + de nginx-versie en het deel erna de njs-versie.

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-stable

Bij nginx 1.28.0 horen zes versies, 0.8.10 tot en met 0.9.4, en de bovenste regel met @nginx-stable is de versie die al geïnstalleerd is. Installeer de nieuwste daarvan, 0.9.4, met het volledige versienummer erbij.

dnf install nginx-module-njs-1:1.28.0+0.9.4-1.el9.ngx

Met rpm kun je controleren welke nginx-versie het geïnstalleerde pakket vereist.

rpm -q --requires nginx-module-njs | grep nginx
nginx-r1.28.0
rpm -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/COPYRIGHT

De geïnstalleerde bestanden zijn de HTTP-module, de stream-module voor TCP/UDP, van elk een debugbuild en de commandoregeltool njs. Deze opzet laadt maar één bestand: de HTTP-module [ngx_http_js_module.so].

4️⃣ js_set instellen: van de module laden tot het pad van het cachebestand

Het pakket installeren laat nginx de module niet automatisch laden: bovenaan nginx.conf moet een regel [load_module] staan. Volgens de officiële documentatie is [load_module] een directive voor de main-context, dus die staat buiten de blokken events en http.

📂 /etc/nginx/Configuratiemap
nginx.confload_module bovenaan — laadt de module
njs/rocket.jsFunctie lc — alleen de percent-encoding naar kleine letters
conf.d/
rocket-njs.confhttp-blok — js_import · js_set
example.com.confserver-blok — $rocket_uri in het pad van het cachebestand
# bovenaan /etc/nginx/nginx.conf (buiten de blokken events en http)
load_module modules/ngx_http_js_module.so;

De omzetfunctie staat in een apart .js-bestand, los van de configuratiebestanden, en de nginx-configuratie importeert de functie die op de laatste regel met export default wordt geëxporteerd.

// /etc/nginx/njs/rocket.js — alleen de percent-encoding %XX naar kleine letters
function lc(r) {
    return r.variables.request_uri.replace(/%[0-9A-F]{2}/g, function (m) { return m.toLowerCase(); });
}
export default { lc };

De functie leest de variabele [request_uri] uit het request-object r, zet alleen de twee tekens na elk procentteken naar kleine letters waar die hoofdletters zijn, en geeft het resultaat terug. Latijnse letters blijven zoals ze zijn, dus Engelse URL's met hoofdletters veranderen niet; dit is dezelfde regel die WP Rocket gebruikt om cachemappen te benoemen.

# binnen het http-blok (een .conf-bestand in conf.d)
js_import rkt from /etc/nginx/njs/rocket.js;
js_set $rocket_uri rkt.lc;

In [js_import] is rkt de naam waarmee functies in de module worden aangeroepen, en [js_set] maakt van het resultaat van die functie de variabele [$rocket_uri]. Volgens de officiële documentatie draait de functie wanneer de variabele voor het eerst in een verzoek wordt gebruikt, en ondersteunt ze alleen synchrone verwerking.

# server-blok — $request_uri in het pad van het cachebestand wordt $rocket_uri
set $rocket_file '/wp-content/cache/wp-rocket/example.com${rocket_uri}index$rocket_mobile-https.html';

Het enige wat verandert is deze ene regel die het pad van het cachebestand opbouwt; de controles die logincookies, query's en POST-verzoeken uitsluiten van de cache blijven zoals ze zijn.

5️⃣ Toepassen en controleren: foutlog en responsheaders na een reload

Voer eerst de configuratietest uit en reload als die slaagt.

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
systemctl reload nginx

De nieuwe regel [load_module] werd met een reload actief, zonder herstart. In het foutlog stond een regel over het initialiseren van de njs-virtuele machine, en er waren geen JavaScript-fouten.

grep 'js vm init' /var/log/nginx/error.log | head -1
2026/10/17 18:21:35 [notice] 27992#27992: js vm init njs: 0000559FDF6D0E00

De njs aan het eind van de regel is de naam van de gebruikte engine. Dezelfde regel wordt ook gelogd als je de configuratie test met [nginx -t], dus vergelijk hem met het tijdstip van de reload.

curl -sI 'https://example.com/-/' | grep -i 'x-rocket\|content-type'
content-type: text/html
x-rocket-nginx-serving-file: HIT

Ook bij een Koreaanse URL die met hoofdletters is gecodeerd, stond de header die laat zien dat nginx het cachebestand serveerde. Verzoeken met query's of logincookies en POST-verzoeken gingen na de wijziging nog steeds zonder die header naar PHP.

6️⃣ njs terugdraaien en nginx bijwerken

Om terug te draaien zet je [$rocket_uri] in het pad van het cachebestand terug naar [$request_uri], verwijder je het configuratiebestand met [js_import]/[js_set] en de regel [load_module], en voer je de configuratietest uit en reload je.

# server-blok — terug naar de oorspronkelijke variabele
set $rocket_file '/wp-content/cache/wp-rocket/example.com${request_uri}index$rocket_mobile-https.html';

Je kunt het pakket laten staan: zonder de regel [load_module] laadt nginx het niet, dus verwijder het pakket alleen als je het helemaal kwijt wilt.

dnf remove nginx-module-njs

Als je nginx bijwerkt, moet het njs-pakket mee omhoog naar de versie die bij de nieuwe nginx past. Controleer vóór het bijwerken met [dnf list --showduplicates] of de repository de njs-tegenhanger voor de nieuwe nginx-versie heeft.

🔢 FAQ & aanbevolen content

De officiële nginx-documentatie markeert de standaard njs-engine vanaf versie 1.0.0 als verouderd (deprecated) en raadt voor nieuwe opstellingen de QuickJS-engine aan, die ES2023 ondersteunt. Je kiest de engine met de directive [js_engine qjs], beschikbaar sinds versie 0.8.6. De installatie van 0.9.4 in dit artikel draaide op de standaard njs-engine; overstappen op QuickJS is niet getest.

Het is een zelfstandige commandoregeltool om njs-code te ontwikkelen en te debuggen zonder nginx (volgens de officiële documentatie). Hij komt mee met het pakket nginx-module-njs, en de versie controleren met [njs -v] geeft 0.9.4, hetzelfde als de module.

Als je alleen HTTP-verzoeken afhandelt, is [ngx_http_js_module] genoeg. Het pakket bevat ook [ngx_stream_js_module] voor TCP/UDP-sessies, en de officiële installatiedocumentatie zegt dat je met [load_module] laadt welke van de twee je nodig hebt.

🧭 Gerelateerde berichten over WP Rocket 16 artikelen · 3 tools
📋 WP Rocket instellen 📄 WP Rocket MCP Server 📄 WP Rocket en Koreaanse URL's 📄 nginx njs 📄 Meertalige cache van WP Rocket 📄 gclid-cache
📄 WP Rocket snelheidstest 📝 Cache- en optimalisatieplugins 📝 Voorbeeld van snelheidswinst
📋 Cache: definitie en alle toepassingen 📄 Websitecache & servercache
📋 Beste hosting TOP 7 📄 Snelle hosting 2026
🛠️ WordPress-detectie 🛠️ Whois domein opzoeken 🛠️ Mijn IP-adres bekijken
Wat is WP Rocket: vijf beweringen uit een artikel dat FlyingPress aanraadt, getoetst aan officiële schermen en servermetingen
WordPress · WP Rocket
Wat is WP Rocket: belangrijkste functies, nadelen en voordelen van een alles-in-één cacheplugin
Een overzicht van hoe WP Rocket pagina's uit cachebestanden serveert en wat het kost.
Bericht lezen →Dit artikel
WP Rocket instellen: basisinstellingen per menu en 20% kortingscode
WordPress · WP Rocket
WP Rocket instellen: basisinstellingen per menu en 20% kortingscode
Een overzicht van de basisinstellingen per menu en de prijzen van WP Rocket.
Bericht lezen →Dit artikel
WP Rocket MCP Server: cache en instellingen beheren met AI-tools
WordPress · MCP
WP Rocket MCP Server: cache en instellingen beheren met AI-tools
Zo beheer je de cache en instellingen van WP Rocket vanuit AI-tools.
Bericht lezen →Dit artikel
Diagram van de verzoekstroom van Koreaanse URL's met WP Rocket
WordPress · WP Rocket
WP Rocket en Koreaanse URL's
Waarom nginx het cachebestand niet vindt door hoofdletters en kleine letters in de codering van Koreaanse URL-verzoeken, en hoe je dat met njs oplost.
Bericht lezen →Dit artikel
Diagram van nginx njs-variabelen en paden van cachebestanden
Server · nginx
nginx njs: module installeren, js_set instellen en met reload toepassen om JavaScript-variabelen te maken
Hoe je de njs-module installeert, die in de nginx-configuratie variabelen maakt met JavaScript-functies, en js_set-variabelen met een reload toepast.
Bericht lezen →Dit artikel
Diagram van de opslagstroom van berichten met de meertalige cache van WP Rocket
WordPress · WP Rocket
Meertalige cache van WP Rocket
Waarom het opslaan van een concept de cache van vertaalde pagina's samen met de hele taalmap verwijdert, en de code die dat voorkomt.
Bericht lezen →Dit artikel
Stroom waarbij een verzoek met advertentiequery zonder CDN-kopie naar de oorspronkelijke server gaat, van nginx naar Apache doorloopt en WP Rocket de query weglaat en met hetzelfde cachebestand antwoordt
Server · Cache
gclid-cache: querystring van advertentieklikken, cachesleutel van de pagina en gemeten eerste byte
Meet aan de hand van de eerste byte hoe de gclid-query aan het eind van advertentie-URL's wordt genegeerd en het antwoord uit het cachebestand van de URL zonder query komt.
Bericht lezen →Dit artikel

ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Laat zien dat je geen machine bent: 5   +   10   =