当前位置: 首页 > 科技观察

超级全面!教你如何使用ELK分析Nginx日志

时间:2023-03-18 19:15:18 科技观察

1.前言本文介绍了nginx日志分析的单独监控然后可视化图形展示,在用户前端使用nginx代理kibana的请求响应,暂时使用HTTP用于访问权限基本身份验证加密用户登录。(elk的权限控制,我知道的还有一种方式——Shield),以后有时间再做。让我们开始写作吧。..注:默认环境与上一篇大致相同,默认安装了E、L、K、3个软件。当然,还有必要的java环境JDK在开始之前,请允许我插入一张图片,来自我在线的测试图片:nginx日志文件的一行:218.75.177.193--[03/Sep/2016:03:34:06+0800]"POST/newRelease/everyoneLearnAjaxHTTP/1.1"200370"http://www.xxxxx.com/""Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/52.0.2743.116Safnginx服务器日志的log_format格式:log_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_for"';2、配置logstash1,修改配置文件,在/etc/logstash/conf.d下。创建一个新的配置文件,内容如下:[root@log-monitor~]#cat/etc/logstash/conf.d/nginx_access.confinput{file{path=>["/data/nginx-logs/access.log"]start_position=>"beginning"ignore_older=>0}}filter{grok{match=>{"message"=>"%{NGINXACCESS}"}}geoip{source=>"http_x_forwarded_for"target=>"geoip"数据库=>"/etc/logstash/GeoLiteCity.dat"add_field=>["[geoip][坐标]","%{[geoip][longitude]}"]add_field=>["[geoip][坐标]","%{[geoip][latitude]}"]}mutate{convert=>["[geoip][coordinates]","float"]convert=>["response","integer"]convert=>["bytes","integer"]replace=>{"type"=>"nginx_access"}remove_field=>"message"}date{match=>["timestamp","dd/MMM/yyyy:HH:mm:ssZ"]}mutate{remove_field=>"timestamp"}}output{elasticsearch{hosts=>["127.0.0.1:9200"]index=>"logstash-nginx-access-%{+YYYY.MM.dd}"}stdout{codec=>rubydebug}}2.内容file大致是input部分说明:file:使用file作为输入源path:log的路径,支持/var/log.log,和["/var/log/messages","/var/log/.log"]formatstart_position:from文件的开始读取事件也有结束参数ignore_older:忽略早于24小时的日志(默认值86400),设置为0,即关闭该功能,防止事件在该文件不会被logstash忽略,因为它们很早。Filter部分:grok:数据结构化转换工具match:匹配条件格式,使用nginxlog作为message变量,应用grok条件NGINXACCESS转换geoip:这个filter匹配来自geoip的ip字段,显示ip来源的地理位置:ipsource字段,这里我们选择日志文件中的最后一个字段,如果你的是默认的nginx日志,就选择第一个字段即可(注意:这里写的字段是在/opt/logstash/patterns/nginx中定义转换后的)target:指定插入的logstash分词目标存储为geoip数据库:geoip数据库的存储路径add_field:添加字段,坐标经度add_field:添加字段,坐标纬度mutate:数据修改,删除,类型转换convert:将坐标转换为float类型convert:将http的responsecode字段转换成intconvert:将http传输的bytes转换成intreplace:替换一个字段remove_field:去掉message的内容,因为数据已经过过滤,这里不再需要该字段。否则就相当于保存了两份date:time处理。这个插件很实用。它主要使用日志文件中的事件来转换时间戳。有必要导入旧数据!这让我在这里困惑了很长时间。别再掉坑了match:匹配完时间戳字段后,修改格式为dd/MMM/yyyy:HH:mm:ssZ mutate:修改数据remove_field:去掉时间戳字段。输出部分:elasticsearch:输出到eshost:eshostip+portoresFQDN+portindex:为日志创建索引logstash-nginx-access-*,这里是在kibana中添加索引时的名称3.创建grokexpression创建logstash配置文件后,我们需要创建grok使用的expression,因为logstash配置文件中定义了转换格式语法,首先进入logstash安装目录,默认安装位置:/opt/logstash/,在在此位置创建目录patterns,如下:root@log-monitor~]#mkdir-pv/opt/logstash/patterns在此目录创建格式文件,如下:[root@log-monitor~]#cat/opt/logstash/patterns/nginxNGUSERNAME[a-zA-Z.@-+_%]+NGUSER%{NGUSERNAME}NGINXACCESS%{IPORHOST:clientip}-%{NOTSPACE:remote_user}[%{HTTPDATE:timestamp}]"(?:%{WORD:verb}%{NOTSPACE:request}(?:HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})"%{NUMBER:response}(?:%{NUMBER:bytes}|-)%{QS:referrer}%{QS:agent}"%{IPV4:http_x_forwarded_for}"注意:这个格式的末尾有一个http_x_forwarded_for,因为我们的日志启用了CDN代理。日志第一段来自CDN,最后一段是真实客户的ip。需要分析的nginx日志路径不在默认位置,所以我先根据logstash的配置新建一个目录,将日志文件拷贝进去:[root@log-monitor~]#mkdir-pv/data/nginx-logs/[root@log-monitor~]#ll/data/nginx-logs/total123476-rw-r--r--1nginxadm126430102Sep916:02access.log4,配置IP库然后GeoIP数据库解析ip中配置logstash,这里是一个开源的ip数据源,用于分析客户端的ip归属地。官网在这里:MAXMIND先把库下载到本地,如下[root@log-monitor~]#wgethttp://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz解压到当前路径,并移动到我们上面配置的路径,当然其他路径也可以,但是logstash的配置文件也需要改一下,如下:[root@log-monitor~]#gzip-dGeoLiteCity.dat.gz[root@log-monitor~]#mvGeoLiteCity.dat/etc/logstash/.测试logstash的配置文件,使用自带的命令进行测试,如下:[root@log-monitor~]#/opt/logstash/bin/logstash-t-f/etc/logstash/conf.d/nginx_access.confConfigurationOK注意:-t-f参数顺序不能乱,格式固定,-f后面要跟配置文件3.配置Elasticsearch1,修改es配置文件[root@log-monitor~]#egrep-v'^#|^$'/etc/elasticsearch/elasticsearch.ymlnode.name:es-1path.data:/data/elasticsearch/network.host:127.0.0.1http.port:9200其他内容保持默认。主要修改es的数据存放路径。它的默认路径在根目录下。因为容量太小,/data的容量很大。这取决于你的实际情况。创建数据存放目录:[root@log-monitor~]#mkdir-pv/data/elasticsearch修改文件权限[root@log-monitor~]#chown-Relasticsearch.elasticsearch/data/elasticsearch/restartservice[root@log-monitor~]#systemctlrestartelasticsearch[root@log-monitor~]#systemctlrestartlogstash检查服务状态[root@log-monitor~]#netstat-ulntp|grepjavatcp600127.0.0.1:9200:::*LISTEN25988/javatcp600127。0.0。1:9300:::*LISTEN25988/java[root@log-monitor~]#systemctlstatuslogstash查看logstash日志[root@log-monitor~]#tail-f/var/log/logstash/logstash.log{:timestamp=>"2016-09-09T16:14:26.732000+0800",:message=>"Pipelinemainstarted"}查看es中的索引,数据应该已经导入了,如下[root@log-monitor~]#curl'localhost:9200/_cat/indices?v'healthstatusindexprirepdocs.countdocs.deletedstore.sizepri.store.sizeyellowopen.kibana11103.1kb3.1kbyellowopenlogstash-nginx-access-2016.09.085169893024.2mb24.2mbyellowopenlogstash-nginx-access-2016.09.09513390273.8kb273.8kb从上面看The数据导入缓慢。大概需要一段时间,因为涉及到日志过滤和写入等,但也快了。我们暂时不会配置kibana。首先安装nginx作为代理。四、安装nginx并配置kibana代理1、安装nginx[root@log-monitor~]#wgethttps://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.10.0-1.el7.ngx.x86_64.rpm[root@log-monitor~]#yumlocalinstallsnginx-1.10.0-1.el7.ngx.x86_64.rpm–y然后新建elk.conf配置文件,内容如下(删除默认配置文件:[root@log-monitor~]#cat/etc/nginx/conf.d/elk.confupstreamelk{ip_hash;server172.17.0.1:5601max_fails=3fail_timeout=30s;server172.17.0.1:5601max_fails=3fail_timeout=30s;}server{listen80;server_namelocalhost;server_tokensoff;#closeslowconnclient_body_timeout5s;client_header_timeout5s;location/{proxy_passhttp://elk/;indexindex.htmlindex.htm;#authauth_basic"ELKPrivate,Don'ttryGJ!";auth_basic_user_file/etc/nginx/.h}t}2、passwdhttp基本认证[root@log-monitor~]#yuminstallhttpd-tools–y新用户:[root@log-monitor~]#htpasswd-cm/etc/nginx/.htpasswdelkNewpassword:重新输入新密码:addingpasswordforuserelk启动nginx查看状态[root@log-monitor~]#systemctlstartnginx[root@log-monitor~]#netstat-ultpn|grep:8888tcp000.0.0.0:88880.0.0.0:*LISTEN26424/nginx:master3,配置防火墙由于我们最终使用8888端口对外提供服务,所以kibana的5601,es的9200和9300端口不需要对外[root@log-monitor~]#iptables-IINPUT-ptcp-mstate--stateNEW--dport8888-jACCEPT4。验证网站是否可以正常访问。输入我们建立的elk用户。登录后可以正常访问kibana界面,如下图:添加一个索引,这个索引名就是我们之前在logstash配置文件中导入到es中的那个。本文中是logstash-nginx-access-*,如下图:查看索引,目前有一个是免费的,设置为star,是discover默认的高亮,然后我们点击Discover可以看到我们导入的数据。如下图所示:最后这是我的dashboard,主要统计网站客户端IP地址的归属、http传输总数、top10源IP、top10请求点击页面、错误请求趋势等.,如下,最后几张图图:五、ELK优势总结:1、在针对网络攻击事件时,便于运维人员查找和溯源。2、日志集中收集、存储,方便后续分析。3.优化业务和系统时,有据可依