背景
随着当今微服务架构服务越来越复杂,生产环境一旦出现故障,研发和运维人员排查线上故障的时间和难度也随之上升。
现在生成环境的微服务能抗海量QPS都会部署很多的副本容器,通过nginx或者其他负载均衡工具转发到微服务集群上。如果出现故障,研发人员会查看服务日志是否有异常,但是多台副本容器不可能手动登录每个容器内查看。所以需要有一种方案自动把多台副本容器的日志统一发送给某个地方存储,然后通过某种语法搜索展示。
本文会介绍使用filebeta采集nginx后端服务日志的方案,最终通过Kibana实时展示后端服务日志,这种架构方案在一般运维架构体系中使用的比较常见,实际生成环境比本文讲述的会复杂一些,但是大体的架构方案是类似的,接下来我们看下是如何实现的吧。
整体架构
- 采集nginx日志的整体架构分为
- 生产端: nginx及nginx链接的后端的应用日志。
- 采集端: 主要是持续采集ngix产生的日志。
- 持久化存储: 使用elasticsearch作为持久化存储数据库。
- 展示端: 使用Kibana作为web端展示和查询数据。
Elasticsearch
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
使用docker来安装Elasticsearch:
代码语言:javascript复制docker run --name elasticsearch -p 9200:9200
-p 9300:9300
-e "discovery.type=single-node"
-e ES_JAVA_OPTS="-Xms64m -Xmx128m"
-v /usr/local/data-docker/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
-v /usr/local/data-docker/elasticsearch/data:/usr/share/elasticsearch/data
-v /usr/local/data-docker/elasticsearch/plugins:/usr/share/elasticsearch/plugins
-d elasticsearch
filebeat
filebeat介绍
filebeat是用于转发和集中日志数据的轻量级传送工具。filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到elasticsearch或Logstash进行索引。
filebeat的工作方式如下:启动filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。
filebeat安装
使用filebeta的二进制文件安装,在服务器执行如下命令:
代码语言:javascript复制curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.0-linux-x86_64.tar.gz
tar -xzvf filebeat-7.7.0-linux-x86_64.tar.gz
filebeat配置
filebeat.inputs.paths: nginx的存储日志地址路径。output.elasticsearch.hosts: 是elasticsearch的地址。output.elasticsearch.index: 是elasticsearch的索引地址,通过时间戳创建。
代码语言:javascript复制filebeat.inputs:
- type: log
enabled: true
paths:
- /data/nginx_exporter/openresty-1.15.8.2/nginx/logs/bckend_access_json.log
json.keys_under_root: true
json.add_error_key: true
json.overwrite_keys: true
#setup.ilm.enabled: false
#
setup.template.enabled: true
setup.template.name: "filebeattest"
setup.template.pattern: "filebeattest-*"
setup.ilm.enabled: false
output.elasticsearch:
hosts: ["192.168.1.232:9200"]
index: "filebeat-testindex-%{ yyyy.MM.dd}"
执行命令
代码语言:javascript复制./filebeat -e -c filebeat_ng.yml -d "publish"
nginx Openresty
nginx是HTTP Server、反向代理服务器、邮件代理服务器、通用的TCP/UDP代理服务器。nginx features详细列出了nginx的功能特性。
如果想采集nginx的日志,需要额外安装Openresty模块。
下载Openresty
OpenResty是一个成熟的网络平台,它集成了标准的Nginx核心,LuaJIT,许多精心编写的Lua库,许多高质量的第三方Nginx模块以及大多数外部依赖项。它旨在帮助开发人员轻松构建可伸缩的Web应用程序,Web服务和动态Web网关。
代码语言:javascript复制wget -c https://openresty.org/download/openresty-1.15.8.2.tar.gz
tar zxvf openresty-1.15.8.2.tar.gz
下载nginx-module-vts
nginx-module-vts是Nginx的监控模块,能够提供JSON格式的数据产出。
代码语言:javascript复制git clone git@gitcode.net:mirrors/vozlt/nginx-module-vts.git
下载OpenSSL
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连线者的身份。这个包广泛被应用在互联网的网页服务器上。其主要库是以 C 语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。
代码语言:javascript复制wget -c https://github.com/openssl/openssl/archive/OpenSSL_1_0_2u.tar.gz
tar zxvf OpenSSL_1_0_2u.tar.gz
安装pcre包
代码语言:javascript复制yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
编译Openresty
编译Openresty需要用到上面软件,执行如下命令:
代码语言:javascript复制cd openresty-1.15.8.2.tar
./configure --prefix=/data/nginx_exporter/openresty-1.15.8.2 --with-luajit --with-pcre --with-http_iconv_module --with-http_realip_module --with-http_sub_module --with-http_stub_status_module --with-stream --with-stream_ssl_module --add-module=/data/nginx_exporter/nginx-module-vts --with-openssl=/data/nginx_exporter/openssl-OpenSSL_1_0_2u
make install
启动nginx
此时启动编译好的nginx,执行如下命令:
代码语言:javascript复制/d /data/nginx_exporter/openresty-1.15.8.2/nginx/sbin -c /nginx.conf
nginx的vts_status数据接口
在浏览器中输入服务器的ip/vts_status,可以看到nginx的所有流量数据等信息,包括: 传输上行和下行数据、请求量、响应错误量。
代码语言:javascript复制http://192.168.1.232/vts_status
nginx配置服务日志文件格式
在nginx配置会配置后端服务路径,通过path转发到后端服务中,然后访问后端服务产生服务日志,但是产生的日志格式不是标准的json格式。
接下来在nginx配置中使用logformat格式,可以自定义log日志字段。对一个接口请求,可以定义: remoteaddr、requesttime、responsestatus、request_method等常用接口字段。
代码语言:javascript复制http {
include mime.types;
default_type application/octet-stream;
log_format graylog2_json escape=json '{ "timestamp": "$time_iso8601", '
'"remote_addr": "$remote_addr", '
'"body_bytes_sent": $body_bytes_sent, '
'"request_time": $request_time, '
'"response_status": $status, '
'"request": "$request", '
'"request_method": "$request_method", '
'"host": "$host",'
'"upstream_cache_status": "$upstream_cache_status",'
'"upstream_addr": "$upstream_addr",'
'"http_x_forwarded_for": "$http_x_forwarded_for",'
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
access_log logs/access.log graylog2_json;
vhost_traffic_status_zone;
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream backend {
server 192.168.1.232:9999;
}
server {
listen 8010;
server_name localhost;
location /backend {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend/;
}
}
}
配置文件完成后,启动nginx,此时所有nginx日志会以json的形式存到文件中。
Kibana
Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。
安装
推荐使用docker方式安装,拉取镜像。
代码语言:javascript复制docker pull kibana:7.10.1
启动容器携带elasticsearch的ip和端口。
代码语言:javascript复制docker run --name kibana -e ELASTICSEARCH_URL=http://127.0.0.01:9200 -p 5601:5601 -d kibana:7.10.1
创建index
需要手动创建索引,索引的命名是filebta中filebeat-testindex-%{ yyyy.MM.dd}格式。
数据展示
添加完索引后,查看最近的数据就可以看到nginx的日志了,在fields字段中可以看到在nginx配置文件中定义的remoteaddr、requesttime、responsestatus、requestmethod等字段。
结语
回顾下本文主要介绍如何使用filebeta采集nginx后端服务日志的整个架构和思路,虽然本片文章和测试技术关联性不大,但是如果想扩展自己的技术深度和广度也要了解开发和运维的架构技术栈,开阔自己的技术视野和架构思维。