ngx lua

【Nginx之轨迹】Nginx + Lua 实现 waf Web 应用防火墙(解决 nignx 加载失败问题:LuaJIT version which is not OpenResty‘s) —— 目录 —— 1. Lua 和 ngx_lua_waf 简介 2. 前置问题 3. 安装和配置各模块 4. 配置 Nginx 5. 检验是否添加模块成功 6. 配置安全防火墙 7. 详细设置安全防火墙 1. Lua 和 ngx_lua_waf 简介 Lua 是一门轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua 的应用场景:游戏开发、独立应用脚本、Web 应用脚本、扩展和数据库插件如:MySQL Proxy 和 阅读详情

第一个lua脚本

ngx.say 是打印的打印输出的意思。。。

location /echo {
default_type text/plain;
echo hello lua;
}
location /lua {
default_type text/plain;
content_by_lua 'ngx.say("hello world")';
}

用lua脚本做nginx的访问的限制...

location @client{
proxy_pass  http://www.ruifengyun.com;
}
location ~  /test {
default_type  text/html;
content_by_lua 'ngx.say("this is  ruifengyun.com!")';
access_by_lua '
if ngx.var.remote_addr == "10.2.20.110" then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
if ngx.var.remote_addr == "10.2.20.112" then
ngx.exec("@client")
end
';
}

控制经过判断之后,才能访问

location / {
access_by_lua '
local res = ngx.location.capture("/auth")
if res.status == ngx.HTTP_OK then
return
end
if res.status == ngx.HTTP_FORBIDDEN then
ngx.exit(res.status)
end
ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
';
# proxy_pass/fastcgi_pass/postgres_pass/...
}

使用lua做nginx的rewrite跳转

这个是先判断 check-pam接口的return的内容是不是spam,是的话,转跳到其他的页面

location / {
rewrite_by_lua '
local res = ngx.location.capture("/check-spam")
if res.body == "spam" then
ngx.redirect("/terms-of-use.html")
end
'; fastcgi_pass ...;
}

根据ip做不同的响应

location / {
content_by_lua '
           myIP = ngx.req.get_headers()["X-Real-IP"]
           if myIP == nil then
               myIP = ngx.req.get_headers()["x_forwarded_for"]
           end
           if myIP == nil then
               myIP = ngx.var.remote_addr
           end
           if myIP == "" then
               ngx.exec("@client")
           else
               ngx.exec("@client_test")
           end
       ';
}

redirect的使用

return ngx.redirect("/foo")
return ngx.redirect("http://localhost:1984/foo", ngx.HTTP_MOVED_TEMPORARILY)
return ngx.redirect("/foo", 301)

返回302临时重定向 地址栏会显示跳转后的地址

rewrite ^ /foo? redirect;  # nginx config
return ngx.redirect('/foo');  -- lua code

lua过滤post过来的参数

location = /test {
content_by_lua '
ngx.req.read_body()
local args = ngx.req.get_post_args()
for key, val in pairs(args) do
if type(val) == "table" then
ngx.say(key, ": ", table.concat(val, ", "))
else
ngx.say(key, ": ", val)
end
end
';
}

一个Lua的例子:

