ngx_lua

1.OpenResty究竟解决了什么痛点

2.Location路由

3.OpenResty请求处理机制

4.缓存

2011年的时候章亦春老师LuaJIT VM 嵌入到 Nginx 中,实现了 OpenResty 这个高性能服务端解决方案。

https://openresty.org/cn/

性能接近c model,甚至超过

Node.js—开创性 异步非阻塞(用回调回调次数多会出问题)

Python—python3.4加入异步的东西,3.5引入协程,

Golang异步协程出去,需要在线热调试,

SystemTap

Bass—后端即服务。

ps. 协程和多线程下的线程类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是和其他协程程序共享全局变量等信息。线程和协程的主要不同在于:多处理器的情况下,概念上来说多线程是同时运行多个线程,而协程是通过代码来完成协程的切换,任何时刻只有一个协程程序在运行。并且这个在运行的协程只有明确被要求挂起时才会被挂起。

Lua 来控制 Nginx 的行为,用C++去做控制,要自己实现协程,但是在 OpenResty 里面,它像 Golang 一样天生就有协程。OpenResty 所有的参数和行为都可以在程序里面动态的去做,完全不用重启和reload,因为它是基于 Nginx 之上的,性能非常高。

一个worker 在可能出现阻塞的地方会注册一个事件就放过去了(epoll模型),而不是干巴巴的等待阻塞被处理完

location :

语法规则

location [ = | ~ | ~* | ^~ ] uri { ... }

location @name { ... }

修饰符

= 表示精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中

~ 表示该规则是使用正则定义的,区分大小写。

~* 表示该规则是使用正则定义的,不区分大小写。

^~ 表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找

匹配优先级

(1). 优先尝试 全匹配( 也就是前缀 =)

(2). 尝试 路径匹配 ( 也就是前缀 ^~

(3). 尝试 正则匹配 ( 也就是前缀 ~* 或者 ~

(4). 字符串匹配 (也就是前缀为空)

所以,前缀的优先级概括为: = > ^~ > ~, ~* > 空 全匹配 > 路径匹配 > 正则匹配 > 字符串匹配

使用正则定义的location在配置文件中出现的顺序很重要

使用精确匹配可以提高查找的速度

ngx处理一个请求的流程

1post-read                                           7access                             

2server-rewrite                                   8 post-access

3find-config                                         9try-files

4rewrite                                               10content

5post-rewrite                                       11log

6preaccess

http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html#02-NginxDirectiveExecOrder01

缓存

shared_dict 字典缓存

lua-resty-lrucache(常用)

lua-resty-lrucache是每个worker占用一个。有get\set\delete操作。

API不完整

压测:ab -n 100000 -c 100 -k http://127.0.0.1:81/get_value

省去较昂贵的序列化操作

FFI允许lua调用C。可以参考安装目录下的resty目录(openresty/lualib/resty)实现的Rand函数实现,其实是用c的。

2.增加第三方模块

2.1.查找:例如:搜索resty http

2.2.添加模块:将下载的第三方库文件放在resty目录(openresty/lualib/resty)中

2.3.调用模块:如前面调用json库一样使用即可

Openresty引入lua实现的一个比较强的一个功能就是和后端mysqlredis 等数据库的连接更直接。减少了中间其他动态语言再去处理的过程,可以通过nginx直接返回或修改数据,也便于实现API

OpenResty虽然为了提高性能更多的是使用的内存数据库(redis),但是特殊的时候也会存在需要操作数据库的时候.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章