OpenResty(也称为 ngx_openresty)是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
文章源自玩技e族-https://www.playezu.com/534970.htmlOpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发,),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。文章源自玩技e族-https://www.playezu.com/534970.html
OpenResty 的目标是让你的 Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。文章源自玩技e族-https://www.playezu.com/534970.html
OpenResty 的优势
首先我们选择使用 OpenResty,其是由 Nginx 核心加很多第三方模块组成,其最大的亮点是默认集成了 Lua 开发环境,使得 Nginx 可以作为一个 Web Server 使用。文章源自玩技e族-https://www.playezu.com/534970.html
借助于 Nginx 的事件驱动模型和非阻塞 IO,可以实现高性能的 Web 应用程序。而且 OpenResty 提供了大量组件如 Mysql、Redis、Memcached 等等,使在 Nginx 上开发 Web 应用更方便更简单。文章源自玩技e族-https://www.playezu.com/534970.html
OpenResty 起源
OpenResty 最早是雅虎中国的一个公司项目,起步于 2007 年 10 月。当时兴起了 OpenAPI 的热潮,用于满足各种 Web Service 的需求,就诞生了 OpenResty。在公司领导的支持下,最早的 OpenResty 实现从一开始就开源了。文章源自玩技e族-https://www.playezu.com/534970.html
最初的定位是服务于公司外的开发者,像其他的 OpenAPI 那样,但后来越来越多地是为雅虎中国的搜索产品提供内部服务。这是第一代的 OpenResty,当时的想法是,提供一套抽象的 web service,能够让用户利用这些 web service 构造出新的符合他们具体业务需求的 Web Service 出来,所以有些“meta web service”的意味,包括数据模型、查询、安全策略都可以通过这种 meta web service 来表达和配置。同时这种 web service 也有意保持 REST 风格。与这种概念相对应的是纯 AJAX 的 web 应用,即 web 应用几乎都使用客户端 JavaScript 来编写,然后完全由 web service 让 web 应用“活”起来。用户把 .html, .js, .css, .jpg 等静态文件下载到 web browser 中,然后 js 开始运行,跨域请求雅虎提供的经过站长定制过的 web service,然后应用就可以运行起来。文章源自玩技e族-https://www.playezu.com/534970.html
不过随着后来的发展,公司外的用户毕竟还是少数,于是应用的重点是为公司内部的其他团队提供 web service,比如雅虎中国的全能搜索产品,及其外围的一些产品。从那以后,开发的重点便放在了性能优化上面。章亦春在加入淘宝数据部门的量子团队之后,决定对 OpenResty 进行重新设计和彻底重写,并把应用重点放在支持像量子统计这样的 web 产品上面,所以量子统计 3.0 开始也几乎完全是 web service 驱动的纯 AJAX 应用。文章源自玩技e族-https://www.playezu.com/534970.html
这是第二代的 OpenResty,一般称之为 ngx_openresty,以便和第一代基于 Perl 和 Haskell 实现的 OpenResty 加以区别。章亦春和他的同事王晓哲一起设计了第二代的 OpenResty。在王晓哲的提议下,选择基于 nginx 和 lua 进行开发。文章源自玩技e族-https://www.playezu.com/534970.html
为什么是 OpenResty 这个名字?
OpenResty 最早是顺应 OpenAPI 的潮流做的,所以 Open 取自“开放”之意,而 Resty 便是 REST 风格的意思。虽然后来也可以基于 ngx_openresty 实现任何形式的 web service 或者传统的 web 应用。文章源自玩技e族-https://www.playezu.com/534970.html
也就是说 Nginx 不再是一个简单的静态网页服务器,也不再是一个简单的反向代理了。第二代的 openresty 致力于通过一系列 nginx 模块,把 nginx 扩展为全功能的 web 应用服务器。
ngx_openresty 是用户驱动的项目,后来也有不少国内用户的参与,从 openresty.org 的点击量分布上看,国内和国外的点击量基本持平。
ngx_openresty 目前有两大应用目标:
通用目的的 web 应用服务器。在这个目标下,现有的 web 应用技术都可以算是和 OpenResty 或多或少有些类似,比如 Nodejs, PHP 等等。ngx_openresty 的性能(包括内存使用和 CPU 效率)算是最大的卖点之一。
Nginx 的脚本扩展编程,用于构建灵活的 Web 应用网关和 Web 应用防火墙。有些类似的是 NetScaler。其优势在于 Lua 编程带来的巨大灵活性。
ngx_openresty 从一开始就是公司实际的业务需求的产物。在过去的几年中的大部分开发工作也是由国内外许多公司和个人的实际业务需求驱动的。这种模型在实践中工作得非常好,可以确保我们做的就是大家最迫切需要的。在此过程中,慢慢形成了 ngx_openresty 的两大应用方向,也就是前面提到的那两大方向。是我们的用户帮助我们确认了这两个方向,事实上,这并不等同于第一代 OpenResty 的方向,而是变得更加底层和更加通用了。
开源精神的核心是分享而非追求流行。毕竟开源界不是娱乐圈,也不是时尚圈。如果我们的开源项目有越来越多的人开始使用,只是一个“happy accident”,我们自然会很高兴,但这并不是我们真正追求的。
开放源码只是开源项目生命周期中的“万里长征第一步”,国内的许多开源项目止步于开放源码,而没有后续投入长期的时间和精力去跟进响应用户的各种需求和反馈,但不免夭折。这种现象在国外的不少开源项目中也很常见。
国外成功的开源项目比较多,或许跟许多发达国家的程序员们的精神状态有关系。比如我认识的一些国外的黑客都非常心思单纯,热情似火。他们在精神上的束缚非常少,做起事来多是不拘一格。有的人即便长期没有工作单纯靠抵押和捐赠过活,也会不遗余力地投身于开源项目。而我接触到的国内许多程序员的精神负担一般比较重,经济上的压力也比较大,自然难有“玩开源”的心思。
不过,国内也是有一些程序员拥有国外优秀黑客的素质的,而且他们通过网络和全球的黑客紧密联系在一起,所以我们完全可以期待他们未来有振奋人心的产出。在互联网时代的今天,或许按国界的划分来讨论这样的问题会变得越来越不合时宜。
评论