Tengine官方网站:http://tengine.taobao.org/index_cn.html

OpenResty官方网站:http://openresty.org/

Openresty和Tengine基于 Nginx 的两个衍生版本,某种意义上他们都和淘宝有关系,前者是前淘宝工程师章亦春主导开发的,后者是淘宝的一个开源项目

Openresty的最大特点是引入了ngx_lua模块,支持使用lua开发插件

Tengine的特点是融入了因淘宝自身的一些业务带来的新功能

OpenResty:

Nginx 是俄罗斯人发明的,Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中,实现了 OpenResty 这个高性能服务端解决方案

通过 OpenResty,你可以把 nginx 的各种功能进行自由拼接, 更重要的是,开发门槛并不高,这一切都是用强大轻巧的 Lua 语言来操控。

它主要的使用场景主要是:

在 Lua 中揉和和处理各种不同的 nginx 上游输出(Proxy,Postgres,Redis,Memcached 等)
在请求真正到达上游服务之前,Lua 可以随心所欲的做复杂的访问控制和安全检测
随心所欲的操控响应头里面的信息
从外部存储服务(比如 Redis,Memcached,MySQL,Postgres)中获取后端信息,并用这些信息来实时选择哪一个后端来完成业务访问
在内容 handler 中随意编写复杂的 Web 应用,使用 同步但依然非阻塞 的方式,访问后端数据库和其他存储
在 rewrite 阶段,通过 Lua 完成非常复杂的 URL dispatch
用 Lua 可以为 nginx 子请求和任意 location,实现高级缓存机制

OpenResty又被称为ngx_openresty,是基于Nginx的核心Web应用程序服务器。

OpenResty是基于Nginx和Lua的高性能Web平台,OpenResty通过汇聚各种设计精良的Nginx模块,从而将Nginx有效地变成一个强大的通用Web应用平台。

OpenResty的目标是让Web服务直接运行在Nginx服务内部,充分利用Nginx的非堵塞I/O模型,不仅对HTTP客户端请求,甚至对远程后端DB都进行一系列的高性能响应。

OpenResty借助于Nginx的事件驱动模型和非堵塞IO,以实现高性能的Web应用程序。

OpenResty使我们可以借助于Nginx的异步非阻塞达到使用Lua异步并发访问后端DB等服务。

OpenResty使用ngx.location.capture_multi极大地减少浏览器的HTTP连接数量,可以异步并发的访问后台接口。

  • OpenResty运行原理

Nginx采用的是master-worker模型,也就是一个master进程管理多个worker进程,基本的时间处理都放在worker进程中,master进程负责全局初始化以及对worker进行的管理。

OpenResty中,每个worker进程使用一个LuaVM,当请求被分配到worker时,将在这个LuaVM中创建一个coroutine协程,协程之间数据隔离,每个协程都具有独立的全局变量。

OpenResty工作原理
  • OpenResty处理请求流程

Nginx会把一个请求分成不同阶段,第三方模块可以根据自己的行为,挂在到不同阶段中以达到自身目的。OpenResty采用了同样的特性,不同阶段有着不同的处理行为。

Nginx

Nginx特点

  • 轻量级的Web服务,比Apache占用更少内存及资源
  • 抗并发Nginx处理请求,异步非阻塞。
  • 高度模块化设计

Nginx设计为主进程和多个工作进程的工作模式,每个进程是单线程来处理多个连接,每个工作进程采用了非阻塞I/O来处理多个连接,从而减少线程上下文切换,从而实现高性能、高并发。因此,生产环境中会通过将CPU绑定给Nginx工作进程,从而提升性能。

Nginx架构

Nginx采用多进程模式,对于每个worker进程都是独立的,因此不需要加锁,所以节省了锁带来的性能开销。采用独立的进程的好处在于worker进程之间相互不会影响,当一个进程退出后,其他进程依然工作,以保证服务不会终端。

Nginx采用异步非堵塞的方式去处理请求,异步非堵塞就是当一个线程调用出现阻塞而等待时,其他线程可以去处理其他任务。

ngx_lua

ngx_lua是将Lua嵌入Nginx,让Nginx执行Lua脚本,并且高并发、非阻塞的处理各种请求。Lua内建协程,可以很好的将异步回调转换成顺序调用的形式。ngx_lua在Lua中进行的IO操作都会委托给Nginx的事件模型,从而实现非阻塞调用。开发者可以采用串行的方式编写程序,ngx_lua会自动的在进行阻塞的IO操作中终端,保存上下文,然后将IO操作委托给Nginx事件处理机制,在IO操作完成后,ngx_lua会恢复上下文,程序继续执行,这些操作都是对用户程序透明的。

每个Nginx的worker进程持有一个Lua解释器或LuaJIT实例,倍这个worker处理的所有请求共享这个实例。每个请求的context上下文会被Lua轻量级的协程分隔,从而保证各个请求时独立的。

ngx_lua采用的`one-cor

ngx_lua模块的原理

  • 每个工作进程worker创建一个Lua虚拟机(LuaVM),工作进程worker内部协议共享VM。
    -每个Nginx I/O原语封装后注入Lua虚拟机,并允许Lua代码直接访问。
  • 每个外部请求都由一个Lua协程处理,协程之间数据隔离。
  • Lua代码调用I/O操作等异步时,会挂起当前协程,而不阻塞工作机进程。
  • I/O等异步操作完成时,还原相关协程相关协议的上下文,并继续运行。

ngx_lua指令

Nginx与Lua编写脚本的基本构建块是指令,指令用于指定何时运行用户Lua代码以及如何使用结果。

ngx_lua指令执行顺序:

 
 
 
 

Openresty与Tengine的更多相关文章

  1. Openresty 与 Tengine

    Openresty 与 Tengine Openresty和Tengine基于 Nginx 的两个衍生版本,某种意义上他们都和淘宝有关系,前者是前淘宝工程师agentzh主导开发的,后者是淘宝的一个开 ...

  2. (转)OpenResty(nginx+lua) 开发入门

    原文:https://blog.csdn.net/enweitech/article/details/78519398 OpenResty 官网:http://openresty.org/  Open ...

  3. nginx 与 lua 开发环境搭建

    首先下载最新版的 相关软件 的安装文件. nginx: http://nginx.org/en/download.html LuaJIT: http://luajit.org/download.htm ...

  4. Nginx Resource

    Nginx中URL转换成小写首先编译安装nginx_lua_module模块server节: location / { if($uri ~ [A-Z]){ rewrite_by_lua 'return ...

  5. nginx学习笔记——http module分析

         源码:nginx 1.12.0           nginx由于其高性能.扩充性好等特点在迅速走红,越来越多的公司采用nginx作web服务器.负载均衡.waf等 工作,一些基于nginx ...

  6. nginx源码分析——http模块

         源码:nginx 1.12.0      一.nginx http模块简介           由于nginx的性能优势,现在已经有越来越多的单位.个人采用nginx或者openresty. ...

  7. Nginx与Lua

    http://www.cnblogs.com/xd502djj/archive/2012/11/20/2779598.html 今天安装lua试试,这个从开始装的,发现一篇文字,字数虽少,但是却讲的很 ...

  8. Open Source

    资源来源于http://www.cnblogs.com/Leo_wl/category/246424.html RabbitMQ 安装与使用 摘要: RabbitMQ 安装与使用 前言 吃多了拉就是队 ...

  9. NAXSI means Nginx Anti XSS & SQL Injection. NAXSI is an open-source, high performance, low rules maintenance WAF for NGINX

    nbs-system/naxsi: NAXSI is an open-source, high performance, low rules maintenance WAF for NGINXhttp ...

随机推荐

  1. php + h5 实现socket推送技术

    在socket出现之前已经有ajax定时请求.长轮询等方案,但都不能满足需求,socket就应用而生了. socket基本函数socket 总结下常用的socket函数 服务端: socket_cre ...

  2. linux使用useradd创建的用户没有目录的解决办法

    转载请注明来源https://www.cnblogs.com/sogeisetsu/p/11401562.html或https://blog.csdn.net/suyues/article/detai ...

  3. 201671030102陈飞 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 课程学习目标 1.掌握软件项目评审会议流程 ...

  4. php的快速排序

    <?php     function quicksort($str){         if(count($str)<=1) return $str;//如果个数不大于一,直接返回     ...

  5. 基于 Keil MDK 移植 RT-Thread Nano

    后文rtt代表RT-Thread 在官网公众号中,看到rtt发布了rtt nano,这个就很轻量级的rtos内核,把多余的驱动都裁剪了,因此移植工作量小,可以哪来学习一番,体验rtt之美 rtt现在也 ...

  6. hdu3974-Assign the task-(dfs+线段树)

    题意:有n个人,有上下级关系,有m个操作,有两种操作1.把一个任务分给某个人,他的下属也会停下手中工作和他一起做:2.查询某个人的当前任务是什么? 解题:n-1个关系,总有一个人没有上级,以他为根节点 ...

  7. HUSTOJ 有序表的最小和

    一次奇怪的AC经历...上周被这道题卡了3天... 传送门:http://oj.gdsyzx.edu.cn/problem.php?id=1475 题目描述 给出两个长度为n的有序表A和B,在A和B中 ...

  8. C# 按行读取文件 从某行开始取

    ; FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); u ...

  9. kafka设计要点之高吞吐量

    2345678910111213141516 /** * Delete this log segment from the filesystem. * * @throws KafkaStorageEx ...

  10. SDOI 2014 向量集

    [SDOI2014]向量集 题目描述 维护一个向量集合,在线支持以下操作: - "A x y (|x|,|y| < =10^8)":加入向量(x,y); - " Q ...