各位大神:
小弟在学习nginx-lua的过程中遇到一个小问题,调试了快一个月还是没找出解决办法,请教各路大神,望大神在空闲时能够帮小弟我解答一下疑问。情况如下:
我在使用nginx-1.10.1搭lua-nginx-module-0.10.5的一套系统。
nginx.conf如下:
events {
}
worker_rlimit_nofile 30000;
error_log logs/error.log error;
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#server_tokens off;
#etag off;
keepalive_timeout 30;
client_body_timeout 10s;
client_body_buffer_size 2M;
proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=cache:100m;
server {
listen 8087;
server_name localhost;
location / {
limit_rate 1000k;
rewrite_by_lua_block {
ngx.header["xxxxx"] = "xxxx"
}
slice 100k;
proxy_cache cache;
proxy_cache_valid 200 206 60m;
proxy_cache_key $uri$is_args$args$slice_range;
#proxy_cache_key $uri$is_args$args;
proxy_set_header Range $slice_range;
body_filter_by_lua_block {
ngx.log(ngx.ERR, "1")
}
}
}
}
通过修改配置文件,可以使访问变得正常:
1、通过把limit_rate降到比较低的速率(例如100k)就可以正常访问,限速速率越快,出现停下来的现象就越快。
2、通过把body_filter_by_lua_block 注释掉,无论速率是多少都不会出现问题。
3、把slice功能关闭也不会出现问题。
通过添加日志打印调试发现,在limit-rate、slice和bodyfilter_by_lua_block全部开启的情况下,ngx_http_lua_body_filter这个函数会在一次body_filter循环中跑两次,而且proxy_slice会出现ctx->last等于0的情况,如下图:
![]()
ngx_http_output_filter函数是body_filter的唯一入口,然后bodyfilter链也是不断的next执行的,从上图可以看到,ngx_http_output_filter是在ngx_http_upstream_output_filter这个函数执行的,也就是在pipe里面的p->output_filter执行,而且明显只执行了一次。但是在执行一次ngx_http_output_filter的情况下,ngx_http_lua_body_filter和ngx_http_write_filter这两个filter模块被执行了两次,然而,ngx_http_slice_body_filter缺只执行了一次(上面打印两次,其实是同一次进入该函数,然后再ctx == NULL || r != r->main那里return了)。这就非常奇怪,不仅仅不经过ngx_http_output_filter入口进入了bodyfilter链,而且不是从链的头开始执行的。
把bodyfilter_by_lua_block注释后,日志显示会比较“正常”,如下图:
![]()
我是用最新的OpenResty包的,也是会出现这样的问题
小弟不才,百思不得其解,望各路大神求教~谢谢!
祝大家生活愉快,合家安康!