OpenResty簡介


OpenResty(也稱為 ngx_openresty)是一個全功能的 Web 應用服務器。它打包了標准的 Nginx 核心,很多的常用的第三方模塊,以及它們的大多數依賴項。
通過揉和眾多設計良好的 Nginx 模塊,OpenResty 有效地把 Nginx 服務器轉變為一個強大的 Web 應用服務器,基於它開發人員可以使用 Lua 編程語言對 Nginx 核心以及現有的各種 Nginx C 模塊進行腳本編程,構建出可以處理一萬以上並發請求的極端高性能的 Web 應用。

OpenResty 致力於將你的服務器端應用完全運行於 Nginx 服務器中,充分利用 Nginx 的事件模型來進行非阻塞 I/O 通信。不僅僅是和 HTTP 客戶端間的網絡通信是非阻塞的,與MySQL、PostgreSQL、Memcached 以及 Redis 等眾多遠方后端之間的網絡通信也是非阻塞的。
因為 OpenResty 軟件包的維護者也是其中打包的許多 Nginx 模塊的作者,所以 OpenResty 可以確保所包含的所有組件可以可靠地協同工作。

OpenResty 最早是雅虎中國的一個公司項目,起步於 2007 年 10 月。當時興起了 OpenAPI 的熱潮,用於滿足各種 Web Service 的需求,就誕生了 OpenResty。在公司領導的支持下,最早的 OpenResty 實現從一開始就開源了。最初的定位是服務於公司外的開發者,像其他的 OpenAPI 那樣,但后來越來越多地是為雅虎中國的搜索產品提供內部服務。這是第一代的 OpenResty,當時的想法是,提供一套抽象的 web service,能夠讓用戶利用這些 web service 構造出新的符合他們具體業務需求的 Web Service 出來,所以有些“meta web servie”的意味,包括數據模型、查詢、安全策略都可以通過這種 meta web service 來表達和配置。同時這種 web service 也有意保持 REST 風格。與這種概念相對應的是純 AJAX 的 web 應用,即 web 應用幾乎都使用客戶端 JavaScript 來編寫,然后完全由 web service 讓 web 應用“活”起來。用戶把 .html, .js, .css, .jpg 等靜態文件下載到 web browser 中,然后 js 開始運行,跨域請求雅虎提供的經過站長定制過的 web service,然后應用就可以運行起來。不過隨着后來的發展,公司外的用戶畢竟還是少數,於是應用的重點是為公司內部的其他團隊提供 web service,比如雅虎中國的全能搜索產品,及其外圍的一些產品。從那以后,開發的重點便放在了性能優化上面。章亦春在加入淘寶數據部門的量子團隊之后,決定對 OpenResty 進行重新設計和徹底重寫,並把應用重點放在支持像量子統計這樣的 web 產品上面,所以量子統計 3.0 開始也幾乎完全是 web service 驅動的純 AJAX 應用。
這是第二代的 OpenResty,一般稱之為 ngx_openresty,以便和第一代基於 Perl 和 Haskell 實現的 OpenResty 加以區別。章亦春和他的同事王曉哲一起設計了第二代的 OpenResty。在王曉哲的提議下,選擇基於 nginx 和 lua 進行開發。
為什么要取 OpenResty 這個名字呢?OpenResty 最早是順應 OpenAPI 的潮流做的,所以 Open 取自“開放”之意,而Resty便是 REST 風格的意思。雖然后來也可以基於 ngx_openresty 實現任何形式的 web service 或者傳統的 web 應用。
也就是說 Nginx 不再是一個簡單的靜態網頁服務器,也不再是一個簡單的反向代理了。第二代的 openresty 致力於通過一系列 nginx 模塊,把nginx擴展為全功能的 web 應用服務器。
ngx_openresty 是用戶驅動的項目,后來也有不少國內用戶的參與,從 openresty.org 的點擊量分布上看,國內和國外的點擊量基本持平。

ngx_openresty 目前有兩大應用目標:

  1. 通用目的的 web 應用服務器。在這個目標下,現有的 web 應用技術都可以算是和 OpenResty 或多或少有些類似,比如 Nodejs, PHP 等等。ngx_openresty 的性能(包括內存使用和 CPU 效率)算是最大的賣點之一。
  2. Nginx 的腳本擴展編程,用於構建靈活的 Web 應用網關和 Web 應用防火牆。有些類似的是 NetScaler。其優勢在於 Lua 編程帶來的巨大靈活性。

ngx_openresty 從一開始就是公司實際的業務需求的產物。在過去的幾年中的大部分開發工作也是由國內外許多公司和個人的實際業務需求驅動的。這種模型在實踐中工作得非常好,可以確保我們做的就是大家最迫切需要的。在此過程中,慢慢形成了 ngx_openresty 的兩大應用方向,也就是前面提到的那兩大方向。是我們的用戶幫助我們確認了這兩個方向,事實上,這並不等同於第一代 OpenResty 的方向,而是變得更加底層和更加通用了。

開源精神的核心是分享而非追求流行。畢竟開源界不是娛樂圈,也不是時尚圈。如果我們的開源項目有越來越多的人開始使用,只是一個“happy accident”,我們自然會很高興,但這並不是我們真正追求的。

開放源碼只是開源項目生命周期中的“萬里長征第一步”,國內的許多開源項目止步於開放源碼,而沒有后續投入長期的時間和精力去跟進響應用戶的各種需求和反饋,但不免夭折。這種現象在國外的不少開源項目中也很常見。

國外成功的開源項目比較多,或許跟許多發達國家的程序員們的精神狀態有關系。比如我認識的一些國外的黑客都非常心思單純,熱情似火。他們在精神上的束縛非常少,做起事來多是不拘一格。有的人即便長期沒有工作單純靠抵押和捐贈過活,也會不遺余力地投身於開源項目。而我接觸到的國內許多程序員的精神負擔一般比較重,經濟上的壓力也比較大,自然難有“玩開源”的心思。

不過,國內也是有一些程序員擁有國外優秀黑客的素質的,而且他們通過網絡和全球的黑客緊密聯系在一起,所以我們完全可以期待他們未來有振奮人心的產出。在互聯網時代的今天,或許按國界的划分來討論這樣的問題會變得越來越不合時宜。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM