通过Lua扩展Nginx

程序员 2024-9-15 12:53:24 56 0 来自 中国
1. Nginx的简介

相干内容,可以查看 【Nginx 负载平衡】,这是我之前的一篇文章,这里就懒得再分析一次了。
2. ngx_lua模块

Nginx模块须要用C开发,而且必须符合一系列复杂的规则,最告急的用C开发模块必须要认识Nginx的源代码,使得开发者对其望而生畏。
ngx_lua模块通过将lua表明器集成进Nginx,可以接纳lua脚本实现业务逻辑。
该模块具备以下特性:

  • 高并发、非壅闭的处理处罚各种哀求。
  • Lua内建协程,如许就可以很好的将异步回调转换成次序调用的情势。
  • 每个协程都有一个独立的全局情况(变量空间),继承于全局共享的、只读的“commandata”。
得益于Lua协程的支持,ngx_lua在处理处罚10000个并发哀求时只须要很少的内存。根据测试,ngx_lua处理处罚每个哀求只须要2KB的内存,如果使用LuaJIT则会更少。
ngx_lua非常适适用于实现可扩展的、高并发的服务
3. 协程(Coroutine)

协程类似一种多线程,与多线程的区别有:

  • 协程并非os线程,以是创建、切换开销比线程相对要小。
  • 协程与线程一样有自己的栈、局部变量等,但是协程的栈是在用户进程空间模拟的,以是创建、切换开销很小。
  • 多线程步调是多个线程并发实行,也就是说在一刹时有多个控制流在实行。而协程夸大的是一种多个协程间协作的关系,只有当一个协程自动放弃实行权,另一个协程才华得到实行权,以是在某一刹时,多个协程间只有一个在运行。
  • 由于多个协程时只有一个在运行,以是对于临界区的访问不须要加锁,而多线程的情况则必须加锁。
  • 多线程步调由于有多个控制流,以是步调的活动不可控,而多个协程的实行是由开发者界说的以是是可控的。
Nginx的每个Worker进程都是在epoll或kqueue如许的变乱模子之上,封装成协程,每个哀求都有一个协程举行处理处罚。这恰好与Lua内建协程的模子是同等的,以是即使ngx_lua须要实行Lua,相对C有一定的开销,但依然能包管高并发能力。
4. Nginx进程模子

Nginx接纳多进程模子,单Master—多Worker,Master进程重要用来管理Worker进程。
Worker进程接纳单线程、非壅闭的变乱模子(Event Loop,变乱循环)来实现端口的监听及客户端哀求的处理处罚和相应,同时Worker还要处理处罚来自Master的信号。Woker进程个数一样寻常设置为呆板CPU核数。
Master进程详细包罗如下4个重要功能:
(1) 吸收来自外界的信号。
(2) 向各worker进程发送信号。
(3) 监控woker进程的运行状态。
(4) 当woker进程退出后((非常情况下),会自动重新启动新的woker进程。
5. HTTP哀求处理处罚

2.png
3.png 6. ngx_lua指令

ngx_lua属于nginx的一部门,它的实行指令都包罗在nginx的11个步调之中了,相应的处理处罚阶段可以做插入式处理处罚,即可插拔式架构,不外ngx_lua并不是全部阶段都会运行的;另外指令可以在http、server、server if、location、location if几个范围举行设置:
7. OpenResty


  • 点击查看官网
  • 概念:
    OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建可以或许处理处罚超高并发、扩展性极高的动态Web应用、Web服务和动态网关。
  • 工作原理:
    OpenResty通过汇聚各种计划精良的Nginx模块(重要由OpenResty团队自主开发),从而将Nginx有效地变成一个强盛的通用Web应用平台。如许,Web开发职员和体系工程师可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,快速构造出足以胜任10K以致1000K以上单机并发毗连的高性能Web应用体系。
  • 目的:
    OpenResty的目的是让你的Web服务直接跑在Nginx服务内部,充实使用Nginx的非壅闭I/O模子,不但仅对HTTP客户端哀求,以致于对远程后端诸如MySQL、PostgreSQL、Memcached 以及Redis等都举行同等的高性能相应。
8. ngx_lua 实例

content_by_lua:内容处理处罚器,吸收哀求处理处罚并输出相应。
该指令工作在Nginx处理处罚流程的content阶段,即内容产生阶段,是全部哀求处理处罚阶段中最为告急的阶段,由于这个阶段的指令通常是用来天生HTTP相应内容的;

6.png 输出:
$ curl http://127.0.0.1/$ Hello, world

  • 例子2
7.png

  • 例子3 - 传参


  • 例子4 - 结合redis
11.png 如果以为有劳绩就点个赞吧,更多知识,请点击关注查看我的主页信息哦~
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 16:48, Processed in 0.220711 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表