nginx njs: cài mô-đun, thiết lập js_set và áp dụng reload để tạo biến JavaScript

Thông báo tiếp thị liên kết Ver 3.1
Thông báo tiếp thị liên kết Ver 3.2 (chỉ trên di động)
Môi trường thử nghiệm Họ RHELAlmaLinux 9.8Nginx 1.28 + Apache 2.4njs 0.9.4WP Rocket 3.23.5.1Kiểm tra ngày 2026-10-17

nginx njs là mô-đun chính thức của nginx dùng hàm JavaScript ngay trong cấu hình nginx để xử lý yêu cầu hoặc tạo giá trị biến. Trên máy chủ Nginx + Apache, để khớp chữ hoa chữ thường của URL yêu cầu, điều mà riêng cấu hình nginx không thay đổi được, mô-đun njs đã được cài cùng phiên bản với nginx đang cài, rồi biến tạo bằng js_set được đưa vào đường dẫn tệp cache và áp dụng bằng reload mà không cần khởi động lại.

Hàm ví dụ chỉ là một dòng đổi mã hóa phần trăm của URL tiếng Hàn sang chữ thường, và cách đọc giá trị header hay đối số từ đối tượng yêu cầu để tạo biến cũng tương tự.

1️⃣ nginx njs là gì: mô-đun mở rộng chức năng nginx bằng JavaScript

njs không phải môi trường chạy JavaScript độc lập như Node.js: nó không có script khởi động hay vòng lặp sự kiện riêng, và mã chỉ chạy khi nginx gọi hàm được chỉ định trong cấu hình, sau đó việc xử lý quay về nginx.

Các chỗ nginx gọi hàm JavaScript đã được định sẵn: giai đoạn xử lý yêu cầu và phản hồi HTTP, giai đoạn xử lý phiên TCP·UDP, tính giá trị biến và bộ hẹn giờ định kỳ. Hàm đọc URL, header và đối số từ đối tượng yêu cầu mà nginx truyền vào, rồi trả kết quả về dưới dạng phản hồi hoặc giá trị biến.

Ở phía HTTP, [js_import] nạp tệp script, [js_set] tạo giá trị biến, [js_content] tạo nội dung phản hồi, còn [js_header_filter] và [js_body_filter] chỉnh header và nội dung phản hồi. Lần áp dụng này dùng hai chỉ thị: [js_import] và [js_set].

🧭 Chỗ nginx gọi hàm njs
Sơ đồ giải thích
📌 Chỗ gọi
📥 Yêu cầu
🖥️ nginx
Giai đoạn xử lý · chỗ chỉ định trong cấu hình
js_setTính giá trị biến
js_contentNội dung phản hồi
js_header_filter · js_body_filterChỉnh header · nội dung phản hồi
Gọi→
📜 Hàm njs
Đối tượng yêu cầu do nginx truyền vào
Đọc URL · header · đối số
↩️ Trả về dưới dạng giá trị biến
↩️ Trả về dưới dạng phản hồi
↩️ Trả về dưới dạng header · nội dung đã chỉnh
❌ Không tự chạy một mình như Node.jsKhông có script khởi động · không có vòng lặp sự kiện riêng
Trả về→
🖥️ nginx
Tiếp tục xử lý
Giá trị biếnDùng ở đây · đưa vào đường dẫn tệp cache
Nội dung phản hồiPhản hồi bằng nội dung do hàm tạo
Header · nội dung phản hồiPhản hồi bằng header và nội dung đã chỉnh
📤 Phản hồi
[js_set] gọi hàm ở chỗ nginx tính giá trị biến; giá trị hàm trả về trở thành giá trị biến, và việc xử lý quay về nginx.
[js_content] gọi hàm ở chỗ tạo nội dung phản hồi, và nginx gửi phản hồi do hàm tạo từ đối tượng yêu cầu.
[js_header_filter] và [js_body_filter] gọi hàm ở giai đoạn gửi phản hồi để chỉnh header và nội dung, chỉnh xong thì việc xử lý quay về nginx.

Engine mặc định của mô-đun njs triển khai ECMAScript 5.1 (strict mode) cộng thêm một số tính năng từ ECMAScript 6 trở đi. Xử lý chuỗi ở mức thay thế bằng regex và hàm chạy được trong phạm vi này.

