nginx njs: instalacja modułu, ustawienie js_set i zastosowanie przez reload, aby tworzyć zmienne JavaScript

Informacja o linkach partnerskich v3.1
Informacja o linkach partnerskich v3.2 (wersja mobilna)
Środowisko testowe Rodzina RHELAlmaLinux 9.8Nginx 1.28 + Apache 2.4njs 0.9.4WP Rocket 3.23.5.1Sprawdzono 17.10.2026

nginx njs to oficjalny moduł nginx, który w konfiguracji nginx obsługuje żądania lub tworzy wartości zmiennych funkcjami JavaScript. Na serwerze z Nginx + Apache, aby ujednolicić wielkość liter w adresach żądań, czego sama konfiguracja nginx nie zmieni, zainstalowano moduł njs w tej samej wersji co zainstalowany nginx, a zmienną utworzoną przez js_set wstawiono do ścieżki pliku cache i zastosowano przez reload, bez restartu.

Przykładowa funkcja to jedna linijka, która zamienia na małe litery kodowanie procentowe koreańskich adresów, a tworzenie zmiennych przez odczyt nagłówków lub wartości argumentów z obiektu żądania działa tak samo.

1️⃣ Czym jest nginx njs: moduł rozszerzający nginx o JavaScript

njs nie jest samodzielnym środowiskiem uruchomieniowym JavaScript jak Node.js: nie ma skryptu startowego ani własnej pętli zdarzeń, a kod działa tylko wtedy, gdy nginx wywoła funkcję wskazaną w konfiguracji, po czym przetwarzanie wraca do nginx.

Miejsca, w których nginx wywołuje funkcje JavaScript, są ustalone: fazy przetwarzania żądań i odpowiedzi HTTP, fazy przetwarzania sesji TCP/UDP, obliczanie wartości zmiennych i okresowe timery. Funkcja czyta adres, nagłówki i argumenty z obiektu żądania przekazanego przez nginx i zwraca wynik jako odpowiedź lub wartość zmiennej.

Po stronie HTTP [js_import] wczytuje plik skryptu, [js_set] tworzy wartość zmiennej, [js_content] tworzy treść odpowiedzi, a [js_header_filter] i [js_body_filter] przerabiają nagłówki i treść odpowiedzi. W tej konfiguracji użyto dwóch dyrektyw: [js_import] i [js_set].

🧭 Gdzie nginx wywołuje funkcje njs
Diagram objaśniający
📌 Miejsce wywołania
📥 Żądanie
🖥️ nginx
Faza przetwarzania · miejsce wskazane w konfiguracji
js_setObliczanie wartości zmiennej
js_contentTreść odpowiedzi
js_header_filter · js_body_filterPrzerabianie nagłówków · treści odpowiedzi
Wywołanie→
📜 Funkcja njs
Obiekt żądania przekazany przez nginx
Odczyt adresu · nagłówków · argumentów
↩️ Zwracane jako wartość zmiennej
↩️ Zwracane jako odpowiedź
↩️ Zwracane jako przerobione nagłówki · treść
❌ Nie działa samodzielnie jak Node.jsBrak skryptu startowego · brak własnej pętli zdarzeń
Zwrot→
🖥️ nginx
Dalsze przetwarzanie
Wartość zmiennejUżyte tutaj · wstawione do ścieżki pliku cache
Treść odpowiedziOdpowiada treścią zbudowaną przez funkcję
Nagłówki · treść odpowiedziOdpowiada przerobionymi nagłówkami i treścią
📤 Odpowiedź
[js_set] wywołuje funkcję w miejscu, gdzie nginx oblicza wartość zmiennej; wartość zwrócona przez funkcję staje się wartością zmiennej, a przetwarzanie wraca do nginx.
[js_content] wywołuje funkcję w miejscu, gdzie powstaje treść odpowiedzi, a nginx wysyła odpowiedź zbudowaną przez funkcję z obiektu żądania.
[js_header_filter] i [js_body_filter] wywołują funkcję podczas wysyłania odpowiedzi, by przerobić jej nagłówki i treść, a po zakończeniu przetwarzanie wraca do nginx.

