魏长东

weichangdong

正在查看: lua 分类下的文章(第 4 页 / 共 34 篇)

lua学习-高级篇

Nginx Lua模块指令

Nginx共11个处理阶段,而相应的处理阶段是可以做插入式处理,即可插拔式架构;另外指令可以在http、server、server if、location、location if几个范围进行配置:

指令

所处处理阶段

使用范围

解释

init_by_lua

init_by_lua_file

loading-config

http

nginx Master进程加载配置时执行;

通常用于初始化全局配置/预加载Lua模块

init_worker_by_lua

init_worker_by_lua_file

starting-worker

http

每个Nginx Worker进程启动时调用的计时器,如果Master进程不允许则只会在init_by_lua之后调用;

通常用于定时拉取配置/数据,或者后端服务的健康检查

set_by_lua

set_by_lua_file

rewrite

server,server if,location,location if

设置nginx变量,可以实现复杂的赋值逻辑;此处是阻塞的,Lua代码要做到非常快;

rewrite_by_lua

rewrite_by_lua_file

rewrite tail

http,server,location,location if

rrewrite阶段处理,可以实现复杂的转发/重定向逻辑;

access_by_lua

access_by_lua_file

access tail

http,server,location,location if

请求访问阶段处理,用于访问控制

content_by_lua

content_by_lua_file

content

location,location if

内容处理器,接收请求处理并输出响应

header_filter_by_lua

header_filter_by_lua_file

output-header-filter

http,server,location,location if

设置header和cookie

body_filter_by_lua

body_filter_by_lua_file

output-body-filter

http,server,location,location if

对响应数据进行过滤,比如截断、替换。

log_by_lua

log_by_lua_file

log

http,server,location,location if

log阶段处理,比如记录访问量/统计平均响应时间

 

更详细的解释请参考http://wiki.nginx.org/HttpLuaModule#Directives。如上指令很多并不常用,因此我们只拿其中的一部分做演示。

»»阅读全文

lua学习-3

Nginx全局内存

使用过如Java的朋友可能知道如Ehcache等这种进程内本地缓存,Nginx是一个Master进程多个Worker进程的工作方式,因此我们可能需要在多个Worker进程中共享数据,那么此时就可以使用ngx.shared.DICT来实现全局内存共享。更多API请参考http://wiki.nginx.org/HttpLuaModule#ngx.shared.DICT。 

1、首先在nginx.conf的http部分分配内存大小

http {
    include       mime.types;
    default_type  application/octet-stream;

    lua_package_path "lualib/?.lua;;";  #lua 模块  
    lua_package_cpath "lualib/?.so;;";  #c模块
    lua_shared_dict shared_data 1m; 
	lua_code_cache off;
...........................................【省略】
location /test6{
		default_type "text/html";  
		content_by_lua_file html/test6.lua; 
	}

代码test6.lua

--1、获取全局共享内存变量  
local shared_data = ngx.shared.shared_data  
  
--2、获取字典值  
local i = shared_data:get("i")  
if not i then  
    i = 1  
    --3、惰性赋值  
    shared_data:set("i", i)  
    ngx.say("lazy set i ", i, "<br/>")  
end  
--递增  
i = shared_data:incr("i", 1)  
ngx.say("i=", i, "<br/>") 

访问的时候 第一次是输出

lazy set i 1
i=2

第二次访问输出

i=3

每次刷新都加1

这个功能,做ip的访问次数限制 应该挺好,不用借助redis了。

lua学习-2

nginx配置

location /test3{
		lua_code_cache off;
		default_type "text/html";  
		content_by_lua_file html/test3.lua; 
	}

	location /test4{
		lua_code_cache off;
		default_type "text/html";  
		content_by_lua_file html/test4.lua; 
	}
	location /test5{
		lua_code_cache off;
		default_type "text/html";  
		content_by_lua_file html/test5.lua; 
	}

代码:

»»阅读全文

lua学习-1

我的环境用的是 win的openresty。(文章内容来自 http://jinnianshilongnian.iteye.com/blog/)

HelloWorld 的代码

首先配置nginx

location /hello {
            default_type 'text/html';  
	    lua_code_cache off;
	    content_by_lua 'ngx.say("hello world")';
        }

	location /test1 {
            default_type 'text/html';  
	    lua_code_cache off;
	content_by_lua_file  html/test1.lua;
        }
	location ~ /test2/(\d+)/(\d+) { 
	lua_code_cache off;
	    #设置nginx变量  
	    set $a $1;   
	    set $b $host;  
	    default_type "text/html";  
	    #nginx内容处理  
	    content_by_lua_file html/test2.lua;  
	    #内容体处理完成后调用  
	    echo_after_body "ngx.var.b $b";  
	} 

»»阅读全文