zoukankan      html  css  js  c++  java
  • Openresty与Tengine

    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指令执行顺序:

     
     
     
     
  • 相关阅读:
    fastjson报错 java.lang.StackOverflowError
    关于mybatis使用foreach插入速度较慢的问题
    selectKey返回查询的LAST_INSERT_ID的总是1
    使用java制作https证书
    cf 809
    多校 2009 3
    多校 2009 2
    多校 2009 1
    codeforces 808
    hdu 4734 数位DP
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/11810658.html
Copyright © 2011-2022 走看看