Domyślny silnik modułu njs implementuje ECMAScript 5.1 (strict mode) oraz część funkcji ECMAScript 6 i nowszych. Obróbka tekstu na poziomie zamiany wyrażeniem regularnym i funkcji działa w tym zakresie.

2️⃣ Kiedy potrzebujesz njs: wartości zmiennych, których sama konfiguracja nginx nie zmieni

Wtyczka WordPress WP Rocket nazywa foldery cache wpisów z koreańskimi adresami kodowaniem procentowym małymi literami, a przeglądarki żądają tego samego adresu zakodowanego wielkimi literami. Na tym serwerze działa strona WordPress.

Jeśli nginx buduje ścieżkę pliku cache z adresu żądania bez zmian, wielkość liter się nie zgadza, plik nie zostaje znaleziony, a żądanie przechodzi do Apache i PHP.

Sama konfiguracja nginx nie zamieni tej wartości na małe litery. [map] tylko wybiera jedną z ustawionych wartości i nie przekształca tekstu, a przed instalacją ani wyjście [nginx -V], ani folder modułów nie pokazywały modułu perl czy lua.

Jeśli zmienić trzeba tylko kilka adresów, wystarczy tabela [map], ale przy każdym nowym wpisie trzeba ją odtworzyć i zrobić reload. Gdy każdy adres ma mieć własną wartość zamienioną według tej samej zasady, jedna funkcja [js_set] obejmuje też nowe wpisy, tagi i adresy kategorii.

W tym samym miejscu można użyć [perl_set] z modułu perl, a repozytorium ma pakiet dopasowany do nginx, ale oficjalna dokumentacja nginx opisuje moduł perl jako eksperymentalny.

3️⃣ Instalacja nginx njs: w tej samej wersji co zainstalowany nginx

Instalacja samą nazwą pakietu wygląda tak, jakby dodawała tylko njs, ale najnowszy njs w repozytorium wymaga najnowszego nginx, więc nginx też zostaje zaktualizowany. Przy sprawdzeniu przed instalacją polecenie bez wersji pokazało plan podniesienia nginx z 1.28.0 do 1.30.6.

Dlatego zacznij od sprawdzenia, jaka wersja nginx jest teraz zainstalowana.

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

Repozytorium ma osobny pakiet njs dopasowany do każdej wersji nginx; w numerze wersji część przed + to wersja nginx, a po nim wersja 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-stable

Do nginx 1.28.0 pasuje sześć wersji, od 0.8.10 do 0.9.4, a górny wiersz @nginx-stable to wersja już zainstalowana. Zainstaluj najnowszą z nich, 0.9.4, podając pełny numer wersji.

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

Za pomocą rpm sprawdzisz, jakiej wersji nginx wymaga zainstalowany pakiet.

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

Zainstalowane pliki to moduł HTTP, moduł stream obsługujący TCP/UDP, wersja debugowa każdego z nich i narzędzie wiersza poleceń njs. Ta konfiguracja wczytuje tylko jeden plik, moduł HTTP [ngx_http_js_module.so].

4️⃣ Ustawienie js_set: od wczytania modułu do ścieżki pliku cache

Instalacja pakietu nie sprawia, że nginx sam wczyta moduł: na samej górze nginx.conf musi być wiersz [load_module]. Według oficjalnej dokumentacji [load_module] to dyrektywa kontekstu main, więc stoi poza blokami events i http.

📂 /etc/nginx/Folder konfiguracji
nginx.confload_module na górze — wczytuje moduł
njs/rocket.jsFunkcja lc — tylko kodowanie procentowe na małe litery
conf.d/
rocket-njs.confblok http — js_import · js_set
example.com.confblok server — $rocket_uri w ścieżce pliku cache
# góra /etc/nginx/nginx.conf (poza blokami events i http)
load_module modules/ngx_http_js_module.so;

Funkcja zamiany leży w osobnym pliku .js, oddzielnie od plików konfiguracji, a konfiguracja nginx importuje funkcję wyeksportowaną przez export default w ostatnim wierszu.

