Ubuntu 搭建ELK


 

一、簡介

官網地址:https://www.elastic.co/cn/

官網權威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

安裝指南:https://www.elastic.co/guide/en/elasticsearch/reference/5.x/rpm.html

ELK是Elasticsearch、Logstash、Kibana的簡稱,這三者是核心套件,但並非全部。

Elasticsearch是實時全文搜索和分析引擎,提供搜集、分析、存儲數據三大功能;是一套開放REST和JAVA API等結構提供高效搜索功能,可擴展的分布式系統。它構建於Apache Lucene搜索引擎庫之上。

Logstash是一個用來搜集、分析、過濾日志的工具。它支持幾乎任何類型的日志,包括系統日志、錯誤日志和自定義應用程序日志。它可以從許多來源接收日志,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數據,包括電子郵件、websockets和Elasticsearch。

Kibana是一個基於Web的圖形界面,用於搜索、分析和可視化存儲在 Elasticsearch指標中的日志數據。它利用Elasticsearch的REST接口來檢索數據,不僅允許用戶創建他們自己的數據的定制儀表板視圖,還允許他們以特殊的方式查詢和過濾數據

 

二、准備工作

環境介紹

操作系統 主機名 IP地址 相關軟件
ubuntu-16.04.5-server-amd64 jqb-node128 192.168.91.128 elasticsearch,kibana
ubuntu-16.04.5-server-amd64 jqb-node128 192.168.91.128 logstash,filebeat,nginx

 

 

 

 

架構圖

 

說明:

文本主要是采集Nginx的access日志。采集的方式有2中,分別是logstash和filebeat。

logstash依賴於java環境,比較重。而filebeat是一個輕量級的logstash,它不需要java環境。而且安裝包比較小!

所以本文會分別介紹2中采集工具的使用方法!

 

 

鏡像選擇

本文所使用的鏡像是ubuntu,注意:使用docker push鏡像時,一定要加版本號!使用16.04

為什么呢?因為默認的是ubuntu是18.04,安裝logstash的deb包時,會報錯一個ruby錯誤!無法解決!

使用16.04就不會出現這個問題了!

 

elk版本選擇

打開官網 https://www.elastic.co/cn/,目前最新版是6.4.3。那么就直接懟最新版,不要慫!

各個組件版本,統一為6.4.3

 

安裝docker

本文所使用的幾個組件,都是基於docker安裝的。這樣方便部署!

 

修改ubuntu更新源

2台服務器,修改ubuntu的更新源為阿里雲。默認的更新源太慢了!

vim /etc/apt/sources.list

內容如下:

deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu xenial-security main restricted
deb http://mirrors.aliyun.com/ubuntu xenial-security universe
deb http://mirrors.aliyun.com/ubuntu xenial-security multiverse
View Code

 

更新資源

apt-get update

 

2台服務器都安裝docker

apt-get install -y docker.io

 

修改鏡像為阿里雲

默認的更新源太慢了,所以這里直接使用阿里雲的更新源

在2台服務器上面修改

vim /etc/docker/daemon.json 

內容如下:

{
   "registry-mirrors": [
      "https://kv3qfp85.mirror.aliyuncs.com"
    ]
}

 

 2台服務器都 重啟docker服務

systemctl restart docker

 

下載軟件包

登錄到128服務器,創建目錄,並下載軟件包。待會dockerfile會用到!

mkdir /opt/elasticsearch
cd /opt/elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.3.deb

mkdir /opt/kibana
cd /opt/kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.3-amd64.deb

 

如果下載速度比較慢,可以開迅雷下載,再上傳到服務器!

 

復制sources.list,待會dockerfile會用到!

cp /etc/apt/sources.list /opt/elasticsearch/
cp /etc/apt/sources.list /opt/kibana/

 

 

登錄到129服務器,創建目錄,並下載軟件包。待會dockerfile會用到!

mkdir /opt/logstash
cd /opt/logstash
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.3.deb

mkdir /opt/filebeat
cd /opt/filebeat
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.3-amd64.deb

 

復制sources.list,待會dockerfile會用到!

cp /etc/apt/sources.list /opt/logstash/
cp /etc/apt/sources.list /opt/filebeat/

 

三、安裝elasticsearch

登錄到128服務器,修改系統參數

vim /etc/sysctl.conf

修改參數vm.max_map_count,此參數必須修改,否則啟動失敗!

vm.max_map_count = 2621440

使用以下命令刷新

sysctl -p

 

請確保服務器有2G的可用內存!否則會導致elasticsearch啟動失敗!

 

創建dockerfile

