用nginx访问日志记录mysql数据库中的用户id

nginx有很强大的日志功能,可是在缺省状态下,它只能记录用户的IP地址以及浏览器信息。若是咱们有用户登陆注册系统,在用户已登陆的状况下,想记录访问某一个网页的究竟是哪个用户,怎么办呢?由于咱们不仅想知道究竟是哪个IP地址访问了哪个网页,而且还想知道究竟是哪个登陆用户访问了哪个网页,这对于咱们往后有针对性地向他/她推荐信息甚至推送广告都是很是有用的。php

nginx缺省的日志格式

127.0.0.1 - - [20/Jul/2017:22:04:08 +0800] "GET /news/index HTTP/1.1" 200 22262 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.66 Safari/537.36"

在这里,咱们看到,虽然用户已经登陆,可是日志里没有任何与用户相关的信息,只有ip地址。若是咱们想记录用户的id等信息,怎么办呢?前端

在PHP端输出特殊的header

咱们想到,既然用户已登陆了,则它确定有cookie或者session或者token信息,不论是哪一种方式,咱们的php必定是能够有效地获取到这个用户的信息的。在这里举例咱们经过session获取到了用户的id信息:mysql

$user_id = Yii::$app->session['user_id'];
if (empty($user_id)) {
    header('X-UID: 0');
} else {
    header('X-UID: ' . $user_id);
}

若是session里没有用户id,则说明用户尚未登陆,则输出X-UID: 0(或者也能够干脆什么也不输出)。若是获取到了session,说明用户已登陆,则咱们把他的user_id输出给nginx: X-UID: 12345这样的形式。nginx

在这里,你不止能够输出一个信息,你能够输出好几个不一样的字段,包括他的姓名、性别、年龄等等均可以。sql

建立一种新的日志格式

log_format只能被存储在http段里,因此咱们须要找到nginx.conf文件。数据库

nginx缺省的日志格式第二部分就是用户信息,但一般什么也没有,只是一个-,这里咱们它改形成咱们从后端传进来的header信息。由上文咱们创造的特殊headerX-UID,这里须要先作一个小的转换,把大写字母所有改成小写,把全部的-改成下划线,就变成了x_uid,而后在前面拼接上$upstream_http_,就获得了最终的结果$upstream_http_x_uid,而后把它插入到日志格式任何你想让它出现的地方:后端

log_format front '$remote_addr - $upstream_http_x_uid [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

在server里引用这种日志格式

server相关的设置里,由于咱们上面给日志格式起名为front,因此在这里咱们引用它时,须要指明用front日志格式:浏览器

access_log /var/log/nginx/front-access.log front;

新的日志结果

127.0.0.1 - 52248 [20/Jul/2017:22:35:40 +0800] "GET /news/view?id=56 HTTP/1.1" 200 19455 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.66 Safari/537.36"

注意上面第2个数字52248,这就是咱们登陆用户的我的ID。我这里的例子比较简单,若是你不嫌麻烦,甚至能够把登陆用户的全部我的信息,包括手机号、邮箱所有打印在日志里,就看你是否顾虑安全问题了。安全

对用户隐藏id

在上面的第一步,咱们用php输出了一个特殊header,原本咱们这个header只是供nginx消费用的,可是这个header会被nginx原封不动地显示给前端,可能会有细心的用户感到不安。为此咱们能够在nginx的server设置里再加一个小开关,隐藏掉这个头部:cookie

proxy_hide_header X-UID;

这样用户从浏览器端就看不到这个特殊头部了,而并不影响nginx记录它。

最终处理

那么咱们费这么大力气,记录下来一个ID有什么用呢?这个用处可就大了。你们都知道咱们有一个日志分析的利器logstash,经过它结合上ELK组件能够分析处理Apache或者nginx日志。若是咱们没有这个ID信息的话,最多也只能分析出来哪个网页常常被用户访问,仅此而已。但如今咱们有了用户ID,咱们甚至能够链接mysql数据库表进行分析,研究哪个年龄段的,哪个性别的,或者哪个城市的用户喜欢访问什么网页,甚至有针对性地了解具体某一个用户,他喜欢在什么时间段访问什么网页,进而有针对性地为他提供定制化的服务。这还不够强大吗?

相关文章
相关标签/搜索