2️⃣ Khi nào cần njs: giá trị biến mà riêng cấu hình nginx không đổi được

Plugin WordPress WP Rocket đặt tên thư mục cache của bài viết có URL tiếng Hàn bằng mã hóa phần trăm chữ thường, còn trình duyệt gửi yêu cầu cùng URL đó mã hóa bằng chữ hoa. Một trang WordPress đang chạy trên máy chủ này.

Nếu nginx tạo đường dẫn tệp cache theo nguyên URL yêu cầu, chữ hoa chữ thường không khớp nên không tìm thấy tệp, và yêu cầu bị chuyển sang Apache và PHP.

Riêng cấu hình nginx không thể đổi giá trị này sang chữ thường. [map] chỉ chọn một trong các giá trị đã đặt chứ không chuyển đổi được chuỗi, và trước khi cài, cả kết quả [nginx -V] lẫn thư mục mô-đun đều không có mô-đun perl hay lua.

Nếu chỉ có vài URL cần đổi thì bảng đối chiếu [map] cũng xử lý được, nhưng phải dựng lại bảng và reload mỗi khi có bài mới. Khi mọi URL đều cần đổi giá trị theo cùng một quy tắc, chỉ một hàm [js_set] là xử lý được cả URL của bài mới, thẻ và chuyên mục.

[perl_set] của mô-đun perl cũng dùng được ở cùng chỗ, và kho có gói đi đôi với nginx, nhưng tài liệu chính thức của nginx coi mô-đun perl là mô-đun thử nghiệm.

3️⃣ Cài nginx njs: cùng phiên bản với nginx đang cài

Cài chỉ bằng tên gói mô-đun trông như chỉ thêm njs, nhưng njs mới nhất trong kho yêu cầu nginx mới nhất nên nginx cũng bị nâng cấp theo. Ở bước kiểm tra trước khi cài, lệnh cài không ghi phiên bản đã cho thấy kế hoạch nâng nginx từ 1.28.0 lên 1.30.6.

Vì vậy hãy kiểm tra phiên bản nginx đang cài trước.

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

Kho có gói njs riêng đi đôi với từng phiên bản nginx; trong số phiên bản, phần trước dấu + là phiên bản nginx và phần sau là phiên bản 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

Có sáu phiên bản đi đôi với nginx 1.28.0, từ 0.8.10 đến 0.9.4, và dòng @nginx-stable trên cùng là phiên bản đã cài xong. Việc cài được thực hiện với phiên bản mới nhất trong số đó là 0.9.4, ghi đầy đủ số phiên bản.

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

Có thể kiểm tra bằng rpm xem gói đã cài yêu cầu phiên bản nginx nào.

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

Các tệp được cài gồm mô-đun HTTP, mô-đun stream xử lý TCP·UDP, phiên bản debug của từng mô-đun và công cụ dòng lệnh njs. Thiết lập lần này chỉ nạp một tệp là mô-đun HTTP [ngx_http_js_module.so].

4️⃣ Thiết lập js_set: từ nạp mô-đun đến đường dẫn tệp cache

Cài gói xong nginx cũng không tự nạp mô-đun; nginx.conf cần có dòng [load_module] ở trên cùng. Theo tài liệu chính thức, [load_module] là chỉ thị ngữ cảnh main nên đặt bên ngoài khối events·http.

📂 /etc/nginx/Thư mục cấu hình
nginx.confload_module trên cùng — nạp mô-đun
njs/rocket.jsHàm lc — chỉ đổi mã hóa phần trăm sang chữ thường
conf.d/
rocket-njs.confKhối http — js_import · js_set
example.com.confKhối server — $rocket_uri trong đường dẫn tệp cache
# Trên cùng /etc/nginx/nginx.conf (ngoài khối events·http)
load_module modules/ngx_http_js_module.so;

Hàm chuyển đổi được đặt trong tệp .js riêng, tách khỏi tệp cấu hình, và cấu hình nginx nạp hàm được xuất bằng export default ở dòng cuối.

// /etc/nginx/njs/rocket.js — chỉ đổi mã hóa phần trăm %XX sang chữ thường
function lc(r) {
    return r.variables.request_uri.replace(/%[0-9A-F]{2}/g, function (m) { return m.toLowerCase(); });
}
export default { lc };

