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

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].
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 nginxnginx-1.28.0-1.el9.ngx.x86_64De 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-stableBij 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.ngxMet rpm kun je controleren welke nginx-versie het geïnstalleerde pakket vereist.
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/COPYRIGHTDe 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.
# 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 -tnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulsystemctl reload nginxDe 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 -12026/10/17 18:21:35 [notice] 27992#27992: js vm init njs: 0000559FDF6D0E00De 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: HITOok 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-njsAls 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














ℹ️ 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.

