什么是 ELK?
ELK 是 Elasticsearch、Logstash、Kibana 三大开源框架首字母大写简称。
Elasticsearch 是强大的数据搜索引擎,是分布式、通过 restful 方式进行交互的近实时搜索平台框架。
Logstash 是免费且开放的服务器端数据处理通道,能够从多个来源收集数据,转换数据后将数据发送到数据存储库中。能够动态地采集、转换和传输数据,不受格式和复杂度的影响。
Kibana 是针对 Elasticsearch 的开元分析及可视化平台,用于搜索、查看交互存储在 Elasticsearch 索引中的数据。
我们需要什么样的日志系统?
系统运维和开发人员需要通过日志(包括系统日志、程序日志、安全日志)去排查问题、分析系统运行情况、了解服务器的负荷等,以便及时采取应对措施。
在分布式系统中,构建一套集中式的日志系统可以提高我们定位问题的效率。
完整系统日志的特征:
收集:能够采集多种来源的日志数
传输:能够稳定把数据解析过来并传输至存储系统
存储:存储日志数据
分析:支持UI分享
警告:能够提供错误报告,有监控机制。
而ELK组合就是一套完整的日志系统
先下载Elasticsearch(按那睿的可瑞死)
Elasticsearch 是使用java开发的,所以需要JVM才可以跑起来。因此我们首先要安装一下JDK(或JRE),这里Elasticsearch 的最新版本需要JDK8(JRE8)及以上。我们执行:
sudo apt-get install default-jdk
来安装JDK环境。
安装完成后,我们执行
java -version
来看是否安装成功
JDK安装完成后,我们就可以来下载Elasticsearch的压缩包了。(我们这里使用压缩包方式安装,还有很多其他安装方式,请自行到官网查阅)。
sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.0.zip
进行解压了。
unzip elasticsearch-5.4.0.zip
配置Elasticsearch
切换目录
cd ~/elasticsearch/data/
编写 elasticsearch.yml
sudo vim elasticsearch.yml
加上 进行配置端口号
network.host: 127.0.0.1
network.bind_host: 127.0.0.1
transport.tcp.port: 9300
http.port: 9200
再切换到
cd ~/elasticsearch
执行
qq3175449063@node-1:~/elasticsarch/elasticsearch-5.4.0$ ./bin/elasticsearch
[2021-06-29T12:57:44,238][INFO ][o.e.n.Node ] [] initializing ...
[2021-06-29T12:57:44,736][INFO ][o.e.e.NodeEnvironment ] [9qD5p1I] using [1] data paths, mounts [[/ (/dev/sda1)]], net usable_space [171.7gb], net total_space [195.7gb], spins? [possibly], types [ext4]
[2021-06-29T12:57:44,737][INFO ][o.e.e.NodeEnvironment ] [9qD5p1I] heap size [495.3mb], compressed ordinary object pointers [true]
[2021-06-29T12:57:44,979][INFO ][o.e.n.Node ] node name [9qD5p1I] derived from node ID [9qD5p1IGRc6GnyIhVqjaRA]; set [node.name] to override
[2021-06-29T12:57:44,980][INFO ][o.e.n.Node ] version[5.4.0], pid[7768], build[780f8c4/2017-04-28T17:43:27.229Z], OS[Linux/4.15.0-142-generic/amd64], JVM[Private Build/OpenJDK 64-Bit Server VM/1.8.0_292/25.292-b10]
[2021-06-29T12:57:47,981][INFO ][o.e.p.PluginsService ] [9qD5p1I] loaded module [aggs-matrix-stats]
[2021-06-29T12:57:47,981][INFO ][o.e.p.PluginsService ] [9qD5p1I] loaded module [ingest-common]
[2021-06-29T12:57:47,981][INFO ][o.e.p.PluginsService ] [9qD5p1I] loaded module [lang-expression]
[2021-06-29T12:57:47,981][INFO ][o.e.p.PluginsService ] [9qD5p1I] loaded module [lang-groovy]
[2021-06-29T12:57:47,981][INFO ][o.e.p.PluginsService ] [9qD5p1I] loaded module [lang-mustache]
[2021-06-29T12:57:47,982][INFO ][o.e.p.PluginsService ] [9qD5p1I] loaded module [lang-painless]
[2021-06-29T12:57:47,982][INFO ][o.e.p.PluginsService ] [9qD5p1I] loaded module [percolator]
[2021-06-29T12:57:47,982][INFO ][o.e.p.PluginsService ] [9qD5p1I] loaded module [reindex]
[2021-06-29T12:57:47,982][INFO ][o.e.p.PluginsService ]
访问 127.0.0.1:9200/就安装成功了
出现的问题:
端口号被占用
ps -ef | grep Elasticsearch #查看某个端口情况
kill -9 pid #杀死该占用,pid如下图,如kill -9 2411
安装Logstash(不老的死打气)和nginx
介绍logstash
Logstash 是一个功能强大的工具,可与各种部署集成。 它提供了大量插件,可帮助你解析,丰富,转换和缓冲来自各种来源的数据。 如果你的数据需要 Beats 中没有的其他处理,则需要将 Logstash 添加到部署中。
下载logstash
sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-7.3.1.tar.gz
进行解压
tar zxvf logstash-7.3.1.tar.gz
安装nginx
yum repolist
yum install nginx
编写nginx
vi /etc/nginx/nginx.conf
nginx.conf的内容:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
upstream myserver{
server 192.168.115.128:8080;
server 192.168.115.128:8081;
}
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
##
# Basic Settings
##
log_format main2 '$http_host $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$upstream_addr" $request_time';
server {
listen 8088;#写内网端口,访问时用外网端口进行映射访问
server_name localhost;
location ~ .*\.(gif|jpg|jpeg|png)$ {
expires 24h;
root ~/images/;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path ~/images/ ;#代理临时路径
proxy_redirect off;
#日志路径
access_log /var/log/nginx/elk_access.log main2;
proxy_set_header Host 127.0.0.1;
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 1280k;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 40k;
proxy_buffers 40 320k;
proxy_busy_buffers_size 640k;
proxy_temp_file_write_size 640k;
if ( !-e $request_filename)
{
proxy_pass http://127.0.0.1:8088;#代理访问地址,和上面的端口一致
}
}
location / {
root html;
index index.html index.htm;
add_header X-Frame-Options SAMEORIGIN;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# alias ~/images/;
try_files $uri $uri/ /index.html last;
}
}
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
server{
listen 80;
server_name localhost;
location / {
root ~/workspace/ruogi-ui/dist;
index index.html index.htm;
}
}
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log mian;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
日志
log_format指令用来设置日志的记录格式,它的语法如下:
log_format name format {format ...}
其中name表示定义的格式名称,format表示定义的格式样式。
log_format有一个默认的、无须设置的combined日志格式设置,相当于Apache的combined日志格式,其具体参数如下:
log_format combined '$remote_addr-$remote_user [$time_local]'
‘"$request"$status $body_bytes_sent’
‘"$http_referer" "$http_user_agent"’
例如,创建一个名为mylogformat的日志格式,再$http_x_forwarded_forlog_for变量记录用户的X_Forwarded-For IP 地址:
log_format mylogformat '$http_x_forwarded_for_$remote_user [$time_local]'
‘"$request"$status $body_bytes_sent’
‘"$http_referer" "$http_user_agent"’
在日志格式样式中,变量$remote_addr和$http_x_forwarded_for用于记录IP地址;
$remote_user用于记录远程客户端用户名称;
$time_local用于记录访问时间与时区;
$request用于记录请求URL与HTTP协议;
$status用于记录请求状态,例如成功时状态为200,页面找不到时状态为404;
$body_bytes_sent用于记录发送客户端的文件主体内容大小;
$http_referer用于记录是从哪个页面链接访问过来的;
$http_user_agent用于记录客户浏览器的相关信息。
access_log /var/log/nginx/access.log mian;这个就是nginx日志保存地址
access_log /var/log/nginx/elk_access.log main2;这个就是记住访问过程中的日志地址
配置成功以后
编辑logstash 配置
vi ~/logstash/logstash-7.3.1/config/nginx_access.conf
内容加入
input {
file {
path => "/var/log/nginx/elk_access.log" start_position => "beginning"
type => "nginx"
}
}
filter {
grok {
match => { "message" => "%{IPORHOST:http_host} %{IPORHOST:clientip} - %{USERNAME:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:http_verb} %{NOTSPACE:http_request}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" %{NUMBER:response} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{QS:xforwardedfor} %{NUMBER:request_time:float}"}
}
geoip {
source => "clientip"
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "nginx-test-%{+YYYY.MM.dd}"
}
}
可能出现的问题
1内存不够,可能logstash过于大
先cd ~/logstash/logstash-7.3.1/bin$
再 vim logstash
加入下面的
LS_JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=128m -
XX:MaxPermSize=256m"
2启动出现:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000ca660000, 899284992, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 899284992 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home3175449063/logstash/hs_err_pid11296.log
查看内存使用情况
# free -m
创建swapfile
# dd if=/dev/zero of=swapfile bs=1024 count=500000
count=空间大小 of空间名字
将swapfile设置为swap空间
# mkswap swapfile
启用交换空间,这个操作有点类似于mount操作
# sudo swapon swapfile (删除交换空间 swapoff swapfile)
就解决了
进行启动
3logstash出现如下报错,是之前运行的instance有缓冲
Logstash could not be started because there is already another instance using the configured data directory. If you wish to run multiple instances, you must change the "path.data" setting.
需要进入/logstash-7.3.1/data 删除.lock 文件之后重新启动即可
cd ~/logstash/logstash-7.3.1/data && rm -rf .lock
启动logstash
cd ~/logstash/
再
sudo ./logstash-7.12.1/bin/logstash -f logstash-7.12.1/config/nginx_access.conf
安装Kibana(k把拿)
Kibana :是一个开源的分析和可视化平台,旨在与 Elasticsearch 合作。Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析,并在各种图表、表格和地图中可视化数据
下载
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.5-linux-x86_64.tar.gz
解压
tar -zxvf kibana-7.12.1-linux-x86_64.tar.gz
配置文件
vi ~/kibana/kibana-7.12.1-linux-x86_64/config/kibana.yml
server.port: 5601
server.host: "127.0.0.1"
elasticsearch.hosts: ["http://127.0.01:9200"]
i18n.locale: "zh-CN" #kibana设置中文模式
进行启动
cd vi ~/kibana/kibana-7.12.1-linux-x86_64/
sudo ./bin/kibana
[sudo] qq3175449063 的密码:
log [03:23:15.859] [info][status][plugin:kibana@5.4.0] Status changed from uninitialized to green - Ready
log [03:23:16.081] [info][status][plugin:elasticsearch@5.4.0] Status changed from uninitialized to yellow - Waiting for Elasticsearch
log [03:23:16.095] [info][status][plugin:console@5.4.0] Status changed from uninitialized to green - Ready
log [03:23:16.105] [info][status][plugin:metrics@5.4.0] Status changed from uninitialized to green - Ready
http://127.0.0.1:5601
访问127.0.0.1:5600就成功了
上面就是记录nginx日志的全过程 使用的是ELK,昨天给公司部署用了一个晚上,总结遇到问题和过程给大家,访问127.0.0.1:8088就成功了,谢谢大家的支持 介绍nginx
代理与反向代理
代理服务器是位于客户端和原始服务器的一台中间服务器,为了从原始服务器获取到内容,客户端向代理服务器发送一个请求并带上目标服务器(原始服务器),代理服务器在接收到请求后就会将请求转发给原始服务器,并将从原始服务器上获取到的数据返回给客户端,代理服务器是代理的客户端,所以一般客户端是知道代理服务器的存在的,比如翻墙就用了代理服务器。
反向代理服务器是位于原始服务器端的服务器,反向代理服务器接受来自互联网的请求,然后将这些请求发送给内网的服务器,并将从内网的服务器获取结果返回给互联网上的客户端,反向代理服务器是代理的服务端,所以客户端是不知道反向代理服务器的存在的,服务端是知道反向代理服务器的。
代理服务器的作用
1. 访问原来无法访问的资源
2. 用作缓存,加速访问速度
3. 对客户端访问授权,上网进行认证
4. 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理服务器的作用
1. 保护内网安全
2. 负载均衡
3. 缓存,减少服务器的压力
nginx的作用
1.反向代理,将多台服务器代理成一台服务器
2.负载均衡,将多个请求均匀的分配到多台服务器上,减轻每台服务器的压力,提高服务的吞吐量
3.动静分离,nginx可以用作静态文件的缓存服务器,提高访问速度
nginx的详细配置
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况