Nginx 正式擁抱現代 JavaScript!
說起 Nginx,大多數人的印象的可能是:高性能、穩定、省資源、配置簡單。確實,這個用 C 語言寫出來的服務器工具,十幾年來一直在互聯網基礎設施中扮演著“守門員”的角色。
但話說回來,Nginx 雖然快,但“太靜態”也是它的一個老問題。
隨著前后端分離、邊緣計算、接口鑒權、灰度路由等需求變多,越來越多開發者發現,僅靠傳統的配置語法已經不夠用了。我們需要在轉發請求前“想一想”、攔截一下、判斷一下,有時候還得去后端接口問一嘴。
于是,njs 出現了 —— Nginx 官方推出的 JavaScript 模塊,終于讓你可以在配置里寫點“邏輯”。
njs:靈活但不夠現代
一開始,njs 確實解決了不少痛點。但遺憾的是,它早期的語法支持非常有限,大致相當于 ES5 + 一丟丟 ES6。這對于寫點簡單邏輯還夠用,但對于習慣了 import/export
、async/await
的現代 JavaScript 開發者來說,簡直像突然穿越回了 2012 年。
模塊不能用,異步沒法寫,語法老舊,開發體驗也跟不上。用 JavaScript 寫配置這件事,聽上去是件美事,但真寫起來經常讓人感到“綁著手腳跳舞”。
新引擎來了,JS 真正落地 Nginx
就在最近,Nginx 官方悄悄宣布:njs 引入對 QuickJS 的支持。
這個變化乍一看不大,但對 JavaScript 開發者來說,影響是質的飛躍。
QuickJS 是一個超輕量 JavaScript 引擎,體積只有 367 KiB,卻支持完整的 ES2023 標準。這意味著你可以在 Nginx 腳本中使用:
import/export
模塊系統async/await
異步語法- 異步生成器、Proxy、BigInt 等現代能力
這不是“小打小鬧”的擴展,而是真正意義上的“現代 JavaScript 編程”跑在 Nginx 里了。
JS 能在 Nginx 里干啥?
以前你可能只能在配置里寫點 if
判斷、拼個 URI 之類的小邏輯,現在則可以做更“工程化”的事:
- 根據請求內容動態分發路由,像寫 Express 一樣
- 做一個輕量級的接口驗證邏輯,不用走后端
- 異步生成日志數據,根據條件寫不同格式
- 自定義 header、body 處理邏輯,更靈活地轉發請求
比如下面這個“接口認證”代碼:
async function auth(r) {
const resp = await ngx.fetch("http://auth-service/validate", {
method: "POST",
body: JSON.stringify({ token: r.headersIn['Authorization'] })
});
if (resp.status !== 200) {
r.return(401, "Unauthorized");
}
}
很 Node.js,對吧?但它運行在 Nginx 里,零依賴,零服務擴展。
為什么 JS 會在這兒火起來?
我們不妨換個角度看這個問題:Nginx 為啥愿意引入 JS?
答案其實不復雜:
- JS 開發者太多了,門檻低、學習成本小
- 寫配置邏輯比 DSL 清晰太多,容易調試
- 同樣的邏輯,寫 JS 更靈活、可讀性強
- 工具鏈一體化,前后端協同更自然
以前大家愛用 Lua,但 Lua 太冷門,生態小,現代語法也不行。Node.js 太重,把整個引擎塞進去不現實。而 QuickJS 折中得剛剛好:夠現代、夠小、夠快,完美貼合 Nginx 的設計哲學。
不是突然闖進來,而是悄悄深入
其實 JavaScript “進入” Nginx,不是一夜之間發生的。
- 一開始,只是能在配置里塞點小腳本
- 后來有了 njs,可以寫邏輯函數
- 現在有了 QuickJS,能跑完整的現代 JS
一步步來,幾乎沒怎么驚動圈子,但回過頭看,它已經成為 Nginx 腳本化能力的核心語言。
這不像 Node.js 那樣大張旗鼓搞服務端開發,更像是 JavaScript 在基礎設施領域的一次“迂回作戰”。
能用在什么地方?
如果你想知道具體能在哪用到,現在已經有不少落地場景:
- 動態路由:按地域、時間、設備類型轉發到不同服務
- 自定義日志:記錄用戶行為、請求詳情、命中規則等
- 邊緣攔截策略:做風控前置、做 IP 黑名單、做認證緩存
- 前端工具聯動:配合 Vite、Bun 做部署邏輯控制等
總之,原來只能在后端服務里搞的邏輯,現在可以在 Nginx 層就“截胡”了。
寫在最后
JavaScript 一開始只是寫網頁的;后來寫應用、寫服務端、寫桌面;現在連 Web Server 配置都能寫了。
從 Node 到 Deno 到 Bun,再到 njs + QuickJS,JS 正在成為“寫啥都行”的萬能膠水語言。
這一次,它沒試圖取代什么,只是在最不起眼的角落,把事情做得更順、更靈活、更現代。
Nginx 還是那個 Nginx,但現在,它腦子里裝了一塊 JavaScript 的芯。