前言:火云邪神语录:天下武功,无坚不破,唯快不破!Nginx的看家本领就是速度,Lua的拿手好戏亦是速度,这两者的结合在速度上无疑有基因上的优势。
最先将Nginx,Lua组合到一起的是OpenResty ,它有一个ngx_lua 模块,将Lua嵌入到了Nginx里面;随后Tengine 也包含了ngx_lua模块。至于二者的区别:OpenResty是Nginx的Bundle;而Tengine则是Nginx的Fork。值得一提的是,OpenResty和Tengine均是国人自己创建的项目,前者主要由春哥 和晓哲 开发,后者主要由淘宝打理。
至于OpenResty和Tengine孰优孰劣,留给大家自己判断,如下资料可供参考:
推荐看看春哥在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 测试工具)。欢迎指出任何不公平的地方 :)