OpenResty 是甚麼?從 Nginx、LuaJIT 到應用場景
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 的工作方式可以歸結為三點:
- Nginx 負責網路與事件迴圈。 每個 worker 程序只用一個執行緒,透過事件驅動的方式同時承載成千上萬個連線。
- 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 協程中執行。 - 訪問後端時用 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:各 Linux 發行版、ARM64、macOS 與原始碼安裝指南
- OpenResty 教程:從 Hello World 到生產環境的七步實戰
- OpenResty 官方文件與入門:openresty.org 上的入門指南
- OpenResty 釋出公告:最新版本的變化
關於作者
章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。
章亦春(GitHub ID:agentzh)出生於中國江蘇,現居美國灣區。他曾供職於 Cloudflare、雅虎和阿里巴巴等科技企業,長期參與開源軟體和系統軟體開發,是 OpenResty 專案的創始人,也是 OpenResty Inc. 的 CEO 和創始人。他還參與過 Linux 核心、Nginx、LuaJIT、GDB、SystemTap、LLVM 和 Perl 等專案,並編寫過多個開源軟體庫。
關注我們
如果你喜歡本文,歡迎訪問 OpenResty Inc. 的部落格網站。也歡迎掃碼關注我們的微信公眾號:














