Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝、搜狗等互联网企业。Tengine是社区合作的成果,我们欢迎大家参与其中,贡献自己的力量。
Tengine完全兼容Nginx,因此可以参照Nginx的方式来配置Tengine。
Nginx的架构和扩展性:
一个主进程和多个工作进程,工作进程以非特权用户运行;
支持的事件机制:kqueue(FreeBSD 4.1+)、epoll(Linux 2.6+)、rt signals(Linux 2.2.19+)、/dev/poll(Solaris 7 11/99+)、event ports(Solaris 10)、select以及poll;
众多支持的kqueue特性包括EV_CLEAR、EV_DISABLE(临时禁止事件)、NOTE_LOWAT、EV_EOF,可用数据的数量,错误代码;
支持sendfile(FreeBSD 3.1+, Linux 2.2+, Mac OS X 10.5+)、sendfile64(Linux 2.4.21+)和sendfilev(Solaris 8 7/01+);
文件AIO(FreeBSD 4.3+, Linux 2.6.22+);
DIRECTIO (FreeBSD 4.4+, Linux 2.4+, Solaris 2.6+, Mac OS X);
支持Accept-filters(FreeBSD 4.1+, NetBSD 5.0+)和 TCP_DEFER_ACCEPT(Linux 2.4+);
10000个非活跃的HTTP keep-alive连接仅占用约2.5M内存;
尽可能避免数据拷贝操作。
Tengine继承Nginx-1.8.1的所有特性,兼容Nginx的配置;
Tengine特性详解:
1、动态模块加载(DSO)支持。加入一个模块不再需要重新编译整个Tengine;
这个模块主要是用来运行时动态加载模块,而不用每次都要重新编译Tengine.
如果你想要编译官方模块为动态模块,你需要在configure的时候加上类似这样的指令(--with-http_xxx_module),./configure --help可以看到更多的细节.
如果只想要安装官方模块为动态模块(不安装Nginx),那么就只需要configure之后,执行 make dso_install命令.
动态加载模块的个数限制为128个.
如果已经加载的动态模块有修改,那么必须重起Tengine才会生效.
只支持HTTP模块.
模块 在Linux/FreeeBSD/MacOS下测试成功.
样例:http://tengine.taobao.org/document_cn/dso_cn.html
2、支持HTTP/2协议,HTTP/2模块替代SPDY模块;
Tengine对SPDY模块增加SPDY/3协议的支持。
样例:http://tengine.taobao.org/document_cn/ngx_http_spdy_module_cn.html
3、流式上传到HTTP后端服务器或FastCGI服务器,大量减少机器的I/O压力;
相关语法:client_body_postpone_size
当打开proxy_request_buffering或fastcgi_request_buffering指令,
设置不缓存请求body到磁盘时,tengine每当接受到大于client_body_postpone_size大小的数据或者整个请求都发送完毕,
才会往后端发送数据。这可以减少与后端服务器建立的连接数,并减少网络IO的次数。
4、更加强大的负载均衡能力,包括一致性hash模块、会话保持模块,还可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线,以及动态解析upstream中出现的域名;
一致性hash模块:
这个模块提供一致性hash作为负载均衡算法。
该模块通过使用客户端信息(如:$ip, $uri, $args等变量)作为参数,使用一致性hash算法将客户端映射到后端机器
如果后端机器宕机,这请求会被迁移到其他机器
server id 字段,如果配置id字段,则使用id字段作为server标识,否则使用server ip和端口作为server标识,
使用id字段可以手动设置server的标识,比如一台机器的ip或者端口变化,id仍然可以表示这台机器。使用id字段
可以减低增减服务器时hash的波动。
server weight 字段,作为server权重,对应虚拟节点数目
具体算法,将每个server虚拟成n个节点,均匀分布到hash环上,每次请求,根据配置的参数计算出一个hash值,在hash环
上查找离这个hash最近的虚拟节点,对应的server作为该次请求的后端机器。
该模块可以根据配置参数采取不同的方式将请求均匀映射到后端机器,比如:
consistent_hash $remote_addr:可以根据客户端ip映射
consistent_hash $request_uri: 根据客户端请求的uri映射
consistent_hash $args:根据客户端携带的参数进行映射
样例:http://tengine.taobao.org/document_cn/http_upstream_consistent_hash_cn.html
网友评论