高性能web服务器OpenResty的一些感谈,高性能webopenresty


前言:火云邪神语录:天下武功,无坚不破,唯快不破!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系统:

1apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make

Fedora 、RedHat 和 centos系统:

1 yum install readline-devel pcre-devel openssl-devel

下载OpenResty

1wget http://openresty.org/download/ngx_openresty-1.5.8.1.tar.gz.

解压、编译、安装:

1 2 3 4 5 tar xzvf ngx_openresty-1.5.8.1.tar.gz cd ngx_openresty-1.5.8.1/ ./configure --with-luajit make make install

另外的配置选项:

1 2 3 4 5 6 7 ./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 测试工具)。欢迎指出任何不公平的地方 :)

    ——【开源访谈】OpenResty 作者章亦春访谈实录  http://www.oschina.net/question/28_60461


相关内容

    暂无相关文章