Elastic Stack收集Nginx访问日志

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云数据库 Tair(兼容Redis),内存型 2GB
简介: 一、架构图image.png二、搭建各个组件的软件包,可以到Elastic Stack官网下载 。本次搭建过程使用的是 6.3.1版本。

一、架构图

img_0cdffd07318c9c814a04886cb2ea4f1a.png
image.png

二、搭建

各个组件的软件包,可以到Elastic Stack官网下载 。本次搭建过程使用的是 6.3.1版本。

2.1 安装配置ElasticSearch

elasticsearch和logstash都是java开发,运行需要java环境。所以需要先配置jdk

tar jdk-8u181-linux-x64.tar.gz -C /opt/
cd /opt && ln -sv jdk1.8.0_181 jdk

# 添加环境变量
vim /etc/profile
export JAVA_HOME=/opt/jdk
export JRE_HOME=/opt/jdk/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME:/bin:$PATH

source /etc/profile
# 解压
[root@monitor elk]# tar xvf elasticsearch-6.3.1.tar.gz 
[root@monitor elk]# cd elasticsearch-6.3.1/
[root@monitor elasticsearch-6.3.1]# ls
bin  config  lib  LICENSE.txt  logs  modules  node2  node3  NOTICE.txt  plugins  README.textile

# 编辑配置文件
[root@monitor elasticsearch-6.3.1]# grep "^[a-z]" config/elasticsearch.yml 
cluster.name: fhw-es                    # elasticsearch集群名称
node.name: fhw-es-node-1                # es节点名称
path.data: /data/elk/es/data            # es数据存储目录
path.logs: /data/elk/es/logs            # es日志存储
network.host: 0.0.0.0                   
http.port: 9200                         # 监控的端口

# 启动elasticsearch ,注意要用非root用户启动,这里使用work用户启动它
nohup su work -c /home/work/lib/elk/es/bin/elasticsearch &


