配置NGINX的ACCESS LOG

默认情况下,access log放在: …\nginx\logs目录下,文件名为:access.log,默认格式为预配置格式:combined

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

http { 
...
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
access_log  logs/access.log  main;
} 

这块内容地下可以对格式和日志文件路径、文件名进行修改,建议根据项目特性修改文件名,特别是需要在日志文件中打印敏感信息进行用户行为分析时,避免外部用户轻易捉去日志文件,导致信息泄露。

log_format中运行配置的常见变量注释如下:

$remote_addr, $http_x_forwarded_for 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。

通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_addr拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加$http_x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址;

除了这些变量,实际上整个http请求的字段信息都可以获取得到的,例如$http_user_agent, $http_cookie。
这里可以查看所有可支持的变量:
http://nginx.org/en/docs/http/ngx_http_core_module.html#variables

另外还可以打开ngx_http_userid_module,打开之后就可以通过$uid_got或者$uid获取唯一识别后的用户设备。
Syntax: userid on | v1 | log | off;
Default:
userid off;
Context: http, server, location
具体教程可以访问:http://nginx.org/en/docs/http/ngx_http_userid_module.html#var_uid_got

这些信息对于系统的PV和UV计算已经足够了的,设置大部分用户的行为都可以通过这些变量获取得到。

扩展阅读,可以了解一下怎么读取cookie中的某个变量值的方法:
1. 提取整个的Cookies内容到一个变量,然后可以在需要时引用,比如记录到日志里面

if ( $http_cookie ~* "(.*)$") {
set $all_cookie $1;
}
  1. 提取指定的一个cookie的值,然后根据需要使用,比如赋值给X-Real-Ip,
   set $uid "-";
        if ( $http_cookie ~* "uid=(\S+)(;.*|$)"){
            set $uid $1; 
        }
        set $member_id '-';
        if ( $http_cookie ~* "select_area_name=(\S+)(;.*|$)" ) {
            set $member_id $1;
        }
  1. 在proxy/fcgi等场景给Cookies增加内容,比如告诉后端你是那一台front。
proxy_set_header Cookie "$http_cookie; node_id=018"

这里增加了名为node_id的一个cookie进去,当然,就这个例子来说,也可以这样传递前端的ID给backend:

proxy_set_header X-CDN-ID "018";

后端通过$_SERVER[‘HTTP_X_CDN_ID’]就可以获取到赋值。

你可能感兴趣的:(nginx)