# 这种请求一般不缓存
add_header Expires “Fri, 01 Jan 1980 00:00:00 GMT”;
add_header Pragma “no-cache”;
add_header Cache-Control “no-cache, max-age=0, must-revalidate”;
# 一般独立记录日志的请求,都会返回一张 1×1 的空白gif图
empty_gif;
}
}
利用这个特性,我们甚至可以合并多个记录为1个http请求,在 ngx_lua 内再将多条记录拆分记录到日志文件
比如上例,我门可以添加一个字段 n 来标识有几条记录,并且给 q 之类的参数编号 q_1 .. q_n 。
# GET /1.gif?n=2&q_1=a&q_2=b&ie=gbk&oe=utf8&ref=
# 其他代码不变,只修改 1.gif 的 access_by_lua 为以下代码
local n = ngx.var.arg_n
if n then
n = tonumber(n)
if n > 0 then
local logs = {}
local prefix = string.format(‘/i-log?ie=%s&oe=%s&ref=%s&q=’, ngx.var.arg_ie, ngx.var.arg_oe, ngx.var.arg_ref)
while n >= 1 do
– 这里可以对 q_n 做进一步的校验,看是否需要记录下来
table.insert(logs, {prefix .. (ngx.var['arg_q_' .. n] or ”)})
n = n – 1
end
– 见
ngx.location.capture_multi(logs)
end
end
如果请求量较大,一把需要添加写buffer,
方式为在每条 access_log 后面添加 buffer=32k 这样的设置(见)
缓存的大小可以设置成 可以忍受丢失的记录数*每条记录的size
至此,各种记录功能都完成啦。
日志服务其他必要的功能,就是日志轮转了。
nginx 日志轮转的原理是
# 启动nginx收日志
# 启用cron任务
## 将日志文件move走 (文件名可以带上时间戳)
## 给 nginx master 进程发送 USR1 信号(nginx就会重新打开新的日志文件)
### 否则,日志会仍然记录到之前的日志文件中,虽然被 move 了
## cron 的频度可以根据日志大小调整,尽可能大些,能以天为单位就不要以半天为单位