#!/usr/bin/env lua
ngx.say('aaaaaa </br>')
local url = ngx.var.uri
ngx.say('<br>',url,'<br/>')
ngx.print('这次访问的header头是   ',ngx.req.raw_header())
ngx.print('<meta http-equiv="content-type" content="text/html;charset=utf-8">')
ngx.print('<h1> 这个是 h1 </h1>')
ngx.print('这次访问的是 get 还是 post 呀   ',ngx.req.get_Method())
local args = ngx.req.get_uri_args()
ngx.print(args)
local res = ngx.location.capture("/")
ngx.print('<br>http code <br>‘,res.status)

lua 调用mysql的例子

worker_processes  2;
error_log logs/error.log warn;
events {
worker_connections 1024;
}
http {
  upstream backend {
  drizzle_server 127.0.0.1:3306 protocol=mysql
  dbname=ngx_test user=ngx_test password=ngx_test;
  drizzle_keepalive max=10 overflow=ignore mode=single;
}
server {
  listen 8080;
  location @cats-by-name {
    set_unescape_uri $name $arg_name;
    set_quote_sql_str $name;
    drizzle_query 'select * from cats where name=$name';
    drizzle_pass backend;
    rds_json on;
 }
 location @cats-by-id {
  set_quote_sql_str $id $arg_id;
  drizzle_query 'select * from cats where id=$id';
  drizzle_pass backend;
  rds_json on;
 }
 location = /cats {
   access_by_lua '
   if ngx.var.arg_name then
   return ngx.exec("@cats-by-name")
   end
   if ngx.var.arg_id then
    return ngx.exec("@cats-by-id")
   end
';
  rds_json_ret 400 "expecting \"name\" or \"id\" query arguments";
 }
}
}

改改密码就能用啦~

lua获取url中的参数

location = /adder {
    set_by_lua $res "
            local a = tonumber(ngx.arg[1])
                local b = tonumber(ngx.arg[2])
                return a + b" $arg_a $arg_b;

        echo $res;
}

ngx.req.set_uri

nginx里面的配置是:

location /test {
       rewrite ^/test/(.*) /$1 break;
       proxy_pass http://my_backend;
   }

lua里面的配置是:

location /test {
       rewrite_by_lua '
           local uri = ngx.re.sub(ngx.var.uri, "^/test/(.*)", "$1", "o")
           ngx.req.set_uri(uri)
       ';
       proxy_pass http://my_backend;
   }

我想大家看这个对照,已经知道是啥意思了.

通过lua获取nginx的内置变量,通过这些变量做些逻辑的处理~

Nginx提供了很多内置的变量,如:

  • $arg_PARAMETER 这个变量包含在查询字符串时GET请求PARAMETER的值。
  • $args 这个变量等于请求行中的参数。
  • $binary_remote_addr 二进制码形式的客户端地址。
  • $body_bytes_sent 传送页面的字节数
  • $content_length 请求头中的Content-length字段。
  • $content_type 请求头中的Content-Type字段。
  • $cookie_COOKIE cookie COOKIE的值。
  • $document_root 当前请求在root指令中指定的值。
  • $document_uri 与$uri相同。
  • $host 请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称。
  • $is_args 如果$args设置,值为"?",否则为""。
  • $limit_rate 这个变量可以限制连接速率。
  • $nginx_version 当前运行的nginx版本号。
  • $query_string 与$args相同。
  • $remote_addr 客户端的IP地址。
  • $remote_port 客户端的端口。
  • $remote_user 已经经过Auth Basic Module验证的用户名。
  • $request_filename 当前连接请求的文件路径,由root或alias指令与URI请求生成。
  • $request_body 这个变量(0.7.58+)包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。
  • $request_body_file 客户端请求主体信息的临时文件名。
  • $request_completion 未知。
  • $request_method 这个变量是客户端请求的动作,通常为GET或POST。包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作。
  • $request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。
  • $scheme 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
  • $server_addr 服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。
  • $server_name 服务器名称。
  • $server_port 请求到达服务器的端口号。
  • $server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
  • $uri 请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。

另外: HTTP_X_FORWARDED_FOR是透过代理服务器取得客户端的真实IP地址,有些用此方法读取到的仍然是代理服务器的IP。还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用 HTTP_X_FORWARDED_FOR 取到的值将是空的。

Nginx第三篇 功能扩展OpenResty简单使用 OpenResty就是嵌入了LuaJIT VM的Nginx;LuaJIT即采用C语言写的Lua代码的解释器。通过 OpenResty,我们可以把 nginx 的各种功能进行自由拼接, 重要的是,开发门槛并不高,我们只需要熟悉简单灵巧的Lua 语言和nginx基础知识就可以上手开发简单功能了。 阅读详情

相关推荐

使用ngx_lua构建高并发应用(1)

一. 概述         Nginx是一个高性能,支持高并发的,轻量级的web服务器。目前,Apache依然web服务器中的老大,但是在全球前1000大的web服务器中,Nginx的份额为22.4%。Nginx采用模块化的架构,官方版本的Nginx中大部分功能都是通过模块方式提供的,比如Http模块、Mail模块等。通过开发模块扩展Nginx,可以将Nginx打造成一个全能的应用服务器,这样可

架构师专栏 5万+

ngx.print与ngx.say

--输出响应内容体;(内容体结束后没有换行符;) ngx.print("aaaaaaaaaaaaaa")--输出响应内容体;(内容体结束后,输出一个换行符;) ngx.say("aaaaaaaaaaaaaaa")

xiejunna的博客 1万+

ngx_lua模块

ngx_lua模块 ngx_lua模块的原理: 1、每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM; 2、将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问; 3、每个外部请求都由一个Lua协程处理,协程之间数据隔离; 4、Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker; 5、I/O等异步操作完成时还原相关协程上下文数据,并继续运行; 可以在nginx配置文件中加上目录:nginx.conf中server

hallyz的博客 1686

【2. Nginx高级知识】

复习 1、location 匹配规则:精准 --》普通 --》正则(非正则除外) 2、代理传参:proxy_pass = ip:port , 将整个 path 部分传入 tomcat ​ proxy_pass = ip:port/xxx , 只将匹配 path 的剩余部分传入 tomcat 3、rewrite 【break/last/redirect/permanent/null】 ​ 中断无 location/中断有location**/中断 302/中断 301/**不中断 location 4、r

努力学习 4278

在linux下安装ngx_lua模块,iconv模块

1.下载LUAJIT2.0,ngx_lua,nginx等文件,地址如下: LUAJIT2.0:http://luajit.org/download/LuaJIT-2.0.0.tar.gz ngx_lua:https://github.com/chaoslawful/lua-nginx-module/archive/master.zip nginx:http://nginx.org/dow

3601

基于UCD3138的数字控制硬开关全桥DC-DC电源设计实战解析

在开关电源设计中,数字控制技术正逐步取代传统模拟方案,以其卓越的灵活性、可编程性和强大的数据处理能力,成为应对复杂动态响应与智能化需求的关键。其核心原理在于通过高精度模数转换器(ADC)实时采样电压、电流信号,经由数字信号处理器(如ARM内核)运行PID等控制算法,动态调整数字脉宽调制(DPWM)输出,从而实现对功率级的精确控制。这种技术价值体现在能够轻松实现高级算法(如输入电压前馈、非线性补偿)、灵活配置保护参数,并通过PMBus等接口实现智能化监控与管理。其典型应用场景包括通信基站、服务器电源以及工业设

1313

Lua中实现签名验证脚本、lua利用ngx实现md5加密、lua-nginx-module模块里ngx_lua的所有指令以及可用ngx所有方法

nginx+lua做签名少不了进行md5操作 (publish:August 15, 2017 -Tuesday) ,lua本身要支持md5,需要安装md5支持,github地址:https://github.com/keplerproject/md5然后把md5.lua,core.so文件以及需要的string.lua文件(在md5.lua中有调用string和core)都放到目录/usr/share/lua/5.1 运行以下lua脚本。

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 1646

Docker 磁盘占用过多问题处理过程记录

Docker 磁盘爆满问题处理

MR.骑士道 3554

ngx lua API介绍

本节主要是带着大家简单的过一下常用的ngx_lua API。 一、nginx lua directives和api ngx_lua 有60多个指令(Directive),140多个API(截止到2019-3-26)。 官方lua文档: https://www.nginx.com/resources/wiki/modules/lua/ https://github.com/openres...

INGNIGHT的专栏 2710

PAM4信号测试实战:从眼图分析到误码率测量的技术演进

在高速数字系统设计中,信号完整性测试是确保数据传输可靠性的核心环节。其基本原理在于通过时域和频域分析,精确评估信号在传输过程中的质量衰减与失真。随着数据速率向56Gbps及以上演进,传统的NRZ编码面临带宽瓶颈,而PAM4调制技术通过在每个符号周期内承载更多比特信息,成为提升信道效率的关键路径。这项技术的工程价值在于,它允许在相同带宽下实现翻倍的数据吞吐量,这对于数据中心互联、PCIe 6.0及800G以太网等高速接口至关重要。然而,PAM4信号电平间距更小,对噪声和抖动极为敏感,导致其原始误码率显著升高,

weixin_42522817的博客 657

手把手教你用Three.js+Vue打造3D机房可视化系统(附完整代码)

本文详细介绍了如何使用Three.js与Vue 3构建企业级3D机房可视化系统。从技术选型、项目架构设计到3D场景构建、设备建模与渲染策略,提供了完整的开发方案和实战代码。重点讲解了如何实现设备状态实时监控、交互操作与性能优化,帮助开发者快速掌握3D可视化开发的核心技术。

ttt77的博客 317

ngx_lua 模块

ngx_lua模块的原理: 1、每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;2、将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;3、每个外部请求都由一个Lua协程处理,协程之间数据隔离;4、Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;5、

liyouzhi666的博客 454

基于C++和Qt开发IEC104规约主站调试软件(第二章)

本章节主要讲解iec104主站软件界面设计和从站的连接功能以及部分功能代码的展示。

半青年的博客 860

ngx_lua

在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。Nginx的高性能是大家公认的,而Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高;如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把好的瑞士军刀;目前Nginx团队也开始意识到这个问题,开发了nginxSc...

github_zwl的博客 480

Python的单元测试之unittest

是一个功能类似 unittest 的库,它集合众家标准测试库之所长,和 unittest 相比,功能更为强大,使用更为简单,OpenStack 广泛的利用它编写单元测试。unittest 提供了自动匹配发现并执行测试用例的功能,随着项目代码结构越发庞大,势必有多个测试文件,自动匹配发现并测试用例的功能在此就显得非常有用,只要满足。unittest 提供了丰富的命令行入口,可以根据需要执行某些特定的用例。的测试用例都会被 unittest 发现并执行,测试用例文件的默认匹配规则为 test*.py。

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 283

RK3568移植AP6256

本文主要是记录RK3568移植正基的AP6256的WIFIBT模块,感兴趣的朋友可以一起学习!!!提示:以下是本篇文章正文内容,下面案例可供参考。

qq_24093081的博客 3715

openresty ngx_lua执行阶段

openresty ngx_lua执行阶段

weixin_43931625的博客 1309

硬件工程师的破局之路:为何你才是考取软考高级架构师的“天选之子”?

硬件工程师如何转型系统架构师:独特优势与实战路径 文章揭示了硬件工程师在考取系统架构设计师证书时的独特优势。作者指出,硬件工程师的全局思维、接口设计能力和可靠性经验正是系统架构的核心要素。通过将硬件经验升维为架构思维(从引脚到接口、从单板到系统、从实现到权衡),硬件背景反而成为竞争优势。文章建议通过知识补全、建立架构决策日志和术语转换练习来备考,并强调硬件工程师在软硬协同时代的独特价值——既能统领硬件设计,又能为软件搭建最佳舞台。文末鼓励硬件工程师以更高视野看待职业发展,将系统架构师认证视为水到渠成的职业升

云轩阁 534

openresty ngx_lua重定向

openresty ngx_lua重定向

weixin_43931625的博客 2579

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ngx_lua模块API 浅析

ngx_lua模块API说明 #Ngx 配置 指令 lua_code_cache on | off; 作用:打开或关闭 Lua 代码缓存,影响以下指令: set_by_lua_file , content_by_lua_file, rewrite_by_lua_file, access_by_lua_file 及强制加载或者reload Lua 模块等.缓存开启时修改LUA代码需要重

吴长空的技术随笔 3124

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

17173 Ngx_Lua使用分享

仅针对"set_by_lua_file, content_by_lua_file, rewrite_by_lua_file, and access_by_lua_file"有效, 因为其他为写在配置文件。另外,ngx_set_misc(设置md5、encode_base64等) 模块的指令,还有 ngx_lua 模块的 set_by_lua 指令和 rewrite_by_lua 指令也在此阶段。同时在lua代码中使用"dofile" 或 "loadfie" 来加载外部lua脚步。

分享技术架构、运维、程序开发经验 1036

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

为什么要使用ngx_lua

一. 概述         Nginx是一个高性能,支持高并发的,轻量级的web服务器。目前,Apache依然web服务器中的老大,但是在全球前1000大的web服务器 中,Nginx的份额为22.4%。Nginx采用模块化的架构,官方版本的Nginx中大部分功能都是通过模块方式提供的,比如Http模块、Mail 模块等。通过开发模块扩展Nginx,可以将Nginx打造成一个全能的应用服务器

terry7的博客 2559
上一篇: https server
下一篇: nginx lua
Dablekai
博客等级 码龄15年 2粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值