Lua在Nginx的应用(lua+nginx)
nanshan 2024-10-22 12:58 20 浏览 0 评论
首发于公众号 后端搬运工《Lua在Nginx的应用》
当 Nginx 标准模块和配置不能灵活地适应系统要求时,就可以考虑使用 Lua 扩展和定制 Nginx 服务。OpenResty 集成了大量精良的 Lua 库、第三方模块,可以方便地搭建能够处理超高并发、扩展性极高的 Web 服务,所以这里选择 OpenResty 提供的 lua-nginx-module 方案。
安装Lua环境
lua-nginx-module 依赖于 LuaJIT 和 ngx_devel_kit。LuaJIT 需要安装,ngx_devel_kit 只需下载源码包,在 Nginx 编译时指定 ngx_devel_kit 目录。
系统依赖库
首先确保系统已安装如下依赖库。
|
安装LuaJIT
首先,安装 LuaJIT 环境,如下所示:
|
设置 LuaJIT 有关的环境变量。
|
下载相关模块
下载 ngx_devel_kit 源码包,如下:
|
接下来,下载 Lua 模块 lua-nginx-module 源码包,为 Nginx 编译作准备。
|
加载Lua模块
Nginx 1.9 版本后可以动态加载模块,但这里由于版本太低只能重新编译安装 Nginx。下载 Nginx 源码包并解压:
|
编译并重新安装 Nginx:
|
配置Nginx环境
现在只需配置 Nginx,即可嵌入 Lua 脚本。首先,在 http 部分配置 Lua 模块和第三方库路径:
|
接着,配置一个 Lua 脚本服务:
|
测试安装和配置是否正常:
|
Lua调用Nginx
lua-nginx-module 模块中已经为 Lua 提供了丰富的 Nginx 调用 API,每个 API 都有各自的作用环境,详细描述见 Nginx API for Lua。这里只列举基本 API 的使用 。
先配一个 Lua 脚本服务,配置文件如下:
|
请求部分
- ngx.var
可以通过ngx.var.var_name形式获取或设置 Nginx 变量值,例如 request_uri、host、request 等。
|
- ngx.req.get_headers()
该方法会以表的形式返回当前请求的头信息。查看请求的头信息:
|
当然,通过 ngx.req.set_header() 也可以设置头信息。
|
- ngx.req.get_uri_args()
该方法以表形式返回当前请求的所有 GET 参数。查看请求 query 为?name=fhb的 GET 参数:
|
同样,可以通过 ngx.req.set_uri_args() 设置请求的所有 GET 参数。
|
- get_post_args()
该方法以表形式返回当前请求的所有 POST 参数,POST 数据必须是 application/x-www-form-urlencoded 类型。查看请求curl --data 'name=fhb' localhost/lua_api的 POST 参数:
|
通过 ngx.req.get_body_data() 方法可以获取未解析的请求 body 体内容字符串。
- ngx.req.get_method()
获取请求的大写字母形式的请求方式,通过 ngx.req.set_method() 可以设置请求方式。例如:
|
响应部分
- ngx.header
通过ngx.header.header_name的形式获取或设置响应头信息。如下:
|
- ngx.print()
ngx.print() 方法会填充指定内容到响应 body 中。如下所示:
|
- ngx.say()
如上述使用,ngx.say() 方法同 ngx.print() 方法,只是会在后追加一个换行符。
- ngx.exit()
以某个状态码返回响应内容,状态码常量对应关系见 HTTP status constants 部分,也支持数字形式的状态码。
|
- ngx.redirect()
重定向当前请求到新的 url,响应状态码可选列表为 301、302(默认)、303、307。
|
其他
- ngx.re.match
该方法提供了正则表达式匹配方法。请求?name=fhb&age=24匹配 GET 参数中的数字:
|
- ngx.log()
通过该方法可以将内容写入 Nginx 日志文件,日志文件级别需同 log 级别一致。
- ngx.md5() | ngx.encode_base64() | ngx.decode_base64()
它们都是字符串编码方式。ngx.md5() 可以对字符串进行 md5 加密处理,而 ngx.encode_base64() 是对字符串 base64 编码, ngx.decode_base64() 为 base64 解码。
Nginx中嵌入Lua
上面讲述了怎么在 Lua 中调用 Nginx 的 API 来扩展或定制 Nginx 的功能,那么编写好的 Lua 脚本怎么在 Nginx 中得到执行呢?其实,Nginx 是通过模块指令形式在其 11 个处理阶段做插入式处理,指令覆盖 http、server、server if、location、location if 这几个范围。
模块指令列表
这里只列举基本的 Lua 模块指令,更多信息参考 Directives 部分。
指令 | 所在阶段 | 使用范围 | 说明 |
init_by_lua | 加载配置文件 | http | 可以用于初始化全局配置 |
set_by_lua | rewrite | server | 复杂逻辑的变量赋值,注意是阻塞的 |
rewrite_by_lua | rewrite | http | 实现复杂逻辑的转发或重定向 |
content_by_lua | content | location | 处理请求并输出响应 |
header_filter_by_lua | 响应头信息过滤 | http | 设置响应头信息 |
body_filter_by_lua | 输出过滤 | http | 对输出进行过滤或修改 |
使用指令
注意到,每个指令都会有*_lua和*_lua_file两个指令,*_lua指令后为 Lua 代码块,而*_lua_file指令后为 Lua 脚本文件路径。下面将只对*_lua指令进行说明。
- init_by_lua
该指令会在 Nginx 的 Master 进程加载配置时执行,所以可以完成 Lua 模块初始化工作,Worker 进程同样会继承这些。
nginx.conf配置文件中的 http 部分添加如下代码:
|
init.lua初始化脚本为:
|
- set_by_lua
我们直接使用 set 指令很难实现很复杂的变量赋值逻辑,而 set_by_lua 模块指令就可以解决这个问题。
nginx.conf配置文件 location 部分内容为:
|
set.lua脚本内容为:
|
上述赋值逻辑,请求 query 为?a=10&b=2时响应内容为 12。
- rewrite_by_lua
可以实现内部 URL 重写或者外部重定向。nginx.conf配置如下:
|
rewrite.lua脚本内容:
|
- access_by_lua
用于访问权限控制。例如,只允许带有身份标识用户访问,nginx.conf配置为:
|
access.lua脚本内容为:
|
- content_by_lua
该指令在 Lua 调用 Nginx 部分已经使用过了,用于输出响应内容。
案例
访问权限控制
使用 Lua 模块对本站的 ES 服务做受信操作控制,即非受信 IP 只能查询操作。nginx.conf配置如下:
|
访问频率控制
在 Nginx 配置文件的 location 部分配置 Lua 脚本基本参数,并配置 Lua 模块指令:
|
Lua 脚本实现频率控制逻辑,使用 Redis 对单位时间内的访问次数做缓存,key 为访问 uri 拼接 token 后的 md5 值。具体内容如下:
|
相关推荐
- 0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)
-
文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...
- ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes
-
为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...
- 生产环境starrocks 3.1存算一体集群部署
-
集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...
- 在CentOS上添加swap虚拟内存并设置优先级
-
现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...
- 国产深度(deepin)操作系统优化指南
-
1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...
- postgresql-15.4 多节点主从(读写分离)
-
1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...
- Docker 容器 Java 服务内存与 GC 优化实施方案
-
一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...
- 虚拟内存设置、解决linux内存不够问题
-
虚拟内存设置(解决linux内存不够情况)背景介绍 Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...
- Elasticsearch性能调优(5):服务器配置选择
-
在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...
- Es如何落地
-
一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...
- 针对Linux内存管理知识学习总结
-
现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...
- MySQL进阶之性能优化
-
概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...
- Linux Cgroups(Control Groups)原理
-
LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...
- linux 常用性能优化参数及理解
-
1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...
- 如何在 Linux 中使用 Sysctl 命令?
-
sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)