// /etc/nginx/njs/rocket.js — tylko kodowanie procentowe %XX na małe litery
function lc(r) {
    return r.variables.request_uri.replace(/%[0-9A-F]{2}/g, function (m) { return m.toLowerCase(); });
}
export default { lc };

Funkcja czyta zmienną [request_uri] z obiektu żądania r, zamienia na małe litery tylko dwa znaki po każdym znaku procentu tam, gdzie są wielkie, i zwraca wynik. Litery łacińskie zostają bez zmian, więc angielskie adresy z wielkimi literami się nie zmieniają; to ta sama zasada, według której WP Rocket nazywa foldery cache.

# wewnątrz bloku http (plik .conf w conf.d)
js_import rkt from /etc/nginx/njs/rocket.js;
js_set $rocket_uri rkt.lc;

W [js_import] rkt to nazwa, którą wywołuje się funkcje z modułu, a [js_set] zamienia wynik tej funkcji w zmienną [$rocket_uri]. Według oficjalnej dokumentacji funkcja uruchamia się przy pierwszym odwołaniu do zmiennej w żądaniu i obsługuje tylko przetwarzanie synchroniczne.

# blok server — $request_uri w ścieżce pliku cache zmienia się na $rocket_uri
set $rocket_file '/wp-content/cache/wp-rocket/example.com${rocket_uri}index$rocket_mobile-https.html';

Zmienia się tylko ten jeden wiersz budujący ścieżkę pliku cache; sprawdzenia, które wykluczają z cache ciasteczka logowania, zapytania i żądania POST, zostają bez zmian.

5️⃣ Zastosowanie i sprawdzenie: log błędów i nagłówki odpowiedzi po reloadzie

Najpierw uruchom test konfiguracji, a jeśli przejdzie, zrób reload.

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

Nowy wiersz [load_module] zadziałał po reloadzie, bez restartu. Log błędów zapisał wiersz o inicjalizacji maszyny wirtualnej njs i nie było błędów JavaScript.

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

njs na końcu wiersza to nazwa używanego silnika. Ten sam wiersz zapisuje się też przy teście konfiguracji przez [nginx -t], więc porównaj go z godziną reloadu.

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

Nawet przy koreańskim adresie zakodowanym wielkimi literami pojawił się nagłówek pokazujący, że nginx podał plik cache. Żądania z zapytaniami lub ciasteczkami logowania oraz żądania POST po zmianie nadal szły do PHP bez tego nagłówka.

6️⃣ Wycofanie njs i aktualizacja nginx

Aby wycofać zmianę, zamień [$rocket_uri] w ścieżce pliku cache z powrotem na [$request_uri], usuń plik konfiguracji z [js_import]/[js_set] i wiersz [load_module], a potem uruchom test konfiguracji i zrób reload.

# blok server — powrót do pierwotnej zmiennej
set $rocket_file '/wp-content/cache/wp-rocket/example.com${request_uri}index$rocket_mobile-https.html';

Pakiet możesz zostawić: bez wiersza [load_module] nginx go nie wczyta, więc usuwaj pakiet tylko wtedy, gdy chcesz pozbyć się go całkowicie.

dnf remove nginx-module-njs

Przy aktualizacji nginx pakiet njs musi razem z nim przejść na wersję dopasowaną do nowego nginx. Przed aktualizacją sprawdź przez [dnf list --showduplicates], czy repozytorium ma odpowiednik njs dla nowej wersji nginx.

🔢 FAQ & polecane treści

Oficjalna dokumentacja nginx oznacza domyślny silnik njs od wersji 1.0.0 jako przestarzały (deprecated) i do nowych konfiguracji zaleca silnik QuickJS, który obsługuje ES2023. Silnik wybiera się dyrektywą [js_engine qjs], dostępną od wersji 0.8.6. Instalacja 0.9.4 z tego artykułu działała na domyślnym silniku njs, a przejścia na QuickJS nie testowano.

To samodzielne narzędzie wiersza poleceń do pisania i debugowania kodu njs bez nginx (według oficjalnej dokumentacji). Instaluje się razem z pakietem nginx-module-njs, a sprawdzenie wersji przez [njs -v] pokazuje 0.9.4, tę samą co moduł.

