Nginx 正式擁抱現代 JavaScript!

說起 Nginx,大多數人的印象的可能是:高性能、穩定、省資源、配置簡單。確實,這個用 C 語言寫出來的服務器工具,十幾年來一直在互聯網基礎設施中扮演着 “守門員” 的角色。

但話說回來,Nginx 雖然快,但 “太靜態” 也是它的一個老問題。

隨着前後端分離、邊緣計算、接口鑑權、灰度路由等需求變多,越來越多開發者發現,僅靠傳統的配置語法已經不夠用了。我們需要在轉發請求前 “想一想”、攔截一下、判斷一下,有時候還得去後端接口問一嘴。

於是,njs 出現了 —— Nginx 官方推出的 JavaScript 模塊,終於讓你可以在配置裏寫點 “邏輯”。

njs:靈活但不夠現代

一開始,njs 確實解決了不少痛點。但遺憾的是,它早期的語法支持非常有限,大致相當於 ES5 + 一丟丟 ES6。這對於寫點簡單邏輯還夠用,但對於習慣了 import/exportasync/await 的現代 JavaScript 開發者來說,簡直像突然穿越回了 2012 年。

模塊不能用,異步沒法寫,語法老舊,開發體驗也跟不上。用 JavaScript 寫配置這件事,聽上去是件美事,但真寫起來經常讓人感到 “綁着手腳跳舞”。

新引擎來了,JS 真正落地 Nginx

就在最近,Nginx 官方悄悄宣佈:njs 引入對 QuickJS 的支持

這個變化乍一看不大,但對 JavaScript 開發者來說,影響是質的飛躍。

QuickJS 是一個超輕量 JavaScript 引擎,體積只有 367 KiB,卻支持完整的 ES2023 標準。這意味着你可以在 Nginx 腳本中使用:

這不是 “小打小鬧” 的擴展,而是真正意義上的 “現代 JavaScript 編程” 跑在 Nginx 裏了。

JS 能在 Nginx 裏幹啥?

以前你可能只能在配置裏寫點 if 判斷、拼個 URI 之類的小邏輯,現在則可以做更 “工程化” 的事:

比如下面這個 “接口認證” 代碼:

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?

答案其實不復雜:

以前大家愛用 Lua,但 Lua 太冷門,生態小,現代語法也不行。Node.js 太重,把整個引擎塞進去不現實。而 QuickJS 折中得剛剛好:夠現代、夠小、夠快,完美貼合 Nginx 的設計哲學。

不是突然闖進來,而是悄悄深入

其實 JavaScript “進入” Nginx,不是一夜之間發生的。

一步步來,幾乎沒怎麼驚動圈子,但回過頭看,它已經成爲 Nginx 腳本化能力的核心語言

這不像 Node.js 那樣大張旗鼓搞服務端開發,更像是 JavaScript 在基礎設施領域的一次 “迂迴作戰”。

能用在什麼地方?

如果你想知道具體能在哪用到,現在已經有不少落地場景:

總之,原來只能在後端服務裏搞的邏輯,現在可以在 Nginx 層就 “截胡” 了。

寫在最後

JavaScript 一開始只是寫網頁的;後來寫應用、寫服務端、寫桌面;現在連 Web Server 配置都能寫了。

從 Node 到 Deno 到 Bun,再到 njs + QuickJS,JS 正在成爲 “寫啥都行” 的萬能膠水語言

這一次,它沒試圖取代什麼,只是在最不起眼的角落,把事情做得更順、更靈活、更現代。

Nginx 還是那個 Nginx,但現在,它腦子裏裝了一塊 JavaScript 的芯。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/PYCi9jY0bNtYbAikPzvqBQ