瞭解 OpenResty XRay 是如何做到幫助企業定位應用程式存在的問題以及最佳化其效率的。

瞭解更多 LIVE DEMO

OpenResty 是一個開源 Web 平臺:它把增強版的 Nginx 核心、LuaJIT 和一組 Lua 庫打包成一個發行版,讓你可以直接用 Lua 為 Nginx 編寫請求處理邏輯。 它不是一套獨立於 Nginx 的新伺服器,而是在 Nginx 基礎上擴充套件出來的平臺:OpenResty 跟隨官方 Nginx 版本升級,可執行檔案仍然是 nginx,原有的 Nginx 配置可以繼續使用。OpenResty 由 OpenResty Inc. 維護。

Nginx 本身已經很強大:靜態檔案、反向代理、負載均衡、快取、限速,都可以透過配置直接使用。麻煩出現在需要按自己的業務規則處理請求的時候,比如按使用者身份鑑權、按業務規則限流或路由。複雜的判斷用 Nginx 指令寫起來很麻煩,很多指令要反覆查閱文件才能確認行為,配置一長就難以維護;用 C 編寫模組的開發成本較高,每次升級 Nginx 還可能需要重新編譯模組;交給外部服務處理,每個請求又要多一次網路往返。OpenResty 讓你直接在 Nginx 裡用 Lua 寫這些邏輯:程式碼條理清晰,修改邏輯也不用重新編譯 Nginx。打個比方,如果 Nginx 是一臺功能齊全的計算器,那麼 OpenResty 就是把它升級成了可程式設計計算機——從配置已有功能,擴充套件到編寫自己的業務邏輯。

本文由 OpenResty 的維護團隊撰寫,依次講清它能做甚麼、怎麼工作、由哪些部分組成,以及開源 OpenResty 與相關商業產品之間的關係。

OpenResty 用來做甚麼

OpenResty 常用於這樣的場景:服務位於流量入口,需要對每個請求進行判斷和處理:

  • API 閘道器與開放平臺:在請求進入後端之前完成鑑權、簽名校驗、限流、路由和協議轉換;SaaS 和付費 API 還可以按客戶限制呼叫額度、記錄用量。
  • Web 應用防火牆(WAF):在 Nginx 的訪問階段檢查請求,攔截 SQL 注入、XSS 等攻擊,執行 IP 黑白名單等訪問規則。
  • 動態路由、灰度釋出與負載均衡:根據請求頭、Cookie 或 Redis 中的配置,實時決定把請求轉發給哪個上游,也可以按使用者或比例把一部分流量分給新版本;上游變化時無需 reload Nginx(見 openresty.org 的基於 Redis 的動態路由示例)。
  • 大促與秒殺流量保護:快取商品頁面和介面,限制請求頻率,在流量高峰時攔截異常請求,保護後端服務。
  • CDN 與邊緣節點:在靠近使用者的節點上做快取控制、請求改寫和響應過濾。
  • AI / 大模型閘道器:統一代理多個模型的請求,按團隊或應用分配流量、控制 Token 配額。
  • 對併發效能要求較高的 Web 服務:直接在 Nginx 裡實現完整的 Web 應用或 API,用非阻塞方式訪問 MySQL、PostgreSQL、Redis 和 Memcached。

這些場景的共同點是:邏輯必須執行在請求路徑上。把它放到 Nginx 之外的獨立服務裡,每個請求都要多一次網路往返,團隊也要多部署、多監控一套服務;靠頻繁 reload 來更新路由,又會影響響應延遲、重置負載均衡狀態。OpenResty 把邏輯放進 Nginx 程序本身:請求無需再轉發到額外的業務服務,路由更新無需 reload,團隊可以用指令碼語言編寫業務邏輯,部署和運維仍然沿用 Nginx 的方式。

如果節點數量增加到需要集中管理配置,開源 OpenResty 本身並不提供完整的控制檯和配置分發系統。這時可以在保留現有 Lua 指令碼和 OpenResty 執行環境的基礎上使用 OpenResty Edge,集中管理負載均衡、WAF、快取和路由策略,並將配置同步到多個節點,同時保留版本和回滾能力。

OpenResty 如何工作

