0x00 Nginx 内嵌Lua脚本有下面特点:

  • 20k个并发连接

  • Lua脚本能够在Nignx 11个层次的不同层次发挥作用,扩展Ngnix功能

  • Lua速度极快(寄存器指令)

0x01 应用场景

  • 在web server端做请求过滤处理(如:WAF、Anti CC等)

0x02 简单配置过程

  1. 測试环境Ubuntu Server 14.04.2 LTS

  2. 几个须要下载的模块(注意安装顺序和export路径问题)

0x03 可能存在的问题。找不到 lua.h 等,是由于luaJIT的lib和inc没有配置在环境变量中

须要这样配置(你实际的本地路径):

export LUAJIT_LIB=/usr/lib/lua

export LUAJIT_INC=/usr/local/include/luajit-2.0

cp /usr/local/include/luajit-<VERSION>/* /usr/local/include/

假设有无法启动的情况。service 能够查看 tail /var/log/syslog  查看错误

假设是nginx无法启动能够查看 tail /var/cache/nginx/error.log

假设已经生成nginx bin文件 能够用 nginx -V 来查看 配置文件是否正确

假设缺少一下模块:

PCRE

sudo apt-get install libpcre3 libpcre3-dev

zlib

sudo apt-get install zlib1g-dev

openssl

sudo apt-get install libssl-dev

ps:特别说明的是。请注意下Nginx的版本号不要下载最新的,可能不支持上面那些模块接口,我用的是Nginx 1.7.4

当中0x02的安装步骤都有安装说明,这里就不细说了

0x04 安装完后

改动nginx.conf文件 (默认路径 /etc/nginx/nginx.conf):

  1. 加入lua代码

又一次load nginx 配置

sudo /etc/nginx/sbin/nginx -s reload

效果:

2.  加入lua 文件:

加入两个lua_package_path,lua_code_cache(为了不保留lua cache,方便调试。实际项目中须要打开)

总体的lua文件的文件夹(注意lua文件夹中的文件是接下来新建的):

/etc/nginx/lua/hello.lua

/etc/nginx/lua/hello_redis.lua

/etc/nginx/lua/redis.lua

nginx.conf 文件加入:

hello.lua文件内容:

ngx.header.content_type = "text/plain";

ngx.say("say hello from hello.lua");

全部加入的location代码:

然后又一次load nginx 看效果。

3.使用redis(第三条新加的redis):

前提是机器上已有redis-server, Ubuntu上安装是 sudo apt-get install redis-server

hello_redis.lua 内容:

local redis = require "redis"

local cache = redis.new()

local ok, err = cache.connect(cache, '127.0.0.1', '6379')

cache:set_timeout(60000)

if not ok then

ngx.say("failed to connect:", err)

return

end

res, err = cache:set("hello", "redis in nginx_inline_lua")

if not ok then

ngx.say("failed to set hello: ", err)

return

end

ngx.say("set result: ", res)

local res, err = cache:get("hello")

if not res then

ngx.say("failed to get hello: ", err)

return

end

if res == ngx.null then

ngx.say("hello not found.")

return

end

ngx.say("hello: ", res)

local ok, err = cache:close()

if not ok then

ngx.say("failed to close:", err)

return

end

效果:

0x05 如今为止,简单的一个在Nginx 中内嵌Lua而且操作Redis的过程已经完毕了,在配置时候可能有非常多细小的问题。可是不要放弃,坚持下去。相信你就会成功。

0xFF 附加资料:

http://wiki.nginx.org/HttpLuaModule

http://openresty.org/ (最先完毕Nginx内嵌Lua的Chinese)

http://tengine.taobao.org/

转载请注明出处(个人论坛):http://www.byteway.net/thread-index-fid-4-tid-316.htm

Nginx 内嵌lua脚本,结合Redis使用的更多相关文章

  1. nginx插入lua脚本访问redis

    目标:收集用户日志 流程: 浏览器端get方法将数据传到nginx服务 nginx收集到数据,执行内嵌lua脚本,访问redis,根据token获得用户id 将日志信息存入文件 1.nginx安装,参 ...

  2. 运维实践-最新Nginx二进制构建编译lua-nginx-module动态链接Lua脚本访问Redis数据库读取静态资源隐式展现

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 0x0n 前言 ...

  3. Lua脚本在Redis事务中的应用实践

    使用过Redis事务的应该清楚,Redis事务实现是通过打包多条命令,单独的隔离操作,事务中的所有命令都会按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.事务中的命令要么全部 ...

  4. CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

    1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...

  5. Nginx 中利用 Lua 脚本做访问控制

    使用场景 需要在后端服务之前做访问控制,或没有后端服务的场景,如静态文件. 实验环境 Ubuntu 14.04 Nginx 1.4.6 安装 Lua 运行环境 sudo apt-get install ...

  6. Lua脚本在redis分布式锁场景的运用

    目录 锁和分布式锁 锁是什么? 为什么需要锁? Java中的锁 分布式锁 redis 如何实现加锁 锁超时 retry redis 如何释放锁 不该释放的锁 通过Lua脚本实现锁释放 用redis做分 ...

  7. 服务降级 托底预案 Nginx中使用Lua脚本检测CPU使用率,当达到阀值时开启限流,让用户排队

    https://mp.weixin.qq.com/s/FZAcQQAKomGEe95kln1HCQ 在京东我们是如何做服务降级的 https://mp.weixin.qq.com/s/FZAcQQAK ...

  8. c#中用lua脚本执行redis命令

    直接贴出代码,实现执行lua脚本的方法,用到的第三方类库是 StackExchange.Redis(nuget上有) 注:下面的代码是简化后的,实际使用要修改, using System; using ...

  9. Redis进阶之使用Lua脚本自定义Redis命令

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 1.在Redis ...

随机推荐

  1. Mybatis使用入门

    一.Mybatis简介 1.传统JDBC的不足 我们首先看一下JDBC的一般操作流程.比如,我想从user表中获取根据name获取数据,下面是传统JDBC代码: package lkb.webchat ...

  2. python笔记六:进程与线程

    1.进程 1)调用unix/linux系统中的进程函数fork(),用法和linux相同,调用成功返回0,失败返回-1: import os print 'Process (%s) start...' ...

  3. 【Python初级】StringIO和BytesIO读写操作的小思考

    from io import StringIO; f = StringIO(); f.write('Hello World'); s = f.readline(); print s; 上面这种方法“无 ...

  4. 为什么23种设计模式里面没有MVC?

    作者:lorio链接:https://www.zhihu.com/question/27738109/answer/100241918来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  5. Web应用安全审计工具WATOBO

    Web应用安全审计工具WATOBO   WATOBO是一款Web应用程序安全测试工具.该工具使用代理方式,对Web会话数据进行审计.它是一款半自动化工具,可以自动对请求和响应进行分析,找出潜在漏洞信息 ...

  6. 【BZOJ 2669】 2669: [cqoi2012]局部极小值 (状压DP+容斥原理)

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 667  Solved: 350 Description 有一 ...

  7. [SDOI2017]数字表格 --- 套路反演

    [SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...

  8. [转]Android中的android:layout_width和android:width

      android:width 其实是定义控件上面的文本(TextView) 的宽度,当然这个宽度也是和 android:layout_width 配合起来作用的,如果 android:layout_ ...

  9. 2015 百度之星 1001 超级赛亚ACMer 贪心

    超级赛亚ACMer Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acdream.info/problem?pid=1750 Descrip ...

  10. C和指针

    1.#if  ...   #endif   之间的程序段就可以有效地从程序中去除,不管中间有没有注释 2.环境:两种环境不比位于同一台机器上 1.翻译环境:源代码被转换为可执行的机器指令 2.执行环境 ...