Hàm đọc biến [request_uri] từ đối tượng yêu cầu r, chỉ đổi sang chữ thường hai ký tự sau dấu phần trăm khi chúng là chữ hoa, rồi trả về. Chữ Latin được giữ nguyên nên URL tiếng Anh có lẫn chữ hoa không thay đổi, và quy tắc này giống cách WP Rocket đặt tên thư mục cache.

# Trong khối http (tệp .conf trong conf.d)
js_import rkt from /etc/nginx/njs/rocket.js;
js_set $rocket_uri rkt.lc;

rkt trong [js_import] là tên dùng để gọi hàm trong mô-đun, còn [js_set] biến kết quả của hàm đó thành biến [$rocket_uri]. Theo tài liệu chính thức, hàm này chạy khi biến được tham chiếu lần đầu trong yêu cầu và chỉ hỗ trợ xử lý đồng bộ.

# Khối server — đổi $request_uri trong đường dẫn tệp cache thành $rocket_uri
set $rocket_file '/wp-content/cache/wp-rocket/example.com${rocket_uri}index$rocket_mobile-https.html';

Chỗ thay đổi chỉ là một dòng tạo đường dẫn tệp cache này; các điều kiện loại cookie đăng nhập, truy vấn và yêu cầu POST khỏi cache vẫn giữ nguyên.

5️⃣ Áp dụng và kiểm tra: nhật ký lỗi và header phản hồi sau reload

Chạy kiểm tra cấu hình trước, nếu đạt thì 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

Dòng [load_module] mới thêm có hiệu lực bằng reload mà không cần khởi động lại. Nhật ký lỗi ghi một dòng khởi tạo máy ảo njs, và không có lỗi JavaScript nào.

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 ở cuối dòng là tên engine đang dùng. Dòng này cũng được ghi khi kiểm tra cấu hình bằng [nginx -t], nên hãy đối chiếu với thời điểm reload.

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

Ngay cả với URL tiếng Hàn được mã hóa bằng chữ hoa, header cho biết nginx đã trả tệp cache vẫn xuất hiện. Yêu cầu có truy vấn hoặc cookie đăng nhập và yêu cầu POST, sau khi áp dụng, vẫn được chuyển sang PHP mà không có header đó.

6️⃣ Hoàn tác njs và cập nhật nginx

Khi hoàn tác, đổi [$rocket_uri] trong đường dẫn tệp cache về [$request_uri], bỏ tệp cấu hình [js_import]·[js_set] và dòng [load_module], rồi kiểm tra cấu hình và reload.

# Khối server — về lại biến ban đầu
set $rocket_file '/wp-content/cache/wp-rocket/example.com${request_uri}index$rocket_mobile-https.html';

Có thể giữ lại gói: không có dòng [load_module] thì nginx không nạp nó, nên chỉ gỡ gói khi muốn xóa hẳn.

dnf remove nginx-module-njs

Khi cập nhật nginx, gói njs cũng phải được nâng lên phiên bản đi đôi với nginx mới. Trước khi cập nhật, hãy kiểm tra bằng [dnf list --showduplicates] xem kho đã có njs đi đôi với phiên bản nginx mới chưa.

🔢 FAQ & nội dung đề xuất

Tài liệu chính thức của nginx đặt engine njs mặc định ở trạng thái sắp ngừng hỗ trợ (deprecated) từ phiên bản 1.0.0 và khuyên dùng engine QuickJS hỗ trợ ES2023 cho cấu hình mới. Engine được chọn bằng chỉ thị [js_engine qjs], có từ phiên bản 0.8.6. Bản cài 0.9.4 trong bài này chạy với engine njs mặc định, và chưa thử chuyển sang QuickJS.

Đây là công cụ dòng lệnh độc lập để phát triển và gỡ lỗi mã njs mà không cần nginx (theo tài liệu chính thức). Công cụ được cài kèm trong gói nginx-module-njs, và khi kiểm tra phiên bản bằng [njs -v] sẽ hiện 0.9.4, giống mô-đun.

