Nginx 内嵌lua脚本,结合Redis使用

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

时间: 2024-12-26 14:49:57

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

Nginx内嵌Lua脚本提高分布式缓存命中率

解决问题:负载均衡的时候,假如业务逻辑主机有四台(A,B,C,D),虽然配置ip_hash(ji),这只是实现同一个ip去请求一个上层业务服务器(可以解决session的问题),但是现在,如果要实现一个商品页面的缓存内容只缓存在一台服务器A (所有关于这个页面请求都丢给A服务器,BCD服务器没有关于这个页面的缓存内容),极大程度的节省了服务器的存储空间. 首先查看当前服务器的版本:nginx  -V (注:根据我的测试,可以增加 lua 模块的版本对也nginx的版本有要求,最低版本是:ngin

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

1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Redis下载地址:wget http://download.redis.io/releases/redis-2.8.6.tar.gz 2.安装依赖包 yum install -y gcc gcc-c++ readline-devel pcre-devel openssl-devel tcl perl

使用RedisTemplate+Lua脚本实现Redis分布式锁

分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁. 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性.在任意时刻,只有一个客户端能持有锁. 不会发生死锁.即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁. 具有容错性.只要大部分的Redis节点正常运行,客户端就可以加锁和解锁. 解铃还须系铃人.加锁和解锁必须是同

HTML 内嵌JS脚本

提供一个JS参考手册入口:http://www.w3school.com.cn/jsref/index.asp. JavaScript 最常用于图片操作.表单数据处理以及内容动态更新. <!DOCTYPE html> <html> <head>? <meta?charset="utf-8">? <title>菜鸟教程(runoob.com)</title>? </head> <body> &

Unity内嵌浏览器脚本

资源名称:Embedded Browser 资源大小: 117.4MB 资源版本: v1.0.2 资源类型: .unitypackage 安装要求:要求Unity 5.3.0或更高版本 官网地址:https://www.assetstore.unity3d.com/cn/#!/content/55459 网盘下载地址:链接: https://pan.baidu.com/s/1qXXMpoK 密码: fv95 资源说明: 本资源能够帮你渲染一个完全可交互的网页.通过本资源,你可以轻松加快你的库存管

《Redis设计与实现》学习笔记-Lua脚本

Redis从2.6开始支持Lua脚本,和事务的功能类似,可以通过Lua脚本原子的执行多个Redis命令.Redis提供了EVAL和EVALSHA命令执行lua脚本. 创建并修改Lua坏境 Redis在服务器内嵌了一个Lua坏境,并进行了一系列的修改,从而确保这个Lua坏境可以满足Redis服务器的需要,通过下列步骤创建并修改Lua坏境: 创建一个基础Lua坏境,通过调用Lua的C API函数lua_open. 载入多个函数库到Lua坏境中,让Lua脚本可以使用这些函数来进行数据操作.包括Lua核

Redis Lua 脚本使用

Lua语言提供了如下几种数据类型:booleans(布尔).numbers(数值).strings(字符串).tables(表格). 下面是一些 Lua 的示例,里面注释部分会讲解相关的作用: -- -- -- 拿客 -- 网站:www.coderknock.com -- QQ群:213732117 -- 三产 创建于 2017年06月15日 12:04:54. -- 描述: -- -- local strings website = "coderknock.com" print(we

redis翻译_redis lua脚本

Available since 2.6.0.  加入版本2.6 Time complexity: Depends on the script that is executed. 时间复杂度: 取决于脚本的执行 出处:http://blog.csdn.net/column/details/redisbanli.html Introduction to EVAL  介绍EVAL EVAL and EVALSHA are used to evaluate scripts using the Lua i

Redis(六)Lua脚本的支持

Redis为什么需要Lua脚本的支持 当应用需要Redis完成一些Redis命令不支持的特性时,要么扩展Redis client或者更甚至编写c扩展Redis server.这都大大造成了应用的实现的难度.在此基础上,Redis通过内置Lua解释器,Redis client可以发起执行Lua脚本,完成特殊的功能需求. Redis中使用Lua脚本 在Redis中可以通过使用eval和evalsha命令提供对执行Lua的支持. eval语法: EVAL script numkeys key [key