利用nginx访问日志如何记录mysql中的用户id详解

前言

大家应该都知道,nginx有很强大的日志功能,但是在缺省状态下,它只能记录用户的IP地址以及浏览器信息。如果我们有用户登录注册系统,在用户已登录的情况下,想记录访问某一个网页的到底是哪一个用户,怎么办呢?因为我们不只想知道到底是哪一个IP地址访问了哪一个网页,并且还想知道到底是哪一个登录用户访问了哪一个网页,这对于我们日后有针对性地向他/她推荐信息甚至推送广告都是非常有用的。下面话不多说,来一起看看详细的介绍:

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信息:

$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这样的形式。

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

创建一种新的日志格式

log_format只能被存储在http段里,所以我们需要找到nginx.conf文件。

nginx缺省的日志格式第二部分就是用户信息,但通常什么也没有,只是一个-,这里我们它改造成我们从后端传进来的header信息。由上文我们创造的特殊header是X-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设置里再加一个小开关,隐藏掉这个头部:

proxy_hide_header X-UID;

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

最终处理

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

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 利用nginx访问日志如何记录mysql中的用户id详解

    前言 大家应该都知道,nginx有很强大的日志功能,但是在缺省状态下,它只能记录用户的IP地址以及浏览器信息.如果我们有用户登录注册系统,在用户已登录的情况下,想记录访问某一个网页的到底是哪一个用户,怎么办呢?因为我们不只想知道到底是哪一个IP地址访问了哪一个网页,并且还想知道到底是哪一个登录用户访问了哪一个网页,这对于我们日后有针对性地向他/她推荐信息甚至推送广告都是非常有用的.下面话不多说,来一起看看详细的介绍: nginx缺省的日志格式 127.0.0.1 - - [20/Jul/2017

  • MYSQL中Truncate的用法详解

    本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作.TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似:但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源更少.下面介绍SQL中Truncate的用法 当你不再需要该表时, 用 drop:当你仍要保留该表,但要删除所有记录时, 用 truncate:当你要删除部分记录时(always with a WHE

  • MySQL中数据视图操作详解

    目录 1.视图概述 1.1创建视图 1.2视图的查询 2.操作视图 2.1通过视图操作数据 2.2修改视图定义 2.3删除视图 1.视图概述 视图是从一个或多个表(或视图)导出的表.视图与表(有时为与视图区别,也称表为基本表)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表. 视图一经定义,就可以像表一样被查询.修改.删除和更新.使用视图有下列优点: 1.为用户集中数据,简化用户的数据查询和处理

  • mysql中整数数据类型tinyint详解

    目录 1.1 tinyint类型说明 1.2 实践环境说明 1.3 加unsigned属性 1.3.1 SQL模式开启严格模式 1.3.2 SQL模式未开启严格模式 1.4 加zerofill属性 1.4.1 SQL模式开启严格模式 1.4.2 SQL模式未开启严格模式 1.5 不加unsigned和zerofill属性 1.5.1 SQL模式开启严格模式 1.5.2 SQL模式未开启严格模式 1.1 tinyint类型说明 数据类型 显示长度 占用字节 有符号 无符号 tinyint 加上un

  • mysql中的mvcc 原理详解

    目录 简介 前言 一.mysql 数据写入磁盘流程 二.redo log 1.redolog 的整体流程 2.为什么需要 redo log 三.undo log 1.undo log 特点 2.undo log 类型 3.undo log 生成过程 4.undo log 回滚过程 5.undo log的删除 四.mvcc 1.什么是MVCC 2.MVCC组成 3.快照读与当前读 快照读 当前读 五.mvcc操作演示 1.READ COMMITTED 隔离级别 2.REPEATABLE READ 

  • MySQL中JSON字段数据类型详解

    目录 前言 创建JSON值 搜索JSON类型数据 在 JSON 和非 JSON 值之间转换 JSON 值的汇总 总结 前言 JSON 类型是从 MySQL 5.7 版本开始支持的功能,MySQL 支持由RFC 7159定义的本机JSON数据类型,该类型可有效访问 JSON(JavaScript 对象 table 示法)文档中的数据.与将 JSON 格式的字符串存储在字符串列中相比,JSON数据类型具有以下优点: 自动验证存储在JSON列中的 JSON 文档.无效的文档会产生错误. 优化的存储格式

  • MySQL中存储过程的详细详解

    目录 概述 优点 缺点 MySQL存储过程的定义 存储过程的基本语句格式 存储过程的使用 定义一个存储过程 定义一个有参数的存储过程 定义一个流程控制语句 IF ELSE 定义一个条件控制语句 CASE 定义一个循环语句 WHILE 定义一个循环语句 REPEAT UNTLL 定义一个循环语句 LOOP 使用存储过程插入信息 存储过程的管理 显示存储过程 显示特定数据库的存储过程 显示特定模式的存储过程 显示存储过程的源码 删除存储过程 后端调用存储过程的实现 总结 概述 由MySQL5.0 版

  • MySQL中正则表达式(REGEXP)使用详解

    目录 前言 LIKE和REGEXP的区别 OR进行匹配 匹配范围 匹配特殊字符 匹配字符类 匹配多个实例 定位符 ^有两种用法 附:Mysql字符串截取 和 截取字符进行查询 总结 前言 有时候使用MySQL进行数据库查询数据的时候,like查询存在局限性,这时候就可以使用MySQL中的正则表达式查询的方式. 正则表达式是用来匹配文本的特殊的串(字符集合),将一个模式(正则表达式)与一个文本串进行比较. 从文本文件中提取电话号码 查找名字中间带有数字的文件 文本块中重复出现的单词 替换页面的UR

  • mysql中#{}和${}的区别详解

    #{}会将传入的数据当成一个字符串,会对自动传入的数据加一个双引号 order by #{userId}   这里假如userId = 111,那么解析成sql时会变成 order by "111"这里如果userId = idStr,那么解析成sql时会变成 order by "idStr" ${}会将传入的数据直接显示生成在sql中 order by #{userId}  这里假如userId = 111,那么解析成sql时会变成 order by 111这里如

  • MySQL中字符串比较大小详解(日期字符串比较问题)

    前言 数据库中在对于数字与非数字混合的字符串,在进行大小比较的时候,如果两字符串长度相等,那么两字符串就会比较相同位置的字符,比较时若字符是数字,则直接比较,若字符是非数字那么会转换为ascii码进行比较,若在某位置上已经有大小之分,那么就不会再进行比较. 如上所述,当字符串用于比较时间格式数据进行时间维度的比较时会出现问题.如以下sql进行查询时 select * FROM work_day_content as wdc WHERE wdc.work_day >= '2019-09-30 00

随机推荐