关于 nginx 日志分析
Context
这次是自己的需求,刚好周六,闲来无事来公司加班,好好总结下。
自己做了个小程序,用来收集平时的位置信息,还有微信步数什么的,租的国外的服务器,,翻墙和部署项目两不误,顺便做做linux的练习,完美~ 在初期,部署项目以及一些静态资源时,经常404,肯定nginx哪里配置错了,,直接在linux服务器上用命令行翻日志又很麻烦,ssh还总断(扶额)。把nginx日志文件当静态资源访问好啦,这样直接在浏览器就可以访问,完美~这一步并不难,好好配置nginx.conf
中的location属性就好,略过不表。
但我担心的是访问路径暴露了怎么办。。有必要加上基础的访问限制,验证用户名密码什么的。还要自己写个页面?在数据库配置用户名密码?太不优雅了。还好有nginx的auth_basic
模块,完美解决问题~
这之后,有一次闲来没事,翻翻nginx日志,,呦,被吓一跳!👇
1 | {"timestamp":"2018-11-09T19:58:25-05:00","host":"66.98.120.58","client":"180.180.243.223","size":162,"requestlengh":195,"requesttime":0.000,"responsetime":"-","domain":"66.98.120.58","url":"/dbadmin/index.php","referer":"-","agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0","status":"404","x_forwarded_for":"-"} |
👆以上是今天nginx日志中的一部分,,谢谢来自IP180.180.243.223
(泰国)朋友的问候,,嗯,访问的路径都是/mysqladmin/index.php
、/admin/mysql/index.php
、/admin/PMA/index.php
什么的,太暴力了!!我还是个孩子呀。。啥都别说了,nginx必须配置动态黑名单!
basic_auth
直接看nginx官方文档就好ngx_http_auth_basic_module,教程也很多,比较简单,,也是略过不表。
1 | # 关于配置访问用户名和密码,, |
添加动态ip黑名单
这一块,最早是想用ELK的,,然后服务器崩溃了。嗯,1G内存,放弃了。
还是用awk吧,之前看到 awk 的时候,命令那么长,看都没看直接略过了。后来拖太久又没找到好的解决方案,硬着头皮上吧,,花点时间读一读文档,其实也没太难(至少实现本节内容不算太难)。这儿主要参考了 Hjqjk’s Blog-Nginx动态黑名单,这位仁兄的博客看样子也是用的HEXO框架,哈哈同道中人~
需要说明的是,,因为还想过用Java IO将日志持久化到数据库,这样就可以用语句分析访问行为了,生成图表也方便。想想,工程量有点大,,后期日志数据可能比较收集到的位置信息和微信步数数据还要大,嗯排期吧先(笑哭)。所以,将nginx日志格式配置成了json
格式👇
1 | # json 格式配置 |
以下是我筛选IP的脚本👇
1 |
|
创建好该脚本(auto_add_nginx_blockips.sh),,记得赋予它可执行的权限,,
1 | # 添加 x 权限 |
刚开始,制定的执行计划并不是在23:50,,唉,都是因为自动切割日志,切割也就算了,关键还有压缩成.gz
文件,这样脚本的复杂度就上升了,又一直搞不明白logrotate
什么时候执行切割任务,,费解。所以,最初一直blockips.conf
一直没反应,后来开始查/var/log/cron
,发现任务也执行了👇
1 | Nov 9 23:01:01 host run-parts(/etc/cron.hourly)[6988]: starting 0anacron |
后来也不记得在哪看到的,如果定时任务执行的执行情况,会发送到mail,,可以去/var/spool/mail/当前用户名
中查看👇
1 | From root@host.localdomain Tue Nov 6 01:30:02 2018 |
如果你也遇到了类似的问题,可以尝试去mail中找找线索~ Done!