多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 22 Lua 和nginx ## 其实也有很多人一直还在使用Nginx\_php这种组合搭配,对于Nginx\_lua组合的优势在哪里呢?清无介绍说,Nginx+php之间是要有进程之间通信的,这样以来基础的性能开销就很大。lua是嵌在Nginx进程内部的,它不需要有两套进程在那里独立工作。所以这块从结构上来说就有决定性的优势在里面。再加上线程之间通讯的时候需要大量的反序列化和序列化的工作,然后两套进程带来额外情况是更多的进程更多的切换开销,所以单机上面Nginx\_php要比Nginx\_lua要低很多。但是相对来说仍然要回到我们做什么事情上面,因为Nginx\_lua目前最大的劣势就是周边的模块相当的不健全,我们需要大量的时间来积累这些模块。php积累了十几年的时间了,如果说你对性能的要求并不是那么高,我的并发数就是几十,那么你用php就是最合适的。但是如果像一淘数据的数据接口,机器数就那么一点,因为我的大量成本在集群上面,它是这块的主力,那么对外的数据接口我希望尽可能降成本,并发数又非常大,php肯定是不行,那么我们就要选择Nginx\_lua。但这块的话对模块的劣势看起来不是那么大,因为它的逻辑相对来说较为固定,我们可以忍受这样的成本,我们去为这个逻辑来定制一些模块。 ![](https://img.kancloud.cn/fb/72/fb7290a135d5142c31947c3b0fc173a4_939x690.jpg) ![](https://img.kancloud.cn/8e/4c/8e4c768f6c3bef0f005086485ddf29e2_914x677.jpg)从上面的两张性能测试图中我们总结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 等广泛使用的开发 * 语言,周边附属设施尚不够健全,需要时间积累