server {
$listen 80;
server_name test.jinbo.com;
set $c 666;
location /foo {
set $a 12;
set $b '';
rewrite_by_lua_block {
ngx.var.b = tonumber(ngx.var.a) + 12;
content_by_lua_block {
ngx.say("b = ", ngx.var.b);
ngx.say("c =", ngx.var.c);
location / {
echo $args;
echo $a;
echo $b;
echo $c;
#结果如下:
curl 'http://test.jinbo.com/foo'
b = 24
c =666
curl 'http://test.jinbo.com?abc=def'
abc=def
从上边的例子可以看出如何定义ngx.var变量;也能发现ngx.var的作用域范围:
ngx.var.c 这个变量,作用域范围为所有的location,即贯穿所有的请求;
ngx.var.a 与 ngx.var.b, 作用域范围为 “location /foo”。
需在ngx_lua 模块上下文定义使用, 变量作用域属于单个location,如下例子:
location /test_ctx {
rewrite_by_lua_block {
ngx.ctx.foo = 660
access_by_lua_block {
ngx.ctx.test = 6
ngx.ctx.foo = ngx.ctx.foo + ngx.ctx.test
content_by_lua_block {
ngx.ctx.result = ngx.ctx.foo
ngx.say(ngx.ctx.result)
#结果如下:
curl 'http://test.qunar.com/test_ctx'
从上边的例子看出 ngx.ctx变量在整个location lua 模块内“动态创建变量”;
也说明仅能在当前的请求内共享变量。
ngx.var 是获取 Nginx 的变量,需要经历字符串 hash、hash 表查找等过程
ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ctx_ref)
使用 ngx.ctx 比 ngx.var 往往是更好的选择
作者:tokers
链接:https://www.zhihu.com/question/43196128/answer/173513231
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
环境: init_worker_by_lua, set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua, ngx.timer., balancer_by_lua
这个 Lua 表可以用来存储基于请求的 Lua 环境数据,其生存周期与当前请求相同 (类似 Nginx 变量)。
参考下面例子,
location /test {
rewrite_by_lua_block {
ngx.ctx.foo = 76
http {
log_format log_req_resp '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_byte
在 OpenResty 的体系中,可以通过共享内存的方式完成不同工作进程的数据共享,可以通过
Lua 模块方式完成单个进程内不同请求的数据共享。如何完成单个请求内不同阶段的数据共
享呢?最典型的例子,估计就是在 log 阶段记录一些请求的特殊变量。
ngx.ctx 表就是为了解决这类问题而设计的。参考下面例子:
location /test {
rewrite_by_lua_block {
ngx...
ngx.var 是获取 Nginx 的变量,类型是字符串或nil,需要经历字符串 hash、hash 表查找等过程。
ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ctx_ref)。
使用 ngx.ctx 比 ngx.var 往往是更好的选择。
nginx变量使用方法详解(7):http://www.ttlsa.com/nginx/nginx-var-7/
nginx的ngx.var ngx.ctx ngx.req: https..
内置变量存放在 ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的。总而言之,这些变量代表着客户端请求头的内容,例如$http_user_agent, $http_cookie, 等等。下面是nginx支持的一些内置变量:
$arg_name
请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name
$args
生命周期和请求一致
每个请求的ngx.ctx是相互独立的,包括ngx.location.capture的子请求
内部跳转(Internal redirection)如ngx.exec会销毁ngx.ctx,重建新的.
ngx.ctx的属性查找代价相对昂贵,所以尽量使用显式的函数参数.
syntax: ngx.var.VAR_NAME
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*,
header_filter_by_lua*, body_filter_by_lua*, log_by_lua*
读或者写 Nginx 变量值:
ngx_core_commands : 核心指令集变量
ngx_core_module_ctx : 核心模块上下文变量ngx_core_module : 核心模块变量ngx_show_help : 无符号整型, 标记是否
一:常用功能优化:
1:网络连接的优化:
只能在events模块设置,用于防止在同一一个时刻只有一个请求的情况下,出现多个睡眠进程会被唤醒但只能有一个进程可获得请求的尴尬,如果不优化,在多进程的nginx会影响以部分性能。
events {
accept_mutex on; #优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被同时唤醒,默认为off,因此...
ngx.arg[1] 脚本参数
ngx.var['arg_a'] 取queryString的参数a #/nginx_var?a=hello,world
ngx.say(...) 依次输出参数,带换行
ngx.print(...) 格式化输出,不带换行
ngx.var.name