## 22 Lua 和nginx
##
其實也有很多人一直還在使用Nginx\_php這種組合搭配,對于Nginx\_lua組合的優勢在哪里呢?清無介紹說,Nginx+php之間是要有進程之間通信的,這樣以來基礎的性能開銷就很大。lua是嵌在Nginx進程內部的,它不需要有兩套進程在那里獨立工作。所以這塊從結構上來說就有決定性的優勢在里面。再加上線程之間通訊的時候需要大量的反序列化和序列化的工作,然后兩套進程帶來額外情況是更多的進程更多的切換開銷,所以單機上面Nginx\_php要比Nginx\_lua要低很多。但是相對來說仍然要回到我們做什么事情上面,因為Nginx\_lua目前最大的劣勢就是周邊的模塊相當的不健全,我們需要大量的時間來積累這些模塊。php積累了十幾年的時間了,如果說你對性能的要求并不是那么高,我的并發數就是幾十,那么你用php就是最合適的。但是如果像一淘數據的數據接口,機器數就那么一點,因為我的大量成本在集群上面,它是這塊的主力,那么對外的數據接口我希望盡可能降成本,并發數又非常大,php肯定是不行,那么我們就要選擇Nginx\_lua。但這塊的話對模塊的劣勢看起來不是那么大,因為它的邏輯相對來說較為固定,我們可以忍受這樣的成本,我們去為這個邏輯來定制一些模塊。

從上面的兩張性能測試圖中我們總結Nginx\_lua的適用場景:
1. 網絡I/O 阻塞時間遠高于CPU 計算占用時間、同時上游資源非瓶頸(可伸縮)的網絡應用,如高性能網絡中間層、HTTP REST 接口服務等;
2. 期望簡化系統架構,讓服務向Nginx 同質化的Web 站點;
## Nginx\_lua的優勢和劣勢
對于Nginx\_lua的劣勢在剛剛和Nginx\_php的對比的時候清無也介紹了一個是周邊模塊不完善,不健全的問題。如果你用到的這個東西比較復雜的時候可能生產力上不去,目前Nginx\_lua最適合的人員是數據接口層,以及所有的網絡中間層,你需要最求并發,高性能的網絡中間層。因為它本身的邏輯相對來說比較簡單,或者完全用lua本身就可以變現出來,這個用起來收效比例是最大的。那么如果你目前要做一個復雜的WEB訪問站,有大量模板要套,有大量的復雜邏輯嵌在里面,然后要訪問mail要訪問其他服務的話,目前來說我覺得還是php或者其他比較成熟的語言。就我們目前應用來說也是這樣,中間層會大量的使用lua,但是前端展現層的話要么全部移到瀏覽器上面用JS+模板的形式來實現,要么就是用PHP這樣來做。
另外的劣勢就是調試的輔助工具不太多,因為高級點的php程序員會往往會使用XDebug或者其它的調試工具,可以單步調試,在線調試。跟php相比目前還欠缺這樣的一個機制。到時候我們會仿照XDebug 去實現DPT V2協議,我們實現兼容DPT V2這樣的一種機制內連到Nginx\_lua里面,那樣Nginx\_lua也可以單步調試。
最后我們來歸納一下清無介紹的幾點優勢和劣勢:
> 優勢:
* 同步非阻塞I/O 形式直觀易懂,并發服務能力強
* CPU、內存運行開銷低
* 同Nginx 結合度高,可方便粘合現有Nginx 模塊功能
> 劣勢:
* 屬于新技術方案,Lua 相比于PHP、Ruby 等廣泛使用的開發
* 語言,周邊附屬設施尚不夠健全,需要時間積累
- 1 Lua介紹及環境
- 2 基本語法
- 3 數據類型
- 4 Lua 變量
- 5 循環
- 6 流程控制
- 7 函數
- 8 運算符
- 9 字符串
- 10 數組
- 11 迭代器
- 12 table
- 13 Lua 模塊與包
- 14 Lua 元表(Metatable)
- 14.1 元表案例
- 15 Lua 協同程序(coroutine)
- 16 Lua 文件IO
- 17 Lua 面向對象
- 17.1 類
- 17.2 繼承
- 17.3 封裝
- 18 Lua 與 Mysql
- 19 Lua 與 redis
- 20 Lua 與 JSON
- 21 Lua 與 http
- 22 Lua 與 Nginx
- 22.1 Nginx_Lua的安裝及環境
- 22.2 ngx_lua API(全表)
- 22.3 常用命令介紹
- 22 Lua 人工智能
- (1) Torch的安裝
- (2)Tensor
- Lua與C混合編程