OpenResty 的工作方式可以歸結為三點:

  1. Nginx 負責網路與事件迴圈。 每個 worker 程序只用一個執行緒,透過事件驅動的方式同時承載成千上萬個連線。
  2. Lua 程式碼掛在請求處理階段上。 Nginx 把一個請求的處理分成 rewrite、access、content、log 等階段,響應發出前還會經過 header/body 過濾器。OpenResty 的核心元件 ngx_lua 允許你在這些位置插入 Lua 程式碼(rewrite_by_lua*、access_by_lua*、content_by_lua* 等);請求需要轉發給上游時,還可以用 balancer_by_lua* 按 Lua 邏輯選擇上游節點。每個請求在自己的 Lua 協程中執行。
  3. 訪問後端時用 cosocket,不阻塞執行緒。 cosocket 是 OpenResty 提供的一套非阻塞網路訪問介面。當 Lua 程式碼連線 Redis、MySQL 或上游 HTTP 服務時,cosocket API 會在等待資料期間掛起當前協程,讓 worker 去處理其他請求;資料到達後再恢復協程。對寫程式碼的人來說,這看起來就是普通的同步呼叫。cosocket 可以在 rewrite、access、content 等階段和定時器裡使用(各階段的完整支援情況見 lua-nginx-module 文件),在過濾器和 log 階段不可用,這兩個階段適合做輕量的改寫和記錄。

每個 worker 程序各自擁有一個 LuaJIT 虛擬機器,熱點程式碼會被即時編譯成機器碼。worker 之間需要共享的資料,比如計數器和限流狀態,放在 lua_shared_dict 共享記憶體區裡。

開源 OpenResty 提供了執行時能力,但問題定位仍然通常要依賴日誌、指標和人工分析。如果生產環境出現 CPU 飆高、記憶體上漲或請求變慢,可以使用 OpenResty XRay 對執行中的 OpenResty、Nginx 和 LuaJIT 程式進行動態追蹤,在不修改程式碼、不重啟應用的情況下,用火焰圖定位耗時的程式碼路徑。OpenResty XRay 是獨立的商業診斷工具,不是執行 OpenResty 的必需元件。

需要會 Lua 嗎

上手時不需要。Nginx 的配置方式沒有變,你可以只在需要自定義邏輯的那個 location 里加幾行 Lua:

location /hello {
    default_type text/plain;
    content_by_lua_block {
        local name = ngx.var.arg_name or "world"
        ngx.say("hello, ", name)
    }
}

請求 /hello?name=openresty 就會返回 hello, openresty。content_by_lua_block 裡是 Lua,塊外面仍然是標準的 Nginx 指令。OpenResty 使用的 LuaJIT 完全相容 Lua 5.1;Lua 語法簡潔,入門成本相對較低。

想動手的話,可以從安裝 OpenResty 開始,然後跟著 OpenResty 教程 的七個步驟,從 Hello World 走到生產環境。

OpenResty 是 Web 伺服器嗎,和 Nginx 是甚麼關係

是。OpenResty 本身就是一個完整的 Web 伺服器,也可以作為反向代理、負載均衡器和 TCP/UDP 代理使用。OpenResty 啟動後執行的是 Nginx 程序;openresty 命令通常只是啟動 OpenResty 所帶的 nginx 可執行檔案。

它和標準 Nginx 的關係,從版本號上就能看出來:OpenResty 版本號的前三段,就是它捆綁的 Nginx 核心版本。 例如 OpenResty 1.31.1.1 捆綁的是 Nginx 1.31.1,第四段是 OpenResty 自己的修訂號。如果你在某個網站的響應頭或報錯頁上看到 openresty/1.31.1.1,指的就是這臺伺服器執行的 OpenResty 版本。

按 openresty.org FAQ 的說明,OpenResty 採用“tick-tock”釋出模式:tock 版本把 Nginx 核心升級到官方最新的 mainline 版本,隨後的 tick 版本專注於 OpenResty 自身的功能和改進。各版本的變化可以在 openresty.org 的釋出公告中檢視,例如 OpenResty 1.31.1.1 釋出公告。

OpenResty 由哪些元件構成

根據 openresty.org 的介紹,OpenResty 中大部分 Nginx 模組由其維護者開發,因此這些模組能夠較好地協同工作。主要元件如下:

元件作用
增強版 Nginx 核心網路、事件迴圈、HTTP 與 TCP/UDP 代理,帶有 OpenResty 的補丁
LuaJIT(OpenResty 維護的 luajit2 分支)即時編譯執行 Lua 程式碼,完全相容 Lua 5.1
ngx_lua(lua-nginx-module)把 Lua 嵌入 HTTP 請求處理的各個階段,提供 ngx.* API 和 cosocket
stream-lua-nginx-module在 TCP/UDP 四層流量上執行 Lua
lua-resty-* 庫提供 Redis、MySQL、Memcached、DNS、WebSocket 等客戶端,以及快取、限流、鎖和上游健康檢查等常用庫
lua-cjson高效能 JSON 編解碼
resty 命令列工具不寫 nginx.conf,直接在終端執行 OpenResty 的 Lua 程式碼