vim /opt/elasticsearch/dockerfile

內容如下:

FROM ubuntu:16.04
# 修改更新源為阿里雲
ADD sources.list /etc/apt/sources.list
ADD elasticsearch-6.4.3.deb ./
# 安裝jdk和elasticsearch
RUN apt-get update && apt-get install -y openjdk-8-jdk --allow-unauthenticated && apt-get clean all && dpkg -i elasticsearch-6.4.3.deb && rm -rf elasticsearch-6.4.3.deb
EXPOSE 9200
# 添加啟動腳本
ADD run.sh .
RUN chmod 755 run.sh
ENTRYPOINT [ "/run.sh"]

 

准備run.sh

vim /opt/elasticsearch/run.sh

內容如下

#!/bin/bash
set -e

# 添加時區
TZ=Asia/Shanghai
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 設置權限
chown -R elasticsearch:elasticsearch /etc/elasticsearch

# 判斷目錄是否存在,否則創建
if [ ! -d /var/lib/elasticsearch/data ];then
  mkdir -p /var/lib/elasticsearch/data
  chown -R elasticsearch:elasticsearch /var/lib/elasticsearch/data
fi
if [ ! -d /var/log/elasticsearch/logs ];then
  mkdir -p /var/log/elasticsearch/logs
  chown -R elasticsearch:elasticsearch /var/log/elasticsearch/logs
fi

# 修改數據和日志目錄
sed -i '33s@/var/lib/elasticsearch@/var/lib/elasticsearch/data@g' /etc/elasticsearch/elasticsearch.yml
sed -i '37s@/var/log/elasticsearch@/var/log/elasticsearch/logs@g' /etc/elasticsearch/elasticsearch.yml

# 修改綁定ip和端口
sed -i '55s@#network.host: 192.168.0.1@network.host: 0.0.0.0@g' /etc/elasticsearch/elasticsearch.yml 
sed -i '59s@#http.port: 9200@http.port: 9200@g' /etc/elasticsearch/elasticsearch.yml

# 修改啟動文件,去掉-d參數,避免后台運行
sed -i 72's@-d -p $PID_FILE@-p $PID_FILE@g' /etc/init.d/elasticsearch

# 啟動elasticsearch,要hold住,否則容器啟動就退出了!
/etc/init.d/elasticsearch start
View Code

 

此時, /opt/elasticsearch目錄結構如下:

./
├── dockerfile
├── elasticsearch-6.4.3.deb
├── run.sh
└── sources.list

 

生成鏡像

docker build -t elasticsearch-6.4.3 /opt/elasticsearch

 

啟動容器

docker run -d -it --restart=always -p 9200:9200 elasticsearch-6.4.3

 

等待幾秒鍾,查看端口是否起來了

root@jqb-node128:/opt/elasticsearch# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1303/sshd       
tcp6 0      0 :::9200                 :::*                    LISTEN      13342/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      1303/sshd       

 

訪問頁面

http://192.168.91.128:9200/

效果如下:

 

按照網絡大部分的文章來講,這個時候,應該要安裝elasticsearch-head插件。但是不好意思,目錄的elasticsearch-head插件不支持elasticsearch6.x版本。

最高支持到elasticsearch5.x版本!

 

四、安裝logstash

登錄到129服務器,在安裝logstash之前,先來安裝Nginx

安裝nginx

apt-get install -y nginx

 

安裝好之后,默認就啟動了。訪問首頁:

 

默認的access日志為

/var/log/nginx/access.log

 

安裝logstash

創建dockerfile,內容如下:

FROM ubuntu:16.04
# 修改更新源為阿里雲
ADD sources.list /etc/apt/sources.list
ADD logstash-6.4.3.deb ./
# 安裝jdk和elasticsearch
RUN apt-get update && apt-get install -y openjdk-8-jdk --allow-unauthenticated && apt-get clean all && dpkg -i logstash-6.4.3.deb && rm -rf logstash-6.4.3.deb
EXPOSE 9600
# 添加啟動腳本
ADD run.sh .
RUN chmod 755 run.sh
ENTRYPOINT [ "/run.sh"]

 

准備run.sh,內容如下:

#!/bin/bash

# 添加時區
TZ=Asia/Shanghai
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone


# 修改配置文件
sed -i '41s@# pipeline.workers: 2@# pipeline.workers: 1@g' /etc/logstash/logstash.yml
sed -i '45s@# pipeline.batch.size: 125@pipeline.batch.size: 125@g' /etc/logstash/logstash.yml