Nếu chỉ xử lý yêu cầu HTTP thì một mình [ngx_http_js_module] là đủ. Gói này còn có [ngx_stream_js_module] xử lý phiên TCP·UDP, và tài liệu cài đặt chính thức hướng dẫn nạp mô-đun cần dùng trong hai mô-đun này bằng [load_module].

🧭 Bài viết liên quan đến WP Rocket 16 bài viết · 3 công cụ
📋 Hướng dẫn cài đặt WP Rocket 📄 WP Rocket MCP Server 📄 WP Rocket với URL tiếng Hàn 📄 nginx njs 📄 Bộ nhớ đệm đa ngôn ngữ của WP Rocket 📄 Bộ nhớ đệm và gclid
📄 Kiểm tra tốc độ WP Rocket 📝 Plugin cache · tối ưu hóa 📝 Ví dụ cải thiện tốc độ
📋 Cache: định nghĩa và mọi lĩnh vực 📄 Cache website & cache phía server
📋 BEST hosting TOP 7 📄 Hosting nhanh 2026
🛠️ Phát hiện WordPress 🛠️ Tra cứu tên miền WHOIS 🛠️ Kiểm tra IP của tôi
WP Rocket là gì: năm luận điểm của bài viết đề xuất FlyingPress được đối chiếu với màn hình chính thức và số đo trên máy chủ
WordPress · WP Rocket
WP Rocket là gì: tính năng chính, nhược điểm và ưu điểm của plugin cache toàn diện
Tóm tắt cách WP Rocket phục vụ trang từ tệp cache và mức giá.
Xem bài viết →Nội dung hiện tại
Hướng dẫn cài đặt WP Rocket: thiết lập cơ bản theo từng menu và mã giảm giá 20%
WordPress · WP Rocket
Hướng dẫn cài đặt WP Rocket: thiết lập cơ bản theo từng menu và mã giảm giá 20%
Bài viết tổng hợp thiết lập cơ bản theo từng menu và giá của WP Rocket.
Xem bài viết →Nội dung hiện tại
WP Rocket MCP Server: xử lý cache và cài đặt bằng công cụ AI
WordPress · MCP
WP Rocket MCP Server: xử lý cache và cài đặt bằng công cụ AI
Cách xử lý cache và cài đặt của WP Rocket từ công cụ AI.
Xem bài viết →Nội dung hiện tại
Sơ đồ luồng yêu cầu URL tiếng Hàn với WP Rocket
WordPress · WP Rocket
WP Rocket với URL tiếng Hàn
Nguyên nhân nginx không tìm thấy tệp cache do chữ hoa, chữ thường trong mã hóa của yêu cầu URL tiếng Hàn và cách khắc phục bằng njs.
Xem bài viết →Nội dung hiện tại
Sơ đồ biến nginx njs và đường dẫn tệp cache
Server · nginx
nginx njs: cài mô-đun, thiết lập js_set và áp dụng reload để tạo biến JavaScript
Cách cài mô-đun njs, tạo biến bằng hàm JavaScript ngay trong cấu hình nginx, rồi áp dụng biến js_set bằng reload.
Xem bài viết →Nội dung hiện tại
Sơ đồ luồng lưu bài viết với bộ nhớ đệm đa ngôn ngữ của WP Rocket
WordPress · WP Rocket
Bộ nhớ đệm đa ngôn ngữ của WP Rocket
Nguyên nhân khi lưu bản nháp, bộ nhớ đệm của bản dịch bị xóa cùng cả thư mục ngôn ngữ, và đoạn mã ngăn điều đó.
Xem bài viết →Nội dung hiện tại
Luồng: yêu cầu có truy vấn quảng cáo đi tới máy chủ gốc khi CDN không có bản sao, chuyển từ nginx sang Apache, rồi WP Rocket bỏ truy vấn quảng cáo và trả lời bằng cùng tệp cache
Server · Cache
Bộ nhớ đệm và gclid: truy vấn nhấp quảng cáo, khóa cache của trang và byte đầu tiên đo được
Đo bằng byte đầu tiên cách truy vấn gclid gắn ở cuối URL nhấp quảng cáo bị bỏ qua và phản hồi bằng tệp cache của URL không có truy vấn.
Xem bài viết →Nội dung hiện tại

ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 4   +   7   =