通过Lua扩展Nginx

作者: 右耳菌 | 来源:发表于2022-07-27 23:23 被阅读0次

1. Nginx的简介

相关内容,可以查看 【Nginx 负载均衡】,这是我之前的一篇文章,这里就懒得再说明一次了。


2. ngx_lua模块

Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用C开发模块必须要熟悉Nginx的源代码,使得开发者对其望而生畏。

ngx_lua模块通过将lua解释器集成进Nginx,可以采用lua脚本实现业务逻辑。
该模块具备以下特性:

  1. 高并发、非阻塞的处理各种请求。
  2. Lua内建协程,这样就可以很好的将异步回调转换成顺序调用的形式。
  3. 每个协程都有一个独立的全局环境(变量空间),继承于全局共享的、只读的“commandata”。

得益于Lua协程的支持,ngx_lua在处理10000个并发请求时只需要很少的内存。根据测试,ngx_lua处理每个请求只需要2KB的内存,如果使用LuaJIT则会更少。

ngx_lua非常适合用于实现可扩展的、高并发的服务


3. 协程(Coroutine)

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

  1. 协程并非os线程,所以创建、切换开销比线程相对要小。
  2. 协程与线程一样有自己的栈、局部变量等,但是协程的栈是在用户进程空间模拟的,所以创建、切换开销很小。
  3. 多线程程序是多个线程并发执行,也就是说在一瞬间有多个控制流在执行。而协程强调的是一种多个协程间协作的关系,只有当一个协程主动放弃执行权,另一个协程才能获得执行权,所以在某一瞬间,多个协程间只有一个在运行。
  4. 由于多个协程时只有一个在运行,所以对于临界区的访问不需要加锁,而多线程的情况则必须加锁。
  5. 多线程程序由于有多个控制流,所以程序的行为不可控,而多个协程的执行是由开发者定义的所以是可控的。

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请求处理



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响应内容的;

输出:

$ curl http://127.0.0.1/
$ Hello, world
  • 例子2
例子2
  • 例子3 - 传参
例子3
  • 例子4 - 结合redis
例子4 - 1 例子4 - 2

如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

相关文章

  • 通过Lua扩展Nginx

    1. Nginx的简介 相关内容,可以查看 【Nginx 负载均衡[https://www.jianshu.com...

  • Prometheus监控Nginx

    环境 系统:CentOS 7.5 准备 Nginx添加Lua扩展 Nginx端 下载lua脚本地址:https:/...

  • Ngxin与lua(十一)

    Lua lua是一个简洁,轻量,可扩展的脚本语言.nginx与lua的优势:充分的结合Nginx的并发处理epol...

  • [深] nginx与lua的开发(28)

    获取全套nginx教程,请访问瓦力博客 lua是一个简洁、轻量、可扩展的脚本语言。nginx+lua开发充分的结合...

  • 基于Nginx&Lua 和Netflix Eureka的

    Zuul for Nginx&Lua 基于Nginx和Lua module。需要安装Nginx Lua模块或者直接...

  • [Lua语法]

    1.Lua的特性 (1)可扩展性:Lua很容易和其他语言进行交互,很容易通过库扩展功能 (2)小巧,精简:Lua的...

  • Nginx添加Lua扩展

    环境 系统:CentOS 7.5 准备 安装Nginx 编译安装LuaJIT 下载地址:http://luajit...

  • API网关——Kong实践分享

    概述 01 什么是Kong Kong是一个在Nginx中运行的Lua应用程序,可以通过lua-nginx模块实现,...

  • Nginx安装lua-nginx-module

    使用lua可以为nginx扩展出强大的能力,比如频率限制,访问redis等,本文介绍一下如何安装模块lua-ngi...

  • API 网关 Kong 实战

    1.Kong 介绍 Kong 是一款基于 OpenResty(Nginx + Lua 模块)编写的高可用、易扩展的...

网友评论

    本文标题:通过Lua扩展Nginx

    本文链接:https://www.haomeiwen.com/subject/nnltwrtx.html