Nginx 内嵌lua脚本,结合Redis使用
0x00 Nginx 内嵌Lua脚本有下面特点:
20k个并发连接
Lua脚本能够在Nignx 11个层次的不同层次发挥作用,扩展Ngnix功能
Lua速度极快(寄存器指令)
0x01 应用场景
在web server端做请求过滤处理(如:WAF、Anti CC等)
0x02 简单配置过程
測试环境Ubuntu Server 14.04.2 LTS
几个须要下载的模块(注意安装顺序和export路径问题)
LuaJIT-2.0.4(A Just-In-Time Compiler
for Lua)ngx_devel_kit( Nginx Development
Kit)echo-nginx-module( more
shell-style goodies to Nginx config file)lua-nginx-module(Embed
the Power of Lua into Nginx)
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):
加入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://www.byteway.net/thread-index-fid-4-tid-316.htm
Nginx 内嵌lua脚本,结合Redis使用的更多相关文章
- nginx插入lua脚本访问redis
目标:收集用户日志 流程: 浏览器端get方法将数据传到nginx服务 nginx收集到数据,执行内嵌lua脚本,访问redis,根据token获得用户id 将日志信息存入文件 1.nginx安装,参 ...
- 运维实践-最新Nginx二进制构建编译lua-nginx-module动态链接Lua脚本访问Redis数据库读取静态资源隐式展现
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 0x0n 前言 ...
- Lua脚本在Redis事务中的应用实践
使用过Redis事务的应该清楚,Redis事务实现是通过打包多条命令,单独的隔离操作,事务中的所有命令都会按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.事务中的命令要么全部 ...
- 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 ...
- Nginx 中利用 Lua 脚本做访问控制
使用场景 需要在后端服务之前做访问控制,或没有后端服务的场景,如静态文件. 实验环境 Ubuntu 14.04 Nginx 1.4.6 安装 Lua 运行环境 sudo apt-get install ...
- Lua脚本在redis分布式锁场景的运用
目录 锁和分布式锁 锁是什么? 为什么需要锁? Java中的锁 分布式锁 redis 如何实现加锁 锁超时 retry redis 如何释放锁 不该释放的锁 通过Lua脚本实现锁释放 用redis做分 ...
- 服务降级 托底预案 Nginx中使用Lua脚本检测CPU使用率,当达到阀值时开启限流,让用户排队
https://mp.weixin.qq.com/s/FZAcQQAKomGEe95kln1HCQ 在京东我们是如何做服务降级的 https://mp.weixin.qq.com/s/FZAcQQAK ...
- c#中用lua脚本执行redis命令
直接贴出代码,实现执行lua脚本的方法,用到的第三方类库是 StackExchange.Redis(nuget上有) 注:下面的代码是简化后的,实际使用要修改, using System; using ...
- Redis进阶之使用Lua脚本自定义Redis命令
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 1.在Redis ...
随机推荐
- Void运算符 与 undefined类型
void 运算符 对给定的表达式进行求值,然后返回 undefined. 何为求值,就是执行之后的表达式. 我们最常见的就是 <a href="javascript: void(0)& ...
- luogu P2107 小Z的AK计划
最近复习了一下堆,于是去luogu上找一些简单题写一写 贪心的想,小z不会到一半以后回头去Ak,因为这样从时间上想肯定是不优的,他可以早在之间经过时就AK所以我们可以将所有机房按照横坐标排序可以想到的 ...
- 图形管线之旅 Part4
原文:<A trip through the Graphics Pipeline 2011> 翻译:往昔之剑 转载请注明出处 欢迎回来.上个部分是关于vertex shader的, ...
- FastReport.Net使用:[28]数据合并
基础数据 1.拖动数据源中的数据列到报表设计器中,获得一张简单的报表. 2.下面使用两种方法将期中考试和期末考试的成绩合并到一行显示 合并数据(分组方法) 1.按学生名字和科目来进行分组,成绩文本框咱 ...
- wpf企业级开发中的几种常见业务场景
前阵子在公司弄个内部的进销存管理系统,从了解需求.系统设计到编码,大约耗费了两个月时间,后来公司有了其他的安排,这东西就算黄了.顺便吐槽一下,厂里的一些人说话真心不顾别人感受,邮件啥的没一句舒服的.不 ...
- BZOJ1004 HNOI Cards
第一次学习置换群这个东西. 这题需要利用Burnside定理. 即我们求出循环节为一(转完不变)的个数的平均数也就是等价类的个数. 定义:设G={a1,a2,…ag}是目标集[1,n]上的置换群.每个 ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- python开发_os.path
在python中,os.path模块在处理路径的时候非常有用 下面是我做的demo 运行效果: ========================================= 代码部分: ==== ...
- csv文件导入到mysql
如何将csv文件导入到mysql数据库呢,方法有很多但最简单粗暴的方法还是用sql语句啦,像下面这样. LOAD DATA LOCAL INFILE 'csv文件路径' INTO TABLE 数据表名 ...
- 关于图表第三方Charts的一些理解与总结
最近项目中用到了很多的图表,如柱状图,线状图,饼状图等等.接触到了一个新的第三方Charts,在做图方面确实非常强大,在使用了一段时间后,今天对他进行一个小的总结,也是自己的一点小理解. 关于char ...