Monitorer votre serveur Apache avec ELK
⏲️ ~5 min de lecture
Publié le
par
DevOps
ELK, c'est quoi ? #
Le trio ElasticSearch, Logstash et Kibana alias ELK permet de facilement centraliser et visualiser les logs générés par vos divers services. Dans cet article nous allons mettre en place un stack ELK simple afin de monitorer votre serveur Apache.
- Elasticsearch est un moteur de recherche basé sur une base NoSQL. Il offre la possibilité de consommer les données à travers une API REST.
- Logstash est un outil qui permet de collecter, gérer et transformer des logs.
- Kibana va vous permettre de requêter ElasticSearch pour visualiser les résultats sur des tableaux de bord et leur donner du sens.
Installation de la stack ELK #
Java #
Pour faire fonctionner tout ce petit monde (en particulier Elasticsearch), vous aurez besoin de Java au moins version 7.
apt-get install openjdk-7-jre
Elasticsearch #
Pour installer la bête :
wget -qO - https://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add -
sudo add-apt-repository "deb http://packages.elasticsearch.org/elasticsearch/1.4/debian stable main"
sudo apt-get update && sudo apt-get install elasticsearch
Si vous souhaitez le lancer au démarrage :
sudo update-rc.d elasticsearch defaults 95 10
Et on peut lancer Elasticsearch :
sudo /etc/init.d/elasticsearch start
La configuration basique d'Elasticsearch le rend accessible à l'adresse : http://127.0.0.1:9200
Logstash #
On récupère l'archive de Logstash et on la décompresse :
curl -O https://download.elasticsearch.org/logstash/logstash/logstash-1.4.2.tar.gz
mkdir -p ~/opt/logstash
tar xvzf logstash-1.4.2.tar.gz -C ~/opt/logstash --strip 1
Et c'est fini, on va le lancer bien assez tôt, gardez le sous le coude.
Kibana #
Kibana nécessite d'être servi par un serveur web (apache, nginx, ...). C'est en fait un site statique en AngularJS.
Téléchargement et décompression :
curl -O https://download.elasticsearch.org/kibana/kibana/kibana-latest.tar.gz
tar xzfv kibana-latest.tar.gz
Il vous suffit ensuite de le placer dans un répertoire servi par votre serveur web préféré.
Si l'url de votre Kibana n'est pas sur le même domaine que Elasticsearch (Par exemple pour moi kibana est accessible à l'adresse http://kibana.devlocal et elasticsearch à l'adresse par défaut soit http://127.0.0.1:9200), il vous faut autoriser les requêtes CORS. Pour cela, dans le fichier /etc/elasticsearch/elasticsearch.yml
, ajouter les lignes suivantes :
http.cors.allow-origin: "/.*/"
http.cors.enabled: true
Et maintenant au boulot ! #
On commence par modifier le format de log de apache afin de remonter les temps de réponses à l'aide de la directive LogFormat :
LogFormat "%{Host}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" **%D**" combined
Nous allons utiliser grok afin d'analyser nos logs apache. Celui-ci est "pré-équipé" d'un pattern pour les logs d'accès mais pas pour les logs d'erreurs. Nous devons donc définir ce pattern que nous utiliserons dans la configuration de notre Logstash.
Créer le fichier ~opt/logstash/patterns/extra
:
APACHE_ERROR_TIME %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{YEAR}
APACHE_ERROR_LOG \[%{APACHE_ERROR_TIME:timestamp}\] \[%{LOGLEVEL:loglevel}\] (?:\[client %{IPORHOST:clientip}\] ){0,1}%{GREEDYDATA:output}
Et maintenant, la configuration complète de Logstash. Celle-ci va récupérer vos fichier de logs en entrée, les analyser et extraire les variables qui nous intéressent (type d'erreur, temps de réponse, etc) et finalement les envoyer à notre instance Elasticsearch.
Créer le fichier ~opt/logstash/logstash-apache.conf
:
input {
file {
type => "apache_access"
path => "chemin_vers_votre_dossier_de_logs_apache/access.log"
start_position => beginning
}
file {
type => "apache_error"
path => "chemin_vers_votre_dossier_de_logs_apache/error.log"
start_position => beginning
}
}
filter {
if [type] == "apache_access" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}( \*\*%{POSINT:responsetime}\*\*)?" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
if [type] == "apache_error" {
grok {
patterns_dir => "./patterns"
match => { "message" => "%{APACHE_ERROR_LOG}" }
}
date {
match => [ "timestamp" , "EEE MMM dd HH:mm:ss yyyy" ]
}
}
if [clientip] {
geoip {
source => "clientip"
target => "geoip"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float" ]
convert => [ "responsetime", "integer" ]
convert => [ "bytes", "integer" ]
}
}
}
output {
elasticsearch {
host => "127.0.0.1"
index => "apache_logstash-%{+YYYY.MM.dd}"
}
}
Vous pouvez maintenant lancer Logstash à l'aide de la commande :
~/opt/logstash/bin/logstash -f ~/opt/logstash/logstash-apache.conf
Vous pouvez observer le résultat dans Kibana :
Et voilà ! Il ne vous reste plus qu'à créer un dashboard Kibana adapté à vos besoins.
Chez Occitech, on adore ! Nous le proposons même dans nos offres d'hébergement car nous sommes persuadés de la valeur ajoutée amenée par cet outil : quand est passé GoogleBot ? Sur quelles pages ? Par quelle page est entré le hacker de mon site Wordpress ? Quel est le temps de réponse moyen des mes pages ? Quelles sont les anomalies remontées dans les logs Apache ? A quelle fréquence ?
Si votre site est complexe et critique, vos développeurs sauront faire bon usage de cette mine d'informations !
Cet article vous a plu ? Sachez que nous recrutons !