怎麼在 Ubuntu14.04上安裝 Elasticsearch, Logstash, Kibana (ELK Stack)
系列教程
這是在 Ubuntu 14.04 上使用 ELK 集中化日誌系列教程中的一篇。該系列共有4篇,其他3篇敬請期待~
前言
在這個教程中,將會全面介紹怎麼在 Ubuntu 14.04上安裝 Elasticsearch ELK Stack,也就是 Elasticsearch 2.2.x, Logstash 2.2.x, 以及 Kibana 4.4.x。當然,這裡也會涉及在一個集中點中怎麼配置 Filebeat1.1x 來收集和可視化的系統日誌的教程。Logstash 是收集、分析和存儲日誌以供日後使用的開源工具。Kibana 是一個 Web 界面,可用於搜索和查看 Logstash 已索引的日誌。這兩個工具都基於用於存儲日誌的 Elasticsearch。
在你試圖找出伺服器或應用程序問題時,集中化日誌是非常有用的,因為它可以讓你在一個地方搜索所有的日誌。在確定跨多個伺服器的問題這一點也非常有用,因為它在一個特定的時間範圍內收集多個伺服器的日誌。
用 Logstash 可以收集很多類型的日誌,但是在這個教程中我們限定範圍為 syslog。
我們的目的
這篇教程的目的是安裝 Logstash 來收集多個 server 的 syslog,然後安裝 Kibana 來可視化收集到的日誌。
ELK stack 的安裝有4個主要的組件:
- Logstash:在 server 端,處理傳入的日誌。
- Elasticsearch:存儲所有的日誌。
- Kibana:Web 界面,用來搜索和可視化日誌;使用 Nginx 代理實現。
- Filebeat:安裝在 client 端(也就是你需要收集日誌的目標伺服器),將日誌發送給 Logstash。Filebeat 端作為一個日誌傳送代理,使用的是 lumberjack 網路協議與 Logstash 通信。
我們先安裝前三個組件,它們需要安裝在同一個 server 上,這個 server 就是我們的 ELK Server。Filebeat 會安裝在所有我們想要收集 log 的客戶端,統稱為 Client Servers。
安裝前
要完成這個教程,需要 Ubuntu 14.04 VPS 的 root 許可權。配置的教程可以在這裡找到: Initial Server Setup with Ubuntu 14.04(steps 3 and 4)。
如果你想用 CentOS,看這個教程:How To Install ELK on CentOS 7.
ELK Server 的 CPU、RAM 和存儲量的需求取決於你將要收集的 log 的數量。在這個教程中,我們將使用以下規格的一個 VPS 作為我們 ELK Server:
- OS:Ubuntu 14.04
- RAM:4GB
- CPU:2
除了 ELK Server,你需要有其他的 Servers 作為日誌來源。
廢話不啰嗦了,開始配置吧!
安裝 JAVA 8
Elasticsearch 和 Logstash 需要 Java,所以我們需要安裝。Elasticsearch 需要安裝最新的 Oracle Java 8。當然,如果你要用 OpenJDK 的話,應該也不錯。
添加 Oracle JavaPPA 到 apt:
sudo add-apt-repository -y ppa:webupd8team/java
更新apt包資料庫:
sudo apt-get update
安裝穩定版 Oracle Java8(接受彈出的協議內容):
sudo apt-get -y install oracle-java8-installer
Java 8 安裝好了,接下來安裝 Elasticsearch
安裝 Elasticsearch
Elasticsearch 可以用包管理器通過添加 Elastic 的包源列表進行安裝。
用下面的命令來導入 Elasticsearch 公共 GPG 密鑰到 apt:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
如果你的終端提示停在這裡不動了,可能是在等你輸入用戶密碼(為了授權 sudo 命令)。遇到了的話,輸入你的密碼就好。
創建 Elasticsearch 資源列表:
echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
更新 apt 包資料庫:
sudo apt-get update
安裝 Elasticsearch:
sudo apt-get -y install elasticsearch
安裝好了,接下來編輯配置文檔:
sudo vi /etc/elasticsearch/elasticsearch.yml
要限制你的 Elasticsearch 介面(埠9200)外的訪問,這樣外人無法通過 HTTP API 讀取數據或關閉您的 Elasticsearch 集群。找到 network.host,取消注釋,用 localhost 替換它的值:
network.host: localhost
保存並退出 elasticsearch.yml。
現在,打開 Elasticsearch:
sudo service elasticsearch restart
然後運行以下命令將在系統啟動時啟動 Elasticsearch:
sudo update-rc.d elasticsearch defaults 95 10
現在 Elaticsearch 設置好也啟動了,現在來安裝 Kibana。
安裝 Kibana
Kibana 可以用包管理器通過添加 Elastic 的包源列表進行安裝。
創建 Kibana 資源列表:
echo "deb http://packages.elastic.co/kibana/4.4/debian stable main" | sudo tee -a /etc/apt/sources.list.d/kibana-4.4.x.list
更新 apt 包資料庫:
sudo apt-get update
安裝 Kibana:
sudo apt-get -y install kibana
這樣就安裝好了。
打開 Kibana 配置文件編輯:
sudo vi /opt/kibana/config/kibana.yml
在文件中找到 server.host,用 localhost 替換0.0.0.0:
server.host: "localhost"
保存,退出。這個操作讓 Kibana 只能被 localhost訪問。不要擔心,我們會用 Nginx反向代理來允許外部訪問。
現在啟用 Kibana 服務:
sudo update-rc.d kibana defaults 96 9
sudo service kibana start
在使用 Kibana Web 界面的之前,我們必須安裝反向代理。接下來就來安裝 Ngnix 吧!
安裝 Ngnix
因為我們配置了 Kibana 監聽 localhost,我們必須安裝反向代理來允許外部訪問。這裡就使用 Ngnix 來達成這個目的。
注意:如果你已經有要用的 Ngnix 實例,那就直接使用。只要記得去配置 Kibana,讓 Ngnix server 可以訪問(你可能需要在 /opt/kibana/config/kibana.yml 改變 host 的值為你的 Kibana server 的 private IP 或者 hostname)。此外,建議您啟用 SSL / TLS。
用 apt 安裝 Ngnix 和 Apache2-utils:
sudo apt-get install nginx apache2-utils
用 htpasswd
創建一個 admin 用戶,叫 Kibanaadmin(根據自己喜好命名),用來訪問 Kibana Web 界面:
sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
在命令提示終端輸入密碼。記住用戶名和密碼,稍候你需要用它來訪問Kibana Web界面。
現在用你喜歡的編輯器打開 Nginx 的默認伺服器模塊。我們將用 vi:
sudo vi /etc/nginx/sites-available/default
刪除文件中的內容,複製下面的代碼塊到文件中。請確保 server_name 和你的 server_name 匹配:
/etc/nginx/sites-available/default
server {
listen 80;
server_name example.com;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/htpasswd.users;
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
保存,退出。這個 Nginx 的配置通過監聽 localhost:5601,讓你的伺服器的 HTTP 流量直接到 Kibana 應用程序。此外,Nginx 的將使用我們前面創建的 htpasswd.users 文件,也會要求基本身份驗證。
現在重啟 Nginx 讓之前的改變生效:
sudo service nginx restart
Kibana 現在是可訪問的,通過 FQDN 也就是你的 ELKServer 公共 IP 地址。http://elk_server_public_ip/ 如果你在瀏覽器中訪問這個地址,然後輸入 「kibanaadmin」 驗證。這樣,你就可以看到 Kibana 的歡迎界面,在這裡它會要求你配置 index 類型。不要管那麼多拉,我們待會再來研究,先回去安裝其他組件。
安裝 Logstash
Logstash 軟體包和 Elasticsearch 的在同一個版本庫,之前我們已經添加了這個公共密鑰。所以,直接創建 Lostash 的資源列表:
echo 'deb http://packages.elastic.co/logstash/2.2/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash-2.2.x.list
更新 apt 包資料庫:
sudo apt-get update
安裝 Logstash:
sudo apt-get install logstash
安裝好了!但是還沒有配置。
生成 SSL 證書
因為我們是使用 Filebeat 從 Client Server 傳輸日誌到伺服器 ELK Server,所以需要創建一個 SSL 證書和密鑰對。Filebeat 用該證書驗證 ELK Server 的身份。創建將存儲證書和私鑰使用目錄:
sudo mkdir -p /etc/pki/tls/certs
sudo mkdir /etc/pki/tls/private
你有生成 SSL 證書的兩種選擇。如果你有一個 DNS 設置,讓您的客戶端伺服器解析伺服器 ELK 的 IP 地址,使用選項2。否則,使用選項1,將允許您使用 IP 地址。
選項1:IP 地址
如果你沒有 DNS 設置——它允許你收集 log 的伺服器,解析你的 ELK Server 的 IP 地址——你必須添加 ELK Server 的 private IP 地址到的 SSL 證書的 SubjectAltName(SAN)。要做這一步,打開 OpenSSL 的配置文件:
sudo vi /etc/ssl/openssl.cnf
找到文件中[ v3_ca ]板塊,在下面添加這一行(替換 ELK Server 的 private IP 地址):
subjectAltName = IP: ELK_server_private_IP
保存,退出。
現在砸死相應位置產生 SSL 證書和私鑰(在 /etc/PKI/TLS/),使用下面的命令:
cd /etc/pki/tls
sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
該 logstash-forwarder.crt 文件將被複制到所有將日誌發送到 Logstash 的伺服器上——稍候,我們會做這一步。讓我們繼續完成 Logstash 配置。如果您使用了此選項,跳過選項2併到配置 Logstash 這一步。
選項2
如果你有個人網路的 DNS 設置,你應創建一個包含 ELK Server 的 private IP 地址的 A 記錄——這個域名將在接下來的命令中使用,來生成 SSL 證書。或者,你可以用一個指向該伺服器的公共 IP 地址的記錄。只要確保你的伺服器(收集日誌的伺服器)將能夠解析域名到你的 ELK Server。
現在生成 SSL 證書和私鑰,,在相應的位置(在
cd /etc/pki/tls; sudo openssl req -subj '/CN=ELK_server_fqdn/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
該 logstash-forwarder.crt
文件將被複制到所有將日誌發送到 Logstash 的伺服器上——稍候,我們會做這一步。讓我們繼續完成 Logstash 配置。
配置 Logstash
Logstash 配置文件是 JSON 格式的,放在 /etc/logstash/conf.d
創建一個叫 02-beats-input.conf 的配置文件,並配置 "filebeat" 的input:
sudo vi /etc/logstash/conf.d/02-beats-input.conf
輸入下面的配置信息:
02-beats-input.conf
input {
beats {
port => 5044
ssl => true
ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
保存,退出。指定的 beats 輸入會監聽 TCP 埠5044,它將使用我們前面創建的 SSL 證書和私鑰。
現在來創建 10-syslog-filter.conf 配置文件,在這裡面我們會添加 syslog 信息的 filter:
sudo vi /etc/logstash/conf.d/10-syslog-filter.conf
輸入下面的 syslog filter 配置信息:
10-syslog-filter.conf
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
保存,退出。這個 filter 查詢 syslog 類型的 logs(通過 Filebeat),而且它會使用 grok
來解析傳入的 syslog 日誌,使之結構化和可查詢。
最後,我們創建 30-elasticsearch-output.conf 配置文件:
sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf
輸入下面的 output 配置信息:
/etc/logstash/conf.d/30-elasticsearch-output.conf
output {
elasticsearch {
hosts => ["localhost:9200"]
sniffing => true
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
保存,退出。這個 output 主要是配置 Logstash 去存儲運行在 localhost:9200上的Elasticsearch beat 數據,這裡有一個命名要求,由被使用的 beat 來命名(在這個情況下是 filebeat)。
如果你想給其他使用 Filebeat input 的 application 添加 filters,請確保命名文件讓它們在 input 和 output 的配置之間排序(即,02-和30-之間)。
測試 Logstash 的配置信息:
sudo service logstash configtest
顯示 Configuration OK 是對的,否則是錯誤的。請查看錯誤信息以確定 Logstash 配置信息那裡出錯了。
重啟 Logstash,並啟動,讓改變的配置信息生效:
sudo service logstash restart
sudo update-rc.d logstash defaults 96 9
現在,我們來載入樣例 Kibana 儀錶盤。
載入 Kibana儀錶盤
Elastic 提供了幾種 Kibana 的儀錶盤樣例和 beat 索引模式,來幫助你開始使用 Kibana。雖然在我們的教程中不會使用儀錶盤,但是不管怎麼我們都可以用它包含的 Filebeat 和索引模式載入它們。
首先,下載儀錶盤樣例,存到你的 home 目錄:
cd ~
curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip
安裝 unzip 包:
unzip beats-dashboards-*.zip
然後載入儀錶盤樣例、可視化和 beat 索引模式到 Elasticsearch:
cd beats-dashboards-*
./load.sh
這些是剛才我們載入的索引模式:
- [packetbeat-]YYYY.MM.DD
- [topbeat-]YYYY.MM.DD
- [filebeat-]YYYY.MM.DD
- [winlogbeat-]YYYY.MM.DD
當我們使用 Kibana,選擇 Filebeat 索引模式作為我們的默認模式。
載入 Filebeat 索引模版到 Elasticsearch
因為我們計劃使用 Fliebeat 傳輸 logs 到 Elasticsearch,所以我們因該載入 Filebeat 索引模版。該索引模板將配置 Elasticsearch 以一種智能的方式來分析傳入的 Filebeat 信息。
首先,下載 Filebeat 索引模版到 home 目錄:
cd ~
curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
然後載入它:
curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json
如果模板正確載入,你會看到這樣的消息:
Output:{ "acknowledged" : true}
現在,我們的 ELK Server 已準備好接收 Filebeat 數據,讓我們到每個 Client Server 上設置 Filebeat。
設置 Filebeat(添加 Client Servers)
在你要發送日誌到 Logstash ELK Server 的所有 Ubuntu 或 Debian 的 server 做這一步。有關在基於 Red Hat Linux 發行版(RHEL 例如,CentOS 的,等等)安裝 Filebeat 說明,請參閱在 CentOS 設置 Filebeat(添加客戶端伺服器)部分。
複製 SSL 證書
在你的 ELK Server,複製 SSL 證書——這個教程之前創建的——到你的 Client Sever(用你自己的登錄信息替換下面的 client server's address):
scp /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp
提供您的登錄憑據後,確保證書複製成功。在 client servers 和 ELK Server 之間的通信,這是必須要的。
現在,我們將安裝 Topbeat 包。
安裝 Filebeat 包
在 Client Server,創建 Beats 資源列表:
echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list
它也和 Elasticsearch 使用相同的 GPG 密鑰,可以使用下面的命令進行安裝:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add –
然後,安裝 Filebeat 包:
sudo apt-get update
sudo apt-get install filebeat
安裝好了,接下來來配置。
配置 Filebeat
現在,我們將配置 Filebeat 連接到 ELK Server 上的 Logstash。本節將引導你完成修改 Filebeat 自帶示例的配置文件。當你完成這些步驟,你應該有一個看起來像這樣的文件。
在 Client Server,創建和修改 Filebeat 配置文件:
sudo vi /etc/filebeat/filebeat.yml
注意:Filebeat 的配置文件是 YAML 格式,這意味著縮進是非常重要的!一定要使用相同數量的空格。
接近文件的頂部,你會看到 prospectors 部分,這是你可以定義指定 prospectors 哪些日誌文件可以傳送,以及他們應該如何處理。每個 prospectors 用「-」標明:
filebeat.yml excerpt 1 of 5
...
paths:
- /var/log/auth.log
- /var/log/syslog
# - /var/log/*.log
...
然後,找到指定 DOCUMENT_TYPE: ,取消注釋該行並改變其值設置為「syslog」。它修改後是這樣的:
...
document_type: syslog
...
這指定 prospectors 的日誌類型是 syslog(這是我們 Logstash filter 正在尋找的類型)。
如果你想發送其他的文件到你的 ELK 伺服器,或對 Filebeat 如何處理你的日誌進行任何更改,隨意修改或添加 prospectors 條目。
接下來,在 output 部分,找到 elasticsearch: ,這表明 Elasticsearch 輸出部分(我們不打算使用)。刪除或注釋掉整個 Elasticsearch output 部分(最多,到 #logstash:)行。
找到注釋掉的 Logstash 輸出部分——#logstash:,取消注釋(刪除前面的#)。在本節中,取消hosts:[「localhost:5044」]行注釋。改變 localhost 為你的 ELK 伺服器的 private IP 地址(或主機名):
### Logstash as output
logstash:
# The Logstash hosts
hosts: ["ELK_server_private_IP:5044"]
這將配置 Filebeat 連接到 ELK Server 上的 Logstash 通過5044埠(我們指定的 Logstash 輸入的埠)。
直接在 hosts 下面,添加這一行:
bulk_max_size: 1024
接著,找到 tls 部分,取消注釋;並取消 certificate_authorities,注釋,改變它的值為["/etc/pki/tls/certs/logstash-forwarder.crt"]:
...
tls:
# List of root certificates for HTTPS server verifications
certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
配置 Filebeat 使用我們的 ELK Server 上創建的 SSL 證書。
保存、退出。
重啟 Fliebeat
sudo service filebeat restart
sudo update-rc.d filebeat defaults 95 10
如果你不確定你的文件配置是否爭取,可以查看這裡。
測試 Filebeat 安裝
如果您的 ELK stack 正確安裝,Filebeat(客戶端伺服器上)應該傳送 log 到 ELK Server 上的 Logstash。 Logstash 應載入 Filebeat 數據到 Elasticsearch 以這樣一個時間戳 filebeat-YYYY.MM.DD。
在你的 ELK Server,驗證 Elasticsearch 確實通過 Filebeat 查詢索引接收的數據:
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
你應該會看到這樣的輸出:
Sample Output:
...
{
"_index" : "filebeat-2016.01.29",
"_type" : "log",
"_id" : "AVKO98yuaHvsHQLa53HE",
"_score" : 1.0,
"_source":{"message":"Feb 3 14:34:00 rails sshd[963]: Server listening on :: port 22.","@version":"1","@timestamp":"2016-01-29T19:59:09.145Z","beat":{"hostname":"topbeat-u-03","name":"topbeat-u-03"},"count":1,"fields":null,"input_type":"log","offset":70,"source":"/var/log/auth.log","type":"log","host":"topbeat-u-03"}
}
...
如果總點擊數(hits)輸出結果0,Elasticsearch 沒有在你搜索的索引下載入任何日誌,你應該檢查你的設置。如果你收到了預期的輸出,繼續下一步。
連接到 Kibana
當您完成所有要收集日誌的伺服器的 Filebeat 設置,讓我們來看看我們之前安裝的 Web 界面 Kibana。
在 Web 瀏覽器中,轉到 FQDN 或 ELK Server 的公共 IP 地址。使用「kibanaadmin」身份進入後,你會看到一個頁面,提示您配置默認索引圖案:
https://assets.digitalocean.com/articles/elk/1-filebeat-index.gif
繼續,然後從索引模式菜單(左側)中選擇 [filebeat]-YYY.MM.DD,然後單擊星(設置為默認索引)按鈕設置 Filebeat 指數為默認值。
現在點擊頂部導航欄中的鏈接發現。默認情況下,這將顯示在過去的15分鐘所有的日誌數據。您應該看到日誌事件直方圖,下面日誌消息:
現在,不會有在那裡多,因為你只是從客戶端伺服器收集系統日誌。在這裡,你可以搜索和瀏覽你的日誌。您還可以自定義儀錶板。
嘗試這些操作:
- 搜索「root」來看看是否有人嘗試用root身份登錄你的伺服器;
- 搜索特殊的 hostname;
- 通過對直方圖選擇一個區域或從上面的菜單中改變時間幀;
- 點擊下面的柱狀圖信息,看數據是如何被過濾的。
總結
現在你的 syslogs 通過 Elasticsearch 和 Logstash 集中化了,並且你可以通過 Kibana 查看它們。到這裡,你應該有一個集中化重要 logs 很好的開始了。請記住你可以發送各種各樣的 log 或者是索引數據到 Logstash,但是如果是使用 grok 解析和結構化的數據會更加有用。
為了提升 ELK stack,你應該考慮使用 Logstash 收集和過濾其他日誌,並創建 Kibana 儀錶板 。您可能還需要通過使用Topbeat與 ELK stack 收集系統指標。所有這些主題均包含在本系列的其他教程中。
LinuxStory 譯文鏈接:http://www.linuxstory.org/how-to-install…n-ubuntu-14-04/