# 检查elasticsearch是否正常启动
[root@monitor work]# curl localhost:9200
{
  "name" : "fhw-es-node-1",
  "cluster_name" : "fhw-es",
  "cluster_uuid" : "WSP7F8NESFqxHqtvwlXZzw",
  "version" : {
    "number" : "6.3.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "eb782d0",
    "build_date" : "2018-06-29T21:59:26.107521Z",
    "build_snapshot" : false,
    "lucene_version" : "7.3.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
    //出现以上结果,表明es启动正常。 

2.2 安装配置Redis

# 下载解压
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar xvf redis-4.0.10.tar.gz -C /home/work/lib/
cd /home/work/lib/redis-4.0.10/
make && make install 
./utils/install_server.sh      # 这一步通过交互自定义数据、日志存放目录

# 移动可执行文件
cp /home/work/lib/redis-4.0.10/src/redis-server /home/work/lib/redis/bin/
cp /home/work/lib/redis-4.0.10/src/redis-cli /home/work/lib/redis/bin/
cp /home/work/lib/redis-4.0.10/src/redis-benchmark /home/work/lib/redis/bin/
cp /home/work/lib/redis-4.0.10/src/redis-check-* /home/work/lib/redis/bin/

# Redis安装后的目录结构
[root@monitor redis]# pwd
/home/work/lib/redis
[root@monitor redis]# 
[root@monitor redis]# tree
.
├── bin
│   ├── redis-benchmark
│   ├── redis-check-aof
│   ├── redis-check-rdb
│   ├── redis-cli
│   └── redis-server
├── conf
│   └── 6379.conf
└── data
    └── 6379
        └── dump.rdb

4 directories, 7 files

编辑redis配置文件

[root@monitor conf]# cd /home/work/lib/redis/conf

[root@monitor conf]# grep "^[a-z]" 6379.conf 
bind 10.31.152.187 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /home/work/logs/redis_6379.log
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /home/work/lib/redis/data/6379
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

Redis配置文件详解,请点击查看

启动Redis

/home/work/lib/redis/bin/redis-server /home/work/lib/redis/conf/6379.conf

2.3 安装配置Filebeat

在需要收集日志的服务器上安装配置Filebeat ,本例在架构图中ds-beta服务器上安装配置Filebeat

# 解压
[work@ds_beta elk]$ tar xvf filebeat-6.3.1-linux-x86_64.tar.gz

# 编辑配置文件
[work@ds_beta filebeat]$ grep -Ev "#|^$" filebeat.yml 
filebeat.inputs:
- type: log
  enabled: true 
  paths:
    - /home/work/*-access.log
    
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true 
  
setup.template.settings:
  index.number_of_shards: 3
  
setup.kibana:

----------------------------- Redis output -----------------------------
output.redis:
    hosts: ["10.31.152.187"]
    port: 6379
    key: "beta-nginx-access-log"

注意:如果想直接将Filebeat收集到的日志输出到ElasticSearch中存储,可以在filebeat.yml中加入这样的配置:

#-------------------------- Elasticsearch output ---------------------
output.elasticsearch:
  hosts: ["10.31.152.187:9200"]          # es服务器地址:端口

启动Filebeat

cd /home/work/lib/filebeat/ && /home/work/lib/filebeat/filebeat run &

注意:/home/work/lib/filebeat/data/registry文件记录了filebeat收集的日志文件名、offset(偏移量)、日志文件的inode号。

2.4 安装配置Logstash

解压

tar xvf logstash-6.3.1.tar.gz -C /home/work/lib/elk/logstash
cd /home/work/lib/elk/logstash
mkdir config/conf.d/       # 用于存放解析日志的配置文件
cd /home/work/lib/elk/logstash/config/conf.d

编辑用于解析Nginx访问日志的配置文件

[root@monitor conf.d]# cat beta-nginx-access-log.conf 
# input {
#   http {
#       port => 7474
#   }
# }

# 从redis中读取日志信息
input {
    redis {
        port => "6379"
        host => "127.0.0.1"
        data_type => "list"
        type => "log"
        key => "beta-nginx-access-log"
    }
}

# 对日志进行过滤、解析
filter {
    grok {
        match => {
            "message" => '%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:datetime}\] "%{WORD:request_method} %{DATA:uri} HTTP/%{NUMBER:http_version}" %{NUMBER:status_code} %{NUMBER:bytes} "%{DATA:referrer}" "%{DATA:agent}" "(?:%{DATA:http_x_forwarded_for}|-)" "%{DATA:http_cookie}" "%{DATA:query_string}" "%{BASE16FLOAT:request_time}" "%{BASE16FLOAT:response_time}"'
        }
    }

    #mutate {
        #    copy => { "@timestamp" => "@read_timestamp" }
        #}


    date {
        match => [ "datetime", "dd/MMM/YYYY:HH:mm:ss Z" ]
        locale => en
    }

    geoip {
        source => "remote_ip"
        fields => ["country_name", "city_name", "region_name", "location"]
    }

    useragent {
        source => "agent"
        target => "user_agent"
    }

    mutate {
        convert => {
            "bytes" => "integer"
        }
        remove_field => ["headers"]
    }

    mutate {
        add_field => {
            "[@metadata][index]" => "beta-nginx-logs_%{+YYYY.MM}"
        }
    }

    if "_grokparsefailure" in [tags] {
        mutate {
            replace => {
                "[@metadata][index]" => "beta-nginx-logs-failure_%{+YYYY.MM}"
            }
        }
    } else {
        mutate {
            remove_field => ["message"]
        }
    }

}

# 将解析后的日志存储在elasticsearch中
output {
    elasticsearch {
        hosts => "127.0.0.1:9200"
        index => "%{[@metadata][index]}"
        document_type => "doc"
    }
}

# output {
#   stdout {
#       codec => rubydebug
#   }
# }

以上注释部分用于调试。

启动Logstash

cd /home/work/lib/elk/logstash && nohup ./bin/logstash -f config/conf.d/beta-nginx-access-log.conf -r &

这时如果一切正常的话,可以验证elasticsearch是否有数据:

[root@monitor config]# curl -X GET localhost:9200/_cat/indices
green  open .kibana                         4w1jeWuET_yRWArBXkBtmA 1 0       4   0  37.7kb  37.7kb
yellow open beta-nginx-logs_2018.07         cTykSOQfSp2Z4Tkse0Gftw 5 1    1439   0     2mb     2mb
green  open .monitoring-es-6-2018.08.17     VUfYnzMdTsmP3A-vo-gutw 1 0   14335 392     7mb     7mb
yellow open filebeat-6.3.1-2018.08.17       haqPjrPdRtSEuPJWjzMqiA 3 1 8038175   0   2.3gb   2.3gb
green  open .monitoring-kibana-6-2018.08.17 LF_txPzORUGYDYr-SW-jPw 1 0    1149   0 361.5kb 361.5kb
yellow open beta-nginx-logs_2018.06         xdWR7EdnSCehLH7H2iZYBA 5 1     198   0 583.1kb 583.1kb
yellow open beta-nginx-logs-failure_2018.08 H_1mvh3MQ2GsnVOEGtw9IQ 5 1   29739   0  12.3mb  12.3mb
yellow open beta-nginx-logs_2018.08         jTNfJ44mQr2ofQugG9B3dQ 5 1    1249   0     3mb     3mb

可以看到beta-nginx-logs_2018.06\07\08是我们在logstash的日志解析配置文件beta-nginx-access-log.conf中定义的索引。这就表明日志经过过滤解析后,已经存储到ES中了。

2.5 安装配置Kibana

Kibana依赖于node,所以先配置node

tar xvf node-v8.11.3-linux-x64.tar.gz
ln -sv node-v8.11.3-linux-x64 node

# 配置环境变量
vim /etc/profile
export NODE_HOME=/home/work/lib/node
export PATH=$PATH:/home/work/lib/node/bin

source /etc/profile
# 解压
tar xvf kibana-6.3.1-linux-x86_64.tar.gz -C /home/work/lib/elk/kibana

# 编辑配置文件
[root@monitor kibana]# grep "^[a-z]" config/kibana.yml 
server.port: 5701                               # kibana监听的端口
server.host: "0.0.0.0"                          
elasticsearch.url: "http://localhost:9200"      # es地址


# 启动kibana
nohup /home/work/lib/elk/kibana/bin/kibana serve &

访问kibana: http://IP:5701 , 如下图

img_c2adb4da8c6ce2ddb710f66a999c6d7c.png
image.png

点击Management --> Index Patterns 创建索引


img_66d5f411847062076d581db053eea58f.png
image.png

配置索引


img_2f5db151a34f3958136a0f3cb9c804cb.png
image.png

选择时间过滤字段名称


img_7077e4c61f93298342d40590c7057f3e.png
image.png

创建完成后,会显示索引里每个字段的数据类型


img_7d897d835ffd7dbeea4979c276351444.png
image.png

点击Discover


img_931de5c15aa8eedcc413148edf55ce93.png
image.png

选择字段查看结果


img_9a71b1eac9f2019e1145067dba0b71e8.png
image.png

至此,完成!

参考博客:

  1. 官方文档
  2. 史上超全面的Elasticsearch使用指南
  3. 搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
  4. Filebeat,Redis和ELK6.x集中式日志解决方案
  5. Grok Debugger本地安装过程
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
15天前
|
Web App开发 算法 应用服务中间件
nginx开启局域网https访问
【10月更文挑战第22天】为了调试WebRTC功能,需要在局域网内搭建HTTPS协议。具体步骤包括:在已部署Nginx和安装OpenSSL的环境中生成私钥、证书签名请求和自签名证书;将生成的文件放置到Nginx的证书目录并修改Nginx配置文件,最后重启Nginx服务。注意,自签名证书不受第三方机构认可,如需正式使用,需向CA申请签名。
|
1月前
|
应用服务中间件 Shell PHP
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
46 2
|
3月前
|
应用服务中间件 nginx Docker
本地通过域名访问虚拟机上nginx的服务、搭建域名访问环境一(反向代理配置)
这篇文章介绍了如何通过域名在本地访问虚拟机上的nginx服务,包括创建nginx容器、修改配置文件、修改本地host文件以及进行访问测试的详细步骤。文章提供了具体的Docker命令来创建并配置nginx容器,展示了配置文件的修改示例,说明了如何在本地系统的hosts文件中添加虚拟机IP和自定义域名,以及如何通过浏览器进行测试访问。
本地通过域名访问虚拟机上nginx的服务、搭建域名访问环境一(反向代理配置)
|
2月前
|
Ubuntu 应用服务中间件 数据库
Nginx配置:阻止非国内IP地址访问的设置方法
此外,出于用户隐私和法律合规性的考虑,应慎重考虑阻止特定国家或地区IP地址的决策。在某些情况下,这可能被视为歧视性或违反当地法律。
152 2
|
3月前
|
应用服务中间件 nginx
nginx error日志 client intended to send too large body: 1434541 bytes 如何处理?
【8月更文挑战第27天】nginx error日志 client intended to send too large body: 1434541 bytes 如何处理?
281 6
|
3月前
|
JavaScript 应用服务中间件 PHP
nginx server 禁止特定目录下的某类文件访问
【8月更文挑战第26天】这段Nginx配置代码旨在保护`/uploads/`目录下的文件,禁止执行任何`.php`, `.html`, `.htm`, 或 `.js`等潜在有害文件,即便被访问也无法运行。取而代之的是重定向到首页。为了实现这一设置,用户需要定位到对应子域名的`.conf`配置文件中进行相应修改。若网站支持多个访问域名,则需确保在正确的`.conf`文件中实施此配置。
95 1
|
3月前
|
Ubuntu Linux 测试技术
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
|
3月前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
3月前
|
存储 监控 应用服务中间件
查看nginx日志文件
器性能和提高网站可用性。掌握日志文件的路径、查看方法和基本分析技能对于任何服务器管理员来说都是必备技能。
135 1