前言:火云邪神语录:天下武功,无坚不破,唯快不破!Nginx的看家本领就是速度,Lua的拿手好戏亦是速度,这两者的结合在速度上无疑有基因上的优势。
最先将Nginx,Lua组合到一起的是OpenResty,它有一个ngx_lua模块,将Lua嵌入到了Nginx里面;随后Tengine也包含了ngx_lua模块。至于二者的区别:OpenResty是Nginx的Bundle;而Tengine则是Nginx的Fork。值得一提的是,OpenResty和Tengine均是国人自己创建的项目,前者主要由春哥和晓哲开发,后者主要由淘宝打理。
至于OpenResty和Tengine孰优孰劣,留给大家自己判断,如下资料可供参考:
- ngx_openresty: an Nginx ecosystem glued by Lua
- 淘宝网Nginx应用、定制与开发实战
推荐看看春哥在Tech-Club上关于『由Lua粘合的Nginx生态环境』的演讲实录,有料!
简介:OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。OpenResty不是Nginx的分支,它只是一个软件包。主要有章亦春维护。
开源官网:http://openresty.org/cn/index.html 开源代码托管git地址:https://github.com/agentzh/old-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的安装与配置
环境准备
$yum install -y gcc gcc-c++ readline-devel pcre-devel openssl-devel tcl perl
OpenResty允许开发人员使用lua编程语言构建现有的Nginx的C模块,支持高流量的应用程序。
依赖的软件包:
- perl 5.6.1+
- libreadline
- libpcre
- libssl
Debian 和 Ubuntu系统:
apt - get install libreadline - dev libncurses5 - dev libpcre3 - dev libssl - dev perl make
Fedora 、RedHat 和 centos系统:
yum install readline - devel pcre - devel openssl - devel
下载OpenResty
wget http : //openresty.org/download/ngx_openresty-1.5.8.1.tar.gz.
解压、编译、安装:
tar xzvf ngx_openresty - 1.5.8.1.tar.gz
cd ngx_openresty - 1.5.8.1 /
. / configure -- with - luajit
make
make install
另外的配置选项:
. / configure -- prefix = / opt / openresty
-- with - luajit
-- without - http_redis2_module
-- with - http_iconv_module
-- with - http_postgres_module
- j2
-- help to see more options
【附录】OpenResty、PHP-fpm与NodeJs操作MySQL的性能对比
agentzh:我刚才在对比测试大结果集查询时,发现NodeJS在使用 node-mysql库访问MySQL时,上下文切换次数居高不下,都快赶上 php-fpm + php-mysql了。但Node只起了一个进程,而且 strace 确认了确实是非阻塞的(不像 node-mysql-libmysqlclient 和 node-db-mysql 那样滥用 OS 线程池玩阻塞通信),很是奇怪
agentzh:貌似 node-mysql 的作者真不在乎性能?对于 100KB 的大结果集查询,并且命中 MySQL 查询缓存时,node-mysql + node-generic-pool 的性能是最差的,甚至不如 php-fpm + php-mysql. 我的 nodejs 脚本在这里:http://t.cn/zO9bEgl 哪位 NodeJS 专家帮我把把脉?使用的各组件都是当前的最新版本。
agentzh:对于单行的小结果集查询,node-mysql + node-generic-pool 相比 php-fpm + php-mysql 还是有性能优势的,rps 高了一倍的样子,绝对值也有差不多 1000 rps,但和 ngx_openresty 的组件相比,貌似还有些差距 下图中的测试数据仍然来自 Amazon EC2 Small 实例组成的测试集群。
agentzh:ngx_srcache + ngx_memc 这种缓存的效率看来还确实不错,比如 100KB mysql 大结果集查询在缓存命中时的情况添加进了下面这张图中(黄色曲线)。图中列出的其他所有东西,比如 lua, php, nodejs 都可以很方便地享受到 ngx_srcache 的缓存服务
agentzh:既然刚才给出了 100KB 大结果集的结果,那么不妨再 show 一下 ngx_srcache + ngx_memc 对于单行小结果集 mysql 查询在 4 台 memcached 节点组成的分布式缓存命中时的 rps 随并发度的变化。我们看到,只比 ngx_drizzle 略有提升,确实已经快到天花板了。
agentzh:测试代码都公开了:https://github.com/agentzh/mysql-driver-benchmark 测试数据使用的是 MySQL 官方提供的 World 样例数据库,同时测试环境是 Amazon EC2 Small 实例(1 台 web 机,4 台 mysql 机,1 台运行 weighttp 测试工具)。欢迎指出任何不公平的地方 :)