完整清單見 openresty.org 的元件列表。如果開源庫的效能或功能不能滿足特定業務需求,也可以使用 OpenResty Inc. 提供的私有庫,以替換或增強部分 Lua 庫和 Nginx 模組;社群貢獻的更多 Lua 庫則可以在 OPM 上找到。

誰在使用 OpenResty

根據 Netcraft 2026 年 7 月的 Web 伺服器調查,約有 1.2 億個網站使用 OpenResty(佔 Netcraft 統計到的全部網站的 8.02%),約有 4270 萬個域名使用 OpenResty(佔 13.98%);兩項都在全球 Web 伺服器中排名第四。

除了直接部署,OpenResty 還是許多基礎設施軟體的基礎執行環境,多款主流開源 API 閘道器都構建在 OpenResty 之上。所以即使一家公司從未直接安裝過 OpenResty,它的請求流量也可能經過 OpenResty。

誰在維護 OpenResty

OpenResty 由章亦春(GitHub ID:agentzh)建立,目前由 OpenResty Inc. 維護,並與 OpenResty 軟體基金會一起為專案提供支援。

OpenResty 是免費的開源軟體,打包進來的元件大多采用 BSD、MIT 等寬鬆許可證。原始碼、預編譯包和文件都可以在 openresty.org 獲取,軟體包倉庫覆蓋 Ubuntu、Debian、RHEL 系列、Alpine 等主流 Linux 發行版。

OpenResty Inc. 還提供 OpenResty Edge、OpenResty XRay 和 OpenResty 私有庫等獨立的商業產品,分別補充多節點集中管理、生產問題診斷和特定元件效能最佳化能力;它們都不是執行開源 OpenResty 的前置條件。

常見問題

OpenResty 和 Nginx 有甚麼區別?

OpenResty 包含完整的 Nginx 核心,並在此之上加入了 LuaJIT 和 Lua 庫。標準的 Nginx 配置可以繼續使用,你可以按需逐個 location 加入 Lua 邏輯。對於需要程式設計實現的自定義行為,標準 Nginx 通常需要透過 C 模組或其他擴充套件方式實現;OpenResty 則讓你用 Lua 完成許多類似的工作。

OpenResty 可以免費使用嗎?

可以。OpenResty 是開源軟體,在生產環境中使用無需付費許可證。OpenResty Inc. 的 OpenResty Edge、OpenResty XRay 和 OpenResty 私有庫是另外提供的商業產品。

哪些軟體是基於 OpenResty 構建的?

開源 API 閘道器 Kong 和 Apache APISIX 都在各自的官方文件中說明了它們執行在 OpenResty(Nginx + LuaJIT)之上。OpenResty Inc. 的 OpenResty Edge 同樣構建在 OpenResty 之上。

OpenResty 使用哪個版本的 Lua?

OpenResty 使用 OpenResty 維護的 LuaJIT 2.1 分支,它完全相容 Lua 5.1,並支援部分 Lua 5.2 和 Lua 5.3 擴充套件。標準 Lua 5.1 程式碼無需修改即可執行,FFI 等 LuaJIT 特有功能也可以使用。訪問網路時,請使用 ngx.* 和 lua-resty-* 庫提供的非阻塞 API,讓 worker 在等待資料期間繼續處理其他請求。

網頁上顯示"403 Forbidden openresty"是甚麼意思?

這說明該網站的伺服器執行的是 OpenResty,錯誤頁底部的 openresty 或 openresty/1.31.1.1 是伺服器名稱和版本號。403、404、502、504 等狀態碼由這個網站自己的配置或它的後端服務決定,並不表示 OpenResty 軟體本身出了故障。如果你是訪客,請聯絡該網站;如果你是網站管理員,先檢視 Nginx 的 error.log,找出請求被拒絕或上游出錯的原因。

如何排查 OpenResty 應用的問題?

Lua 的執行時錯誤會寫入 Nginx 的 error.log,這是首先要看的地方;resty 命令列工具適合在伺服器之外復現問題。生產環境中的 CPU 飆高、記憶體上漲或請求變慢,往往無法僅靠日誌定位,這時可以用 OpenResty XRay 對執行中的程序生成 Lua 級別的 CPU 火焰圖,直接檢視耗時的程式碼路徑。

下一步

關於作者

章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。

章亦春(GitHub ID:agentzh)出生於中國江蘇,現居美國灣區。他曾供職於 Cloudflare、雅虎和阿里巴巴等科技企業,長期參與開源軟體和系統軟體開發,是 OpenResty 專案的創始人,也是 OpenResty Inc. 的 CEO 和創始人。他還參與過 Linux 核心、Nginx、LuaJIT、GDB、SystemTap、LLVM 和 Perl 等專案,並編寫過多個開源軟體庫。

關注我們

如果你喜歡本文,歡迎訪問 OpenResty Inc. 的部落格網站。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號