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 可以确保所包含的所有组件可以可靠地协同工作。
【访谈实录】
1. 能否先介绍一下你自己,包括技术背景、工作经历、学习经历等等
我的技术背景有些杂,前端工程师、运维工程师、系统开发工程师都干过。07年我从计算机专业毕业后一直在阿里巴巴集团下的子公司工作,先是在雅虎中国的搜索部门干了两年。然后又在淘宝的数据部门干了近两年的时间。
2. 你在阿里巴巴主要是做哪方面的开发?
我开发过 Firefox 插件,然后做过通用 web service 平台,后来又搞基于 Gecko
和WebKit核心的网页视觉识别和自动抽取,再后来重新设计了淘宝量子统计的前端系统,并实现了其中的核心部分,包括客户端 JavaScript
框架。还有服务器端的数据接口平台,以及数据融合中间件。在雅虎时还开发过一些运维工具。
3. 那你是什么时候接触Nginx的?
我是09年9月开始正式学习它的源码的,再早前有些零星接触,但不多。
4. 是在淘宝的工作需要吗?
准确的讲,是我的openresty项目的需要。只不过正好可以和淘宝数据部门的业务需求结合到一起。我也正是那会儿才加入淘宝数据部门的,之前还在淘宝导购搜索团队。
5. 那你为什么会想到要做OpenResty这个项目?
OpenResty最早是雅虎中国的一个公司项目,起步于 2007 年 10
月。当时兴起了OpenAPI的热潮,于是老大们也想做一个类似的东西,可以支持各种 web service
的需求。在部门老大们的支持下,最早的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 应用。
6. 这是第二代的OpenResty吗?
是的,我一般称之为ngx_openresty,以便和第一代基于 Perl 和 Haskell 实现的OpenResty加以区别。我和我的同事王晓哲一起设计了第二代的OpenResty。在王晓哲的提议下,我们选择基于nginx和lua进行开发。
7. 你现在哪里工作呢?
我在过去的一年中没有正式的工作。我把力量都放在了ngx_openresty为主的开源项目上面 :) 在国内外用户的需求推动下保持工作 :)
8. 那你做这个事情有收入吗?
在过去的一年中只有来自用户公司和个人的一些捐赠,微薄的捐赠,呵呵。主要想法还是给自己放一个长假 :)集中力量系统地做一些我最想做的事情。
9. 那你将来的打算呢?
我一向没有太长远的打算,我是一个随性的人。从这个月底(2012年6月)开始,我将结束 jobless 的状态。因为美国(旧金山)有一家公司愿意让我在他们那里全职做ngx_openresty,他们也是ngx_openresty的应用大户。
10. OpenResty刚开始是雅虎的项目,他们是放弃了版权吗?
是雅虎中国,当时已经是阿里巴巴集团的一部分。后来我们重写OpenResty时,放弃了第一代的所有代码。就像我当时重写量子统计前端应用时,放弃了原先的几乎所有代码一样。
11. 为什么要取OpenResty这个名字呢?
OpenResty最早是顺应OpenAPI的潮流做的,所以 Open 取自“开放”之意,而Resty便是 REST 风格的意思。虽然后来也可以基于ngx_openresty实现任何形式的 web service 或者传统的 web 应用。
12. 也就是说Nginx不再是一个简单的静态网页服务器了?
是的,也不再是一个简单的反向代理了。第二代的openresty致力于通过一系列nginx模块,把nginx扩展为全功能的 web 应用服务器。
13. 可以运行 Java Web 应用吗?
把 JVM 嵌入nginx绝对不是一个好主意 :)或许未来我们可以把 Java 编译为Lua哈哈!目前我们只支持Lua语言。不过有计划通过把
PHP 等其他语言编译为Lua或者Lua字节码来实现其他语言在ngx_openresty上的直接运行。王晓哲已经工作在 php2lua
项目上了,呵呵。
14. 你是怎么让别人知道OpenResty这个项目的?
我没有专门从事ngx_openresty的推广工作,因为我们在淘宝时的工作重点一直是首先支撑淘宝量子统计的业务。因为ngx_openresty在
形式上是由一系列相对独立但又可以随意组合起来一起协同工作的nginx模块组成的,所以人们多是通过nginx社区首先了解到我们的一二个模块,直至最
后知晓ngx_openresty这整个大项目的。一开始我们的许多用户的反馈也多是直接发给我或者王晓哲,以及发到nginx官方的英文邮件列表。随着
网上搜索“OpenResty”的人越来越多,我们才觉得有必要建立一个 openresty.org
首页。于是我们就这么做了。几个月前,在Zoon.Quiet同学的推动下,我们又把 Google Groups
上的openresty邮件组给启用起来了,目前多是中国用户订阅并在那里讨论nginx或者openresty
相关的问题,也有好多位国外的用户在那里用英文交流。
15. 也就是说你这个项目,一开始就有很多国外的用户参与?
是的,ngx_openresty是用户驱动的项目,后来也有不少国内用户的参与,从 openresty.org 的点击量分布上看,国内和国外的点击量基本持平。
16. 目前开发和维护OpenResty的人员有哪些?
目前主要是我在领导,同时王晓哲仍在做一些基础而核心的开发工作,但只是业余时间。我们有许多比较活跃的贡献者,比如波兰的Nginx黑客
PiotrSikora,CloudFlare的系统工程师MatthieuTourne,Turner BroadcastingSystem
的架构师 Brian
Akins,一淘量子团队的林青和支家乐,去哪儿网的珣新和郭颖,新浪网的drdrxp(网名),而淘宝核心系统部的静龙(花名)、淘李子(花名)、姚伟
斌、Simon Liu等多位工程师今年以来也很活跃。StickyAdsTv公司的
CTO,AntoineBonavita,也为我们的测试工具链做了很多贡献。此外,还有不少贡献者我在这里并没有提及,向他们致歉。
17. 也就是说这个项目目前是由你领导的一些纯兴趣爱好者在开发。但是这些开发人员都由各自的公司支持来开发这个项目?
这些贡献者都是其所在的公司的业务需求推动的。我们很少因为“好玩”而去做一件事情。所以我虽然最近一直在家里,却仍被许多公司的业务需求给间接着推动着,呵呵。
18. 我觉得这个项目是我见到国人发起的生态环境非常好的一个项目,向你们致敬!
谢谢。相比其他开源作者,我自以为我做得比较好的一个地方是,我总是尝试及时回复用户的各种邮件,即使我还有全职工作的时候。
19. 你知道国内除了淘宝以外,还有哪些公司在用OpenResty吗
网易,腾讯,去哪儿网、新浪、天涯、CloudFlare, Reblaze.com、EMS、网龙……
20. 那网易、腾讯他们有没有对这个项目有所贡献?
网易和腾讯的工程师给了不少反馈,报告过一些问题,可能也贡献过一些补丁,但我不太能把个人和公司名字联系起来,因为开源世界多是匿名的。我也没有询问英
雄出处的习惯。新浪的工程师贡献过一些补丁,去哪儿网有一些雅虎和淘宝的老同事,也是活跃的贡献者。还有一些公司因为特别交待需要保密,所以我也不方便在
这里列出它们的名字:)
21. 你们平时是通过邮件列表交流吗?
我们平时通过邮件、微博、Gtalk/MSN 等各种方式交流。同时github也是很不错的交流平台。
22. 你的美国老板是让你过去全职做OpenResty这个项目吗?你的工作是否会完全开源?
当然。
23. 你去年一年都在家做开源项目。你说主要力量放在了ngx_openresty上面,还有其他开源项目吗?
还有 Test::Nginx测试模块、mockeagain测试工具、opsboy之类。
24. 目前和OpenResty类似的项目有哪些?相比之下OpenResty有和特点和优势?
ngx_openresty目前有两大应用目标:
1. 通用目的的 web 应用服务器。在这个目标下,现有的 web 应用技术都可以算是和OpenResty或多或少有些类似,比如 Nodejs, PHP 等等。ngx_openresty的性能(包括内存使用和 CPU 效率)算是最大的卖点之一。
2. Nginx的脚本扩展编程,用于构建灵活的 Web 应用网关和 Web 应用防火墙。有些类似的是NetScaler. 其优势在于 Lua编程带来的巨大灵活性。
25. OpenResty将来的发展方向?是不是还是由公司的需求推动?
ngx_openresty从一开始就是公司实际的业务需求的产物。在过去的几年中的大部分开发工作也是由国内外许多公司和个人的实际业务需求驱动的。这
种模型在实践中工作得非常好,可以确保我们做的就是大家最迫切需要的。在此过程中,慢慢形成了ngx_openresty的两大应用方向,也就是前面提到
的那两大方向。是我们的用户帮助我们确认了这两个方向,事实上,这并不等同于第一代OpenResty的方向,而是变得更加底层和更加通用了。
26. 你也应该知道国内基本上没有太流行的开源项目,而国外却有很多。能否谈谈你对开源的理解以及对国内外差距的看法?
开源精神的核心是分享而非追求流行。毕竟开源界不是娱乐圈,也不是时尚圈。如果我们的开源项目有越来越多的人开始使用,只是一个“happy accident”,我们自然会很高兴,但这并不是我们真正追求的。
开放源码只是开源项目生命周期中的“万里长征第一步”,国内的许多开源项目止步于开放源码,而没有后续投入长期的时间和精力去跟进响应用户的各种需求和反馈,但不免夭折。这种现象在国外的不少开源项目中也很常见。
国外成功的开源项目比较多,或许跟许多发达国家的程序员们的精神状态有关系。比如我认识的一些国外的黑客都非常心思单纯,热情似火。他们在精神上的束缚非
常少,做起事来多是不拘一格。有的人即便长期没有工作单纯靠抵押和捐赠过活,也会不遗余力地投身于开源项目。而我接触到的国内许多程序员的精神负担一般比
较重,经济上的压力也比较大,自然难有“玩开源”的心思。
不过,国内也是有一些程序员拥有国外优秀黑客的素质的,而且他们通过网络和全球的黑客紧密联系在一起,所以我们完全可以期待他们未来有挎奋人心的产出。
在互联网时代的今天,或许按国界的划分来讨论这样的问题会变得越来越不合时宜。
27. 你有没有什么建议给编程的初学者?以及对于新手创建自己的开源项目,你是什么看法?
对于编程的初学者,我最主要的建议就是打开门去看世界,多通过
IRC、邮件列表等途径和世界各国(自然也包括国内)的黑客联结到一起。和他们多沟通多交流,尽可能地多和他们一起通过网络远程协作,比如参与一些有趣的
开源项目。为了做到这一点,也需要把英语学好。语言是交流和学习的前提。在此过程中,把自己的功利心放下,以真诚单纯的心为开源世界乃至整个计算世界多贡
献。
对于创建开源项目的新手,我建议一定要及时响应用户以及其他开发者的反馈,千万不要止步于开放源代码。同时多参与和关注其他的开源项目,观察那些比较成功的开源项目具体是如何运作的。
28. 能否给开源中国提些意见或者建议?
希望开源中国能不断致力于开源文化和开源精神在中国的普及,包括在业界的普及以及在各高校的计算机相关专业内的普及。我觉得这才是开源的精髓。而开放源代码的行为本身以及一个个具体开源项目的文档和源码包都只不过是形式罢了。
OpenResty 作者章亦春访谈实录的更多相关文章
- [转] 【开源访谈】Muduo 作者陈硕访谈实录
关于开源访谈 开源访谈是开源中国推出的一系列针对国内优秀开源软件作者的访谈,以文字的方式记录并传播.我们希望开源访谈能全面的展现国内开源软件.开源软件作者的现状,着实推动国内开源软件的应用与发展. [ ...
- openresty nginx 安装过程记录
转载请注明原始地址 http://www.cnblogs.com/dongxiao-yang/p/4877799.html 一 :系统版本 1 cat /etc/issue: CentOS relea ...
- T型架构观点学习
一.成为T型人才 眼界格局思维要尽可能的开阔,并不断横向开阔,专业能力要尽可能专注,并且纵向上不断加深: 互联网的快速迭代开发和扁平化管理,使单纯管理人才的作用越来越小,除了分配任务和项目管理,在其他 ...
- OpenResty的现状、趋势、使用及学习方法
Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中,实现了 OpenResty 这个高性能服务端解决方案. 通过 OpenRest ...
- Openresty最佳案例 | 汇总
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616856 本文出自方志朋的博客 目录 Openresty最佳案例 | 第1篇:Ngin ...
- OpenResty: 介绍 (摘抄)
原文链接:https://www.cnblogs.com/duanxz/p/10396160.html Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM ...
- 网站统计中的数据收集原理及实现(share)
转载自:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html 网站数据统计分析工 ...
- 使用nginx lua实现网站统计中的数据收集
导读网站数据统计分析工具是各网站站长和运营人员经常使用的一种工具,常用的有 谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于ja ...
- Nginx 配置埋点js日志采集
页面埋点&nginx日志采集 页面(web容器:httpd/nginx负载均衡 + apache server)<===> 日志采集服务器(nginx服务器) 通过某个页面跳转到我 ...
随机推荐
- 用var声明变量,在java中居然有这么多细节,你都了解么?
简介 Java SE 10引入了局部变量的类型推断.早先,所有的局部变量声明都要在左侧声明明确类型. 使用类型推断,一些显式类型可以替换为具有初始化值的局部变量保留类型var,这种作为局部变量类型 的 ...
- 如何设置远程MongoDB!
默认情况下V服务连接着本地mongoDB服务,如果想连接到其他mongoDB服务,请按如下设置: 方法一:通过控制台修改 进入控制台 http://x.x.x.x:xxxx/system/consol ...
- CI4框架应用二 - 项目目录
我们之前搭建好了CI4的开发环境,下面我们来看一下CI4的目录结构. Administrator@PC- MINGW64 /c/wamp64/www/ci4 $ ls -l total drwxr-x ...
- 013_go语言中的函数多返回值
代码演示 package main import "fmt" func vals() (int, int) { return 3, 7 } func main() { a, b : ...
- AI测温落地趋势:已成日常刚需 产品形态呈细分化发展
现如今不管走到哪儿,机场.车站.医院.商场.超市等公共场所都已经将体温检测作为常态化防疫手段.自全球疫情发生以来,不管欧洲.亚洲,还是中东.东南亚等国家都已经意识到,疫情防控的第一道关口便是测温. 而 ...
- 蓝奏云数值验证码识别,python调用虹鱼图灵识别插件,超高正确率
识别验证码一直是本人想要做的事情,一直在接触按键精灵,了解到有一个虹鱼图灵识别插件专门做验证码和图像识别,原理就是图片处理和制作字库识别,制作字库我一直觉得很麻烦,工程量太大.不管怎样,它能用能达到我 ...
- 20、Java 泛型
1.晓之以理,动之以码 学Java就是很上头哦,一来直接三连问!!! 什么是泛型?为什么要用泛型?泛型怎么用? 当然泛型在Java中有很重要的一个地位,在面向对象编程以及在各种设计模式中有非常广泛的应 ...
- JavaScript Number() 函数
JavaScript Number() 函数 JavaScript 全局对象 定义和用法 Number() 函数把对象的值转换为数字. 语法 Number(object) 参数 描述 object 必 ...
- Flutter 容器 (1) - Center
Center容器用来居中widget import 'package:flutter/material.dart'; class AuthList extends StatelessWidget { ...
- jieba分词的几种形式
1.精确模式:试图将句子最精确地分开,适合文本分析 seg_list = jieba.cut(test_text, cut_all=False) seg_list = " ".jo ...