当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-29 15:06:12 PHP

Nginx有一个非常强大的日志功能,但是默认情况下,它只能记录用户的IP地址和浏览器信息。如果我们有一个用户登录注册系统,在用户已经登录的情况下,如果我们想记录哪个用户访问了某个网页,我们应该怎么做呢?因为我们不仅想知道哪个IP地址访问了哪个网页,还想知道哪个登录用户访问了哪个网页,这对我们以后有针对性地向他/她推荐信息甚至推送广告是很有用的.nginx默认日志格式为127.0.0.1--[20/Jul/2017:22:04:08+0800]"GET/news/indexHTTP/1.1"20022262"-""Mozilla/5.0(Macintosh;IntelMacOSX10_12_5)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.66Safari/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,将其插入日志格式中任何你希望它出现的地方:在服务器相关设置中引用服务器中的这种日志格式,因为我们上面将日志格式命名为front,所以这里引用的时候需要指定前端日志格式:access_log/var/log/nginx/front-access.log前面;新日志结果127.0.0.1-52248[20/Jul/2017:22:35:40+0800]"GET/news/view?id=56HTTP/1.1"20019455"-""Mozilla/5.0(Macintosh;IntelMacOSX10_12_5)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.66Safari/537.36"注意上面第二个数字52248,这是我们的登录用户个人ID。我这里的例子比较简单。如果你不嫌麻烦,你甚至可以在日志中打印登录用户的所有个人信息,包括手机号码和电子邮件地址。这取决于您是否关注安全问题。在对用户隐藏id的第一步中,我们用php输出了一个特殊的header。本来我们的header只是给nginx消费的,但是这个header会原封不动的被nginx显示给前端,可能会有细心的注意。用户很不高兴。为此,我们可以在nginx的服务器设置中添加一个小开关来隐藏这个header:proxy_hide_headerX-UID;这样用户在浏览器端就看不到这个特殊的header,也不影响nginx记录它。最后处理那我们费那么大劲,记录一个ID有什么用呢?这非常有用。大家都知道我们有logstash这个日志分析利器,结合ELK组件可以对Apache或者nginx的日志进行分析处理。如果我们没有这个ID信息,最多只能分析出用户经常访问哪个网页,仅此而已。但是既然有了用户ID,我们甚至可以连接到mysql数据库表进行分析,研究哪个年龄段,哪个性别,或者用户喜欢访问哪个城市,访问哪些网页,甚至可以了解某个特定的网页有针对性的方式。用户,他喜欢在什么时间访问什么网页,然后有针对性地为他提供定制服务。这还不够强大吗?