Не для кого не секрет, что удобное, централизованное место сбора и обработки логов в наше время является хорошим тоном при построение архитектуры для вашего приложения и вашей команды разработчиков.
Часто встречаться проекты с очень небольшими бюджетами и маленькими инфраструктурами. Расчитывать такие проекты на большой распределенный кластер Elastic — не могут, т.к. стек очень требователен к ресурсам: оперативной памяти (java такая java), кол-во нод в кластере (минимум 3), дисковое пространство (для реплицирования индексов) и т.д. …
Я предлагаю рассмотреть вариант бюджетного Elastic c Kibana и собирать логи, к примеру, от web сайта — забирать nginx access логи c помощью Filebeat.
Поднимать будем в докере, код конфигурационных файлов и docker-compose файл ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
version: '2' services: elasticsearch: build: context: elasticsearch/ args: ELK_VERSION: 6.4.2 volumes: - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro ports: - "9200:9200" - "9300:9300" environment: ES_JAVA_OPTS: "-Xmx1024m -Xms1024m" ELASTIC_PASSWORD: somepassword networks: - elk kibana: build: context: kibana/ args: ELK_VERSION: 6.4.2 volumes: - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro ports: - "127.0.0.1:5601:5601" networks: - elk depends_on: - elasticsearch networks: elk: driver: bridge |
Обращаем внимание на версию ELK. Также внимательно к параметру ES_JAVA_OPTS — сколько оперативной памяти будет выделено для контейнера с elastic.
Файлы конфигов
1 |
cat ./elasticsearch/config/elasticsearch.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
--- ## Default Elasticsearch configuration from elasticsearch-docker. ## from https://github.com/elastic/elasticsearch-docker/blob/master/build/elasticsearch/elasticsearch.yml # cluster.name: "docker-cluster" network.host: 0.0.0.0 # minimum_master_nodes need to be explicitly set when bound on a public IP # set to 1 to allow single node clusters # Details: https://github.com/elastic/elasticsearch/pull/17288 discovery.zen.minimum_master_nodes: 1 ## Use single node discovery in order to disable production mode and avoid bootstrap checks ## see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html # discovery.type: single-node ## X-Pack settings ## see https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html # # xpack.license.self_generated.type: trial xpack.security.enabled: false |
1 |
cat ./kibana/config/kibana.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
--- ## Default Kibana configuration from kibana-docker. ## from https://github.com/elastic/kibana-docker/blob/master/build/kibana/config/kibana-full.yml # server.name: kibana server.host: "0" elasticsearch.url: http://elasticsearch:9200 xpack.monitoring.ui.container.elasticsearch.enabled: true ## X-Pack security credentials # elasticsearch.username: "admin" elasticsearch.password: "superpassword12345!" |
Запускаем наш стек
1 |
docker-compose up -d |
Имеем два контейнера:
1 2 3 4 |
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 81adb0de01bd docker-elk_kibana "/usr/local/bin/ki..." 28 hours ago Up 28 hours 127.0.0.1:5601->5601/tcp docker-elk_kibana_1 a62c3cc2de75 docker-elk_elasticsearch "/usr/local/bin/do..." 28 hours ago Up 28 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp docker-elk_elasticsearch_1 |
На нашем корневом сервере установим nginx и создадим vhost файл для доступа к Kibana, а также настроим web авторизацию для Kibana которая будет находиться внутри данного конфига nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
server { listen 80; server_name kibana.mydomainname; access_log /var/log/nginx/kibana.access.log; error_log /var/log/nginx/kibana.error.log; # rewrite ^ $scheme://kibana.mydomainname permanent; #301 location / { proxy_pass http://127.0.0.1:5601; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 10m; auth_basic "Restricted Content"; auth_basic_user_file /etc/nginx/.htpasswd; } location /403.html { return 403; } } |
Сгенерируем для пользователя админ хеш пароля и положим содержимое в файл /etc/nginx/.htpasswd
1 2 3 4 |
~ htpasswd -n admin New password: Re-type new password: admin:$apr1$q.Yu8wC9$EcHtLamvtnnrLM3FSXn1V0 |
Мониторинг нашего кластера, будет показывать yellow state, это как раз и связано с тем, что у нас всего 1 сервер.
Теперь преступим к установке Filebeat, для debian качаем deb файл и устанавливаем.
1 2 |
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-oss-6.4.2-amd64.deb dpkg -i filebeat-oss-6.4.2-amd64.deb |
1 2 |
# filebeat version filebeat version 6.4.2 (amd64), libbeat 6.4.2 [e193f6d68b25b7ddbe3a3ed8d60bc07fea1ef800 built 2018-09-26 12:42:46 +0000 UTC] |
Не забываем включить в автозагрузку и запустить сервис.
1 2 3 |
systemctl enable filebeat service filebeat start service filebeat status |
Включим модуль для логирования nginx
1 |
filebeat modules enable nginx |
Пропишем в файле конфигурации путь к лог файлам
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# cat /etc/filebeat/modules.d/nginx.yml - module: nginx # Access logs access: enabled: true # Set custom paths for the log files. If left empty, # Filebeat will choose the paths depending on your OS. #var.paths: var.paths: ["/var/log/nginx/domain.com/access.log"] # Error logs error: enabled: true # Set custom paths for the log files. If left empty, # Filebeat will choose the paths depending on your OS. #var.paths: var.paths: ["/var/log/nginx/domain.com/error.log"] |
Основной файл конфигурации Filebeat на данной ноде, в данном файле также можно настроить логирование дополнительно, к пример у от вашего приложения myappname
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# cat /etc/filebeat/filebeat.yml | grep -v "#" filebeat.inputs: - type: log enabled: yes paths: - /var/www/myappname/storage/logs/*.log filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false setup.template.settings: index.number_of_shards: 1 setup.kibana: output.elasticsearch: hosts: ["IP_of_elastic_server:9200"] protocol: "http" |
Перезагружаемся
1 |
service filebeat restart |
Выполним команду и проверим, что у нас есть соединение с Elastic.
1 2 3 4 5 6 |
filebeat setup -e \ -E output.logstash.enabled=false \ -E output.elasticsearch.hosts=['IP_of_elastic_server:9200'] \ -E output.elasticsearch.username=admin \ -E output.elasticsearch.password=superpassword12345! \ -E setup.kibana.host=kibana.mydomainname |
После всего проделанного наши логи успешно приезжаю и можно строить уже различные графики, фильтры, дашборды 😉