点赞
评论
收藏
分享
举报
ES+Grafana展示NGINX HTTP应用访问态势
发表于2022-12-04 21:32

浏览 4.2k

目录

1章 容器化部署

1.1 ES部署

1.2 Kibana部署

1.3 Logstash部署

1.4 Grafana部署

2章 NGINX日志外发配置

3章 Grafana初始化配置

3.1 添加数据源

3.1.1 添加Elasticsearch数据源:

3.2 导入Dashboard模板

3.2.1 Dashboard模板文件

3.2.2 导入Elasticsearch模板

4章 Grafana视图展示

4.1 Dashboard模板介绍

4.2.Grafana视图变量介绍

4.3.NGINX性能延时日志


第1章 容器化部署

1.1 ES部署

1、调整服务器虚拟内存大小

vi /etc/sysctl.conf
#在最后一行添加
vm.max_map_count=262144
#执行如下命令 立即生效
/sbin/sysctl -p


2、创建宿主机配置文件目录和数据文件目录

#配置文件目录
mkdir -p /opt/es
#创建数据文件目录
注:建议服务器提前在数据目录下挂载两块大空量磁盘
/var/es-data/es-data1
/var/es-data/es-data1
#数据文件目录需要赋予权限
chmod -R 777 /var/es-data


3、宿主机创建elasticsearch.yml配置文件

#创建elasticsearch.yml配置文件
vi /opt/es/elasticsearch.yml
#如下配置信息供参考
#node名称
node.name: es-node-1
#
#数据存储目录
path.data: /usr/share/elasticsearch/data/es-data1,/usr/share/elasticsearch/data/es-data2
#
#网络地址
network.host: 0.0.0.0
#
#HTTP 端口
http.port: 9200
#
cluster.initial_master_nodes: ["es-node-1"]
#
#启用认证
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
#
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type

#编辑完成,保存退出


4、拉取镜像,并启动容器

#拉取镜像,测试使用7.17.7版本
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.7
#启动容器
docker run --name es -d \
-v /opt/es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /var/es-data:/usr/share/elasticsearch/data \
--log-opt max-size=100m --log-opt max-file=1 \
-e ES_JAVA_OPTS="-Xms2g -Xmx2g" \
-p 9200:9200 -p 9300:9300 \
docker.elastic.co/elasticsearch/elasticsearch:7.17.7

#设置容器的自动启动
docker update --restart always es


启动容器命令解释:

#--restart always,自动启动

#-v /opt/es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml,将本地宿主机的 /opt/es/elasticsearch.yml文件映射为容器内/usr/share/elasticsearch/config/elasticsearch.yml配置文件。

注:本地的elasticsearch.yml需要提前在宿主机目录编辑完成

#-v /var/es-data:/usr/share/elasticsearch/data, 将本地宿主机的/var/es-data目录映射为容器内/usr/share/elasticsearch/data数据目录。

注:本地宿主机目录需要提前创建好,数据目录设置对应访问权限。

#--log-opt max-size=100m --log-opt max-file=1,设置日志文件大小为100m,日志文件保存数量为一个。

#-e ES_JAVA_OPTS="-Xms2g -Xmx2g",设置数据为实际内存的一半,

注:该参数貌似不能动态修改,想要创建后再修改,最简单的方式是把容器停止、删除,再使用新的参数再建一个。

5、查看容器运行状态

docker ps |grep elasticsearch


6、设置es密码

#进入容器
docker exec -it es /bin/bash
#设置密码
./bin/elasticsearch-setup-passwords interactive

7、访问宿主机9200端口,访问运行中的es



1.2 Kibana部署

注:个人觉得Grafana的视图要比Kibana好看,但是Kibana查看日志格式和类型比较方便,所以一并安装,有需要的时候,启动Kibana容器,查看后停止即可。

1、创建宿主机配置文件目录

#配置文件目录
mkdir -p /opt/kibana


2、宿主机创建kibana.yml配置文件

#创建kibana.yml配置文件
vi /opt/kibana/kibana.yml
#如下配置信息供参考
#kibana端口
server.port: 5601

#kibana地址
server.host: "0.0.0.0"

#es地址,根据实际情况修改
elasticsearch.hosts: "http://192.168.101.190:9200"

#index设置
kibana.index: ".kibana"

monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.requestTimeout: 60000

#es用户名密码
elasticsearch.username: "elastic"
elasticsearch.password: "default"

#编辑完成,保存退出


3、拉取镜像,并启动容器

#拉取镜像
docker pull docker.elastic.co/kibana/kibana:7.17.7
#启动容器
docker run --name kibana -d \
-v /opt/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \
--log-opt max-size=100m --log-opt max-file=1 \
-p 5601:5601 docker.elastic.co/kibana/kibana:7.17.7
#启用容器的自动启动
docker update --restart always kibana


启动容器命令解释:

#--restart always,自动启动

#-v /opt/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml,将本地宿主机的/opt/kibana/kibana.yml文件映射为容器内/usr/share/kibana/config/kibana.yml配置文件。

注:本地的kibana.yml文件需要提前在宿主机目录编辑完成。

#--log-opt max-size=100m --log-opt max-file=1 设置日志文件大小为100m,日志文件保存数量为一个。


4、查看容器运行状态

docker ps |grep kibana


5、访问宿主机5601端口,输入用户名和密码访问运行中的kibana


1.3 Logstash部署

1、创建宿主机配置文件目录

#配置文件目录
mkdir -p /opt/logstash


2、宿主机创建logstash配置文件

#创建Nginx 日志logstash配置文件
vi /opt/logstash/ng-http.conf
#如下配置信息供参考
input {
udp {
port => 8512
type => "ng-http"
}
}
filter {
if [type] == "ng-http" {
mutate {
split => ["message","nginx: "]
add_field => { "tmp_log" => "%{[message][1]}" }
remove_field => [ "message" ]
}
json {
skip_on_invalid_json => true
source => "tmp_log"
}

mutate {
gsub => [
"proxy_host", "^.*~", "" #将proxy_host字段值中的开头至第一个~号结束,替换为无
]
}
if "-" in [X-Forwarded-For] {
geoip {
source => "remote_addr"
target => "geoip"
}
} else {
geoip {
source => "X-Forwarded-For"
target => "geoip"
}
}

}
mutate{
convert => { "bytes_sent" => "integer" }
convert => { "body_bytes_sent" => "integer" }
convert => { "request_time" => "float" }
convert => { "upstream_connect_time" => "float" }
convert => { "upstream_header_time" => "float" }
convert => { "upstream_response_time" => "float" }
}
ruby {
code => "
event.set('request_time', event.get('request_time') * 1000.0).to_i
event.set('upstream_connect_time', event.get('upstream_connect_time') * 1000.0).to_i
event.set('upstream_header_time', event.get('upstream_header_time') * 1000.0).to_i
event.set('upstream_response_time', event.get('upstream_response_time') * 1000.0).to_i
"
}
}
output {
if [type] == "ng-http" {
elasticsearch {
hosts => ["192.168.101.190:9200"] #ES IP 根据这实际情况修改
index => "logstash-ng-http-%{+YYYY.MM.dd}"
user => "elastic"
password => "xxxx" #ES 密码,根据实际情况修改
}
}
}


3、拉取镜像,并启动容器

#拉取镜像
docker pull docker.elastic.co/logstash/logstash:7.17.7
#启动容器
docker run --name logs-ng-http -d \
-v /opt/logstash/ng-http.conf:/usr/share/logstash/pipeline/ng-http.conf \
-e LS_JAVA_OPTS="-Xms512m -Xmx512m" \
--log-opt max-size=100m --log-opt max-file=1 \
-p 8512:8512/udp \
docker.elastic.co/logstash/logstash:7.17.7

#启用容器的自动启动
docker update --restart always logs-ng-http


启动容器命令解释:

#--restart always,自动启动

#-v /opt/logstash/ng-http.conf:/usr/share/logstash/pipeline/ng-http.conf,将本地宿主机的/opt/logstash/ng-http.conf文件映射为容器内/usr/share/logstash/pipeline/ng-http.conf配置文件。

注:上述文件需要提前拷贝至宿主机目录。

#--log-opt max-size=100m --log-opt max-file=1 设置日志文件大小为100m,日志文件保存数量为一个。

#-e LS_JAVA_OPTS="-Xms512m -Xmx512m",设置数据为实际内存的一半,

注:该参数貌似不能动态修改,想要创建后再修改,最简单的方式是把容器停止、删除,再使用新的参数再建一个

3、查看容器运行状态

docker ps |grep logstash



1.4 Grafana部署

1、创建宿主机数据文件目录

#数据文件目录
mkdir -p /var/grafana
#数据文件目录需要赋予权限
chmod -R 777 /var/grafana


2、拉取镜像,并启动容器

#拉取镜像
docker pull grafana/grafana
#启动容器
docker run --name grafana -d --restart always -p 3000:3000 \
-v /var/grafana:/var/lib/grafana \
--log-opt max-size=100m --log-opt max-file=1 \
grafana/grafana
#取消容器的自动启动
docker update --restart no grafana


启动容器命令解释:

#--restart always,自动启动

#-v /var/grafana:/var/lib/grafana,将本地宿主机/var/grafana数据目录映射为容器的数据目录:/var/lib/grafana

注:本地宿主机数据目录需要提前创建好,数据目录设置对应访问权限

#--log-opt max-size=100m --log-opt max-file=1 设置日志文件大小为100m,日志文件保存数量为一个

3、查看容器运行状态

docker ps |grep grafana


4、访问宿主机3000端口,访问运行中的grafana,初始用户名和密码为:admin/admin,初次登陆会提示修改密码。



第2章 Nginx日志外发配置

NGINX HTTP访问日志采用json格式采集,并配置syslog外发至logstash



配置代码如下:

#修改nginx.conf配置文件
http {
#设置日志格式为json格式以及需要发送的日志信息
log_format json '{"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"X-Forwarded-For":"$http_x_forwarded_for",'
'"remote_port":"$remote_port",'
'"server_addr":"$server_addr",'
'"server_name":"$server_name",'
'"server_port":"$server_port",'
'"server_protocol":"$server_protocol",'
'"time_local":"$time_local",'
'"request":"$request",'
'"request_length":"$request_length",'
'"request_uri":"$request_uri",'
'"request_method":"$request_method",'
'"request_time":"$request_time",'
'"status":"$status",'
'"bytes_sent":"$bytes_sent",'
'"body_bytes_sent":"$body_bytes_sent",'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"query_string":"$query_string",'
'"header_host":"$host",'
'"upstream_addr":"$upstream_addr",'
'"upstream_cache_status":"$upstream_cache_status",'
'"upstream_status":"$upstream_status",'
'"upstream_response_time":"$upstream_response_time",'
'"upstream_connect_time":"$upstream_connect_time",'
'"upstream_header_time":"$upstream_header_time",'
'"proxy_host":"$proxy_host",'
'"proxy_port":"$proxy_port",'
'"content_type":"$content_type",'
'"content_length":"$content_length",'
'"scheme":"$scheme"}';
#建议注释掉本地日志
# access_log /var/log/nginx/access.log json;
#设置日志通过syslog外发,server和端口为logstash的地址和端口
access_log syslog:server=192.168.101.190:8512 json;

#修改完成,保存退出,并reload配置
nginx -s reload


第3章 Grafana初始化配置

3.1 添加数据源

我们是通过Grafana展示ES的数据,所以添加数据源为Elasticsearch

3.1.1 添加Elasticsearch数据源:

点击Configuration\Data source,点击Add data source,添加数据源。



选择Elasticsearch,点击Select



Name:配置数据源名称,Default:是否设置为默认数据源

URL:输入Elasticsearch的访问url



Basic auth:启用认证

User:输入es的用户名

Password:输入es的密码



Index name:配置es索引名称

Time field name:选择@timestamp

Version:选择7.10+(使用版本为7.17.7



下拉至底部,点击Save & testIndex OK.Time field name OK,证明添加成功,Elasticsearch也工作正常。



3.2 导入Dashboard模板

3.2.1 Dashboard模板文件

以下为制作好的Dashboard模板,供参考

链接:https://pan.baidu.com/s/1JmwPW56x5Lc3ynOAgzh5Yw
提取码:j108


3.2.2 导入Elasticsearch模板

点击 +,点击Import进入Dashboard导入界面。



点击Upload JSON file,选择需要导入的dashboard模板文件,并点击Load



下方Select a Prometheus data source选择创建的数据源Elasticsearch-ng,并点击Import导入。



第4章 Grafana视图展示

4.1 Dashboard模板介绍

Grafana模板当前做了如下效果图展示,可以根据实际情况修改。





4.2 Grafana视图变量介绍

Dashboard中设置了变量,如下图中,设置变量使用后,我们选择要查看的Nginx_Server名称,这台服务器上部署的服务名称、服务IPUpstream名称等也一并被调出展示。


以下挑选部分变量介绍变量的设置方法:

Elasticsearch原始数据查看

可以点击选择Explore,数据源选择Elasticsearch-*Metric选择logs,查看Elasticsearch原始数据,

注:也可通过启用kibana容器查看kibana索引的方式查看,信息更全。


Nginx_Server变量设置如下:

现在我们需要将Nginx的服务器IP作为选择的变量进行过滤。

Namehost    #变量名称

TypeQuery

LableNginx_Server  #该变量在Dashboard中的显示名称

Data sourceElasticsearch-ng  #数据源设置为Elasticsearch-ng

Query{"find":"terms","field":"host.keyword"}

#通过查找host.keyword关键字的结果,并将结果中的值取出作为变量的值



服务名称变量设置如下:

现在我们需要将server_name的值作为变量取出来,关与负载设备变量关联。

变量名称:vs

Lable:服务名称  #设置变量标签名,Dashboard上面的显示名称

TypeQuery

Data sourceElasticsearch-ng  #数据源设置为Elasticsearch-ng

Query{"find":"terms","field":"server_name.keyword","query":"host.keyword:$host"}

#通过查找server_name.keyword关键字的结果,并将结果中的值取出作为变量的值,同时该变量关联名为host的变量,"query":"host.keyword:$host"



变量关联效果如下:

Nginx_Server选择后,后面的服务名称也会自动调用该设备上部署的反向代理服务,因为后面的Upstream名称变量和服务器IP变量也做了关联,其上可选择的Upstream和服务器均为该台设备配置有的反向代理后端服务名称和服务器IP


4.3 NGINX性能延时日志

Dashboard 做了一个应用访问实时延时的panel,用于展示,客户使用延时、应用建链延时、应用响应延时、应用处理延时共四种信息。


其对应的NGINX日志信息如下:

$request_time             #客户使用延时

$upstream_connect_time   #应用建链延时

$upstream_header_time    #应用响应延时

$upstream_response_time  #应用处理延时

根据百度到的一位大牛的NGINX源码分析。

(大牛链接如下:

https://www.cnblogs.com/AcAc-t/p/nginx_request_time_upstream_respone_time_analysis.html

$request_time,起始时间为Nginx接收到TCP包触发第一次可读event后,应用层正式读取数据前的时刻,而结束时间为应用层接收完全部数据,即将关闭连接前一时刻,不包括TCP三次握手建链和TCP四次挥手的时间,该时延大小即受NGINX到服务器的整体响应时间影响,也受客户端到NGINX的网络影响。

$upstream_connect_time,起始时刻为Nginx将与服务器建立连接前一刻,结束时刻为 NGINX  与服务器建立连接成功后,表示 NGINX  与服务器的TCP三次握手时延。

$upstream_header_time,起始时刻应为 NGINX  与服务器将建立连接前一刻,结束时刻为建立连接成功并在应用层接收header数据完成,表示 NGINX  与服务器的TCP三次握手时延+ NGINX  接收完服务器返回响应报头信息时延。

$upstream_response_time,起始时刻为NS将建立连接前一刻,结束时间为N接收完S全部响应数据将关闭连接前一刻,表示 NGINX  与服务器的TCP三次握手时延+ NGINX  接收完服务器返回的响应报头信息时延+ NGINX  接收完服务器处理后返回数据信息时延。

根据上述四种延时的数据对比,可以很方便的分析NGINX上部署的应用性能,并处理相关故障。

已修改于2023-03-04 02:19
本作品系原创
创作不易,留下一份鼓励
葫芦娃

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
葫芦娃
这家伙很懒还未留下介绍~
2
文章
0
问答
4
粉丝
相关文章
模块功能:ngx_cache_purgeisnginxmodulewhichaddsabilitytopurgecontentfromFastCGI,proxy,SCGIanduWSGIcaches.Apurgeoperationremovesthecontentwiththesamecachekeyasthepurgerequesthas.可以通过请求URL的方式来清理缓存,让缓存失效 proxy_cache_purgesyntax:proxy_cache_purgeon|off|[purge_all][fromall|[..]] default:none context:http,server,location Allowpurgingofselectedpagesfromproxy'scache. 配置案例: http{ proxy_cache_path/tmp/cachekeys_zone=tmpcache:10m; server{
点赞 1
浏览 4.2k
NginxSortedQuerystringModuleAmoduletoorderthequerystringparametersinavariabletobeusedascachekey.Requestslike/index.html?b=2&a=1&c=3,/index.html?b=2&c=3&a=1,/index.html?c=3&a=1&b=2,/index.html?c=3&b=2&a=1willproducethesamevaluefor $sorted_querystring_args 'a=1&b=2&c=3'.Itisalsopossibleremovesomeundesiredparameterdefiningitsnamewith sorted_querysting_filter_parameter,like sorted_querysting_filter_parameterb_foo; resultingina&nb
点赞 1
浏览 3.8k
原文作者:Derek DeJonghe of F5原文链接:全球首发 | 《NGINX 完全指南》中文版转载来源:NGINX 开源社区NGINX唯一中文官方社区 ,尽在 nginx.org.cn在社区
点赞 2
浏览 18.4k