Jeśli obsługujesz tylko żądania HTTP, wystarczy [ngx_http_js_module]. Pakiet zawiera też [ngx_stream_js_module] dla sesji TCP/UDP, a oficjalna dokumentacja instalacji każe wczytać przez [load_module] ten z dwóch, którego potrzebujesz.

🧭 Powiązane wpisy: WP Rocket 16 artykułów · 3 narzędzia
📋 Konfiguracja WP Rocket 📄 WP Rocket MCP Server 📄 WP Rocket i koreańskie adresy URL 📄 nginx njs 📄 Wielojęzyczny cache WP Rocket 📄 Cache a gclid
📄 Test szybkości WP Rocket 📝 Wtyczki cache i optymalizacji 📝 Przykład przyspieszenia
📋 Cache: definicja i zastosowania 📄 Cache witryny & wewnętrzny cache serwera
📋 Najlepszy hosting TOP 7 📄 Szybki hosting 2026
🛠️ Wykrywanie WordPressa 🛠️ Wyszukiwarka WHOIS 🛠️ Sprawdź moje IP
Czym jest WP Rocket: pięć twierdzeń z wpisu polecającego FlyingPress porównanych z oficjalnymi ekranami i pomiarami na serwerze
WordPress · WP Rocket
Czym jest WP Rocket: najważniejsze funkcje, wady i zalety kompleksowej wtyczki cache
Podsumowanie, jak WP Rocket serwuje strony z plików cache i ile kosztuje.
Czytaj wpis →Bieżąca treść
Konfiguracja WP Rocket: podstawowe ustawienia menu po menu i kod promocyjny 20%
WordPress · WP Rocket
Konfiguracja WP Rocket: podstawowe ustawienia menu po menu i kod promocyjny 20%
Wpis z podstawową konfiguracją każdego menu WP Rocket i cenami.
Czytaj wpis →Bieżąca treść
WP Rocket MCP Server: zarządzanie pamięcią podręczną i ustawieniami za pomocą narzędzi AI
WordPress · MCP
WP Rocket MCP Server: zarządzanie pamięcią podręczną i ustawieniami za pomocą narzędzi AI
Jak obsługiwać pamięć podręczną i ustawienia WP Rocket z poziomu narzędzi AI.
Czytaj wpis →Bieżąca treść
Schemat przepływu żądań z koreańskim adresem URL w WP Rocket
WordPress · WP Rocket
WP Rocket i koreańskie adresy URL
Dlaczego nginx nie znajduje pliku cache przez wielkość liter w kodowaniu żądań z koreańskimi adresami URL i jak to naprawić za pomocą njs.
Czytaj wpis →Bieżąca treść
Schemat zmiennych nginx njs i ścieżek plików cache
Server · nginx
nginx njs: instalacja modułu, ustawienie js_set i zastosowanie przez reload, aby tworzyć zmienne JavaScript
Jak zainstalować moduł njs, który tworzy zmienne funkcjami JavaScript w konfiguracji nginx, i zastosować zmienne js_set przez reload.
Czytaj wpis →Bieżąca treść
Schemat przepływu zapisu wpisu przy wielojęzycznym cache WP Rocket
WordPress · WP Rocket
Wielojęzyczny cache WP Rocket
Dlaczego zapis szkicu usuwa cache wersji językowych razem z całym folderem języka i kod, który temu zapobiega.
Czytaj wpis →Bieżąca treść
Przepływ: żądanie z zapytaniem reklamowym bez kopii w CDN trafia do serwera źródłowego, przechodzi z nginx do Apache, a WP Rocket usuwa zapytanie i odpowiada tym samym plikiem cache
Server · cache
Cache a gclid: zapytanie z kliknięcia reklamy, klucz cache strony i zmierzony pierwszy bajt
Pomiar pierwszego bajtu: jak zapytanie gclid dopisywane do adresów z kliknięć reklam jest pomijane, a odpowiedź idzie z pliku cache adresu bez zapytania.
Czytaj wpis →Bieżąca treść

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 3   +   9   =