sed -i '50s@# pipeline.batch.delay: 50@pipeline.batch.delay: 5@g' /etc/logstash/logstash.yml

sed -i '64s@# path.config:@path.config: /etc/logstash/conf.d@g' /etc/logstash/logstash.yml

sed -i '190s@# http.host: "127.0.0.1"@http.host: "0.0.0.0"@g' /etc/logstash/logstash.yml
sed -i '195s@# http.port: 9600-9700@# http.port: 9600@g' /etc/logstash/logstash.yml

cp -r /etc/logstash /usr/share/logstash/config

# 啟動
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf
View Code

 

准備logstash.conf,內容如下:

input {
        
        file {
                path => "/var/log/nginx/access.log"
                type => "system"
                start_position => "beginning"
        }
}
        
output {    
        elasticsearch {
                hosts => ["192.168.91.128:9200"]
                index => "system-%{+YYYY.MM.dd}"
                }
        stdout { codec => rubydebug }
}

 

 

參數解釋:

input : 表示輸入的內容

  file: 表示類型為文件

    path: 文件路徑
    type: 類型
    start_position: 監聽文件的起始位置,默認是end。beginning表示開始


output : 表示輸出的內容

  elasticsearch : 表示輸出到elasticsearch 
    hosts: ip地址,這里的ELASTICSEARCH,待會會被run.sh替換為真正的地址,比如192.168.91.128:9200
    index: 索引值,index常用的%{+YYYY.MM.dd}這種寫法必須讀取@timestamp數據。這樣寫容易做分片,方便es刪除歷史數據!
            stdout { codec => rubydebug } 開啟debug日志輸出
View Code

注意:調試階段要先開啟日志輸出,否則無法知道有沒有發送數據!

 

如果還想收集nginx錯誤日志,path還可以這么寫

/var/log/nginx/*.log

因為error日志也在/var/log/nginx/目錄下。

 

如果想收集/var/log里面的所有文件,可以這么寫

/var/log/*/*

 

 

此時, /opt/logstash目錄結構如下:

./
├── dockerfile
├── logstash-6.4.3.deb
├── logstash.conf
├── run.sh
└── sources.list

 

生成鏡像

docker build -t logstash-6.4.3 /opt/logstash

 

啟動容器

docker run -it --restart=always -p 9600:9600 -v "/opt/logstash:/etc/logstash/conf.d" -v /var/log:/var/log logstash-6.4.3

 

注意:這里使用2個-v選項,用來掛載文件

logstash.conf 是配置文件,需要配置文件路徑以及elasticsearch地址,注意要帶端口號

/var/log 是日志文件,因為要監控nginx的日志,所以要把日志目錄掛載到容器中

run.sh 啟動時,會加載配置文件 /etc/logstash/conf.d/logstash.conf

 

等待幾秒鍾,查看端口是否起來了

root@jqb-node129:/opt/logstash# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      32174/nginx -g daem
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      8798/sshd       
tcp        0      0 192.168.91.129:22       192.168.91.1:54112      ESTABLISHED 33699/sshd: root@no
tcp        0     36 192.168.91.129:22       192.168.91.1:52999      ESTABLISHED 31702/0         
tcp6       0      0 :::80                   :::*                    LISTEN      32174/nginx -g daem
tcp6       0      0 :::22                   :::*                    LISTEN      8798/sshd       
tcp6 0      0 :::9600                 :::*                    LISTEN      41726/docker-proxy

 

訪問頁面

http://192.168.91.129:9600/

效果如下:

 

查看elasticsearch的數據

http://192.168.91.128:9200/_search?pretty

效果如下:

 

 

沒有發現index值,數據是空的!

 

訪問一下nginx頁面,查看access日志是否有了

root@b304d87c93c4:/etc/logstash/conf.d# tail -f /var/log/nginx/access.log 
192.168.91.1 - - [15/Nov/2018:18:08:23 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
192.168.91.1 - - [15/Nov/2018:18:08:23 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://192.168.91.129/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"

 

查看docker進程

root@jqb-node129:/opt/logstash# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
b304d87c93c4        logstash-6.4.3      "/run.sh"           7 minutes ago       Up 6 minutes        0.0.0.0:9600->9600/tcp   inspiring_fermat

 

查看日志輸出:

docker logs -t b304d87c93c4

 

輸出如下信息:

{
          "type" => "system",
          "path" => "/var/log/nginx/access.log",
    "@timestamp" => 2018-11-15T10:08:24.189Z,
       "message" => "192.168.91.1 - - [15/Nov/2018:18:08:23 +0800] \"GET / HTTP/1.1\" 200 396 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36\"",
      "@version" => "1",
          "host" => "b304d87c93c4"
}
{
          "type" => "system",
          "path" => "/var/log/nginx/access.log",
    "@timestamp" => 2018-11-15T10:08:24.276Z,
       "message" => "192.168.91.1 - - [15/Nov/2018:18:08:23 +0800] \"GET /favicon.ico HTTP/1.1\" 404 209 \"http://192.168.91.129/\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36\"",
      "@version" => "1",
          "host" => "b304d87c93c4"
}

 

再次查看elasticsearch頁面,發現數據已經有了!index值為system-2018.11.15

 

 既然有了數據,就可以使用kin展示了!

 

查看索引

http://192.168.91.128:9200/_cat/indices?v

這個索引,就是接下來kabana要填的索引值。

 

更多api,請參考鏈接:

https://blog.csdn.net/hanyuyang19940104/article/details/81743459

 

五、安裝kibana

登錄到128服務器,創建dockerfile

內容如下:

FROM ubuntu:16.04
ADD kibana-6.4.3-amd64.deb ./
# 安裝jdk和elasticsearch
RUN dpkg -i kibana-6.4.3-amd64.deb && rm -rf kibana-6.4.3-amd64.deb
EXPOSE 5601
# 添加啟動腳本
ADD run.sh .
RUN chmod 755 run.sh
ENTRYPOINT [ "/run.sh"]

注意:kibana不需要安裝jdk,直接安裝deb包即可!

 

准備run.sh,內容如下:

#!/bin/bash

# 添加時區
TZ=Asia/Shanghai
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

elasticsearch="192.168.91.128"

# 修改配置文件
# 修改監聽地址
sed -i '7s@#server.host: "localhost"@server.host: "0.0.0.0"@g' /etc/kibana/kibana.yml
# 去除注釋
sed -i '28s@#elasticsearch.url: "http://localhost:9200"@elasticsearch.url: "http://localhost:9200"@g' /etc/kibana/kibana.yml
# 修改ip
sed -i "28s?localhost?$elasticsearch?g" /etc/kibana/kibana.yml


# 啟動
/usr/share/kibana/bin/kibana "-c /etc/kibana/kibana.yml"
View Code

 

此時, /opt/kibana目錄結構如下:

./
├── dockerfile
├── kibana-6.4.3-amd64.deb
└── run.sh

 

生成鏡像

docker build -t kibana-6.4.3 /opt/kibana

 

啟動容器

docker run -d -it --restart=always -p 5601:5601 kibana-6.4.3

 

等待幾秒鍾,查看端口是否起來了

root@jqb-node128:/opt/elasticsearch# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1303/sshd       
tcp6       0      0 :::9200                 :::*                    LISTEN      13342/docker-proxy
tcp6 0      0 :::5601                 :::*                    LISTEN      2488/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      1303/sshd       

 

訪問頁面

http://192.168.91.128:5601

選擇不參加體驗計划

 

點擊左邊的Discover,下面已經提示了index值

 

 

將index值復制過來,選擇下一步

 

時間選擇@timestamp,點擊創建

 

效果如下:

 

多刷新幾次Nginx頁面,刷10次。

 

效果如下:

 

 

 如果數據較少,是不會出現這個頁面的!

 

六、安裝filebeat

下面演示如下使用filebeat

 

查看進程

root@jqb-node129:/opt/logstash# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
b304d87c93c4        logstash-6.4.3      "/run.sh"           49 minutes ago      Up 50 seconds       0.0.0.0:9600->9600/tcp   inspiring_fermat

 

殺掉logsth的進程

docker rm b304d87c93c4 -f

 

由於時間關系,這里不演示使用docker了。直接服務器安裝filebeat

dpkg -i filebeat-6.4.3-amd64.deb

 

關於filebeat,主要是配置文件

/etc/filebeat/filebeat.yml

 

要修改的部分如下:

- type: log

  # Change to true to enable this input configuration.
 enabled: false

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /var/log/*.log
    #- c:\programdata\elasticsearch\logs\*

...


output.elasticsearch:
  # Array of hosts to connect to.
 hosts: ["localhost:9200"]

 

修改后的的文件如下:

- type: log

  # Change to true to enable this input configuration.
 enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /var/log/nginx/access.log
    #- c:\programdata\elasticsearch\logs\*

...


output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["192.168.91.128:9200"]

 

注意:enabled一定要配置為true,否則不會生效,不會發送日志

 

啟動filebeat

systemctl start filebeat.service

 

查看elasticsearch數據,發現有filebeat的數據了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM