◆阮曉龍 董凱倫
基于ELK的Nginx反向代理日志分析與業(yè)務(wù)服務(wù)質(zhì)量評(píng)價(jià)體系研究與探索
◆阮曉龍1董凱倫2
(1.河南中醫(yī)藥大學(xué)信息技術(shù)學(xué)院 河南 450046;2.鄭州泰來(lái)信息科技有限公司 河南 450000)
為實(shí)現(xiàn)Nginx服務(wù)器生成的海量日志數(shù)據(jù)的分析,本文構(gòu)建了一個(gè)基于ELK框架的日志實(shí)時(shí)分析平臺(tái)?;谠撈脚_(tái)實(shí)現(xiàn)對(duì)歷史與實(shí)時(shí)的日志進(jìn)行數(shù)據(jù)挖掘,從運(yùn)維的多角度建立分析模型對(duì)海量日志進(jìn)行可視化分析,實(shí)現(xiàn)對(duì)業(yè)務(wù)的可視化分析及服務(wù)質(zhì)量的評(píng)價(jià)體系的建立。
ELK;數(shù)據(jù)挖掘;日志分析;Nginx;反向代理
目前,基于Web的信息傳播方式成為主流,對(duì)Web服務(wù)器性能要求更高,在實(shí)際應(yīng)用中,Web服務(wù)器的配置是有限的,不可避免會(huì)達(dá)到服務(wù)器性能瓶頸,從而造成服務(wù)響應(yīng)時(shí)間增長(zhǎng)、服務(wù)質(zhì)量下降。與此同時(shí),Web業(yè)務(wù)也是安全風(fēng)險(xiǎn)較高、易于受到網(wǎng)絡(luò)威脅、易于受到網(wǎng)絡(luò)攻擊的業(yè)務(wù)之一。
反向代理技術(shù)可通過(guò)中間代理的方式轉(zhuǎn)發(fā)客戶(hù)端請(qǐng)求,能有效解決Web服務(wù)器的性能瓶頸問(wèn)題,并且通過(guò)動(dòng)靜資源分離功能,可有效減輕Web服務(wù)器的負(fù)擔(dān)。反向代理在客戶(hù)端與真實(shí)Web服務(wù)器之間進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā),隔離客戶(hù)端與真實(shí)Web服務(wù)器的直接通信,防止真實(shí)Web服務(wù)器遭受攻擊,保證真實(shí)Web服務(wù)器的資源安全。
在反向代理中,Nginx的使用最為廣泛。Nginx自2004年發(fā)布以來(lái),其市場(chǎng)占有率呈逐年上升趨勢(shì),甚至在2019年4月首度登上Web服務(wù)器市場(chǎng)占有率第一名的寶座。Nginx記錄了整個(gè)反向代理的過(guò)程的詳細(xì)日志信息,包括代理的Web服務(wù)器的響應(yīng)狀態(tài)、時(shí)長(zhǎng)、報(bào)文長(zhǎng)度、請(qǐng)求IP等信息,通過(guò)對(duì)代理日志的分析可以直觀反映Web服務(wù)器的服務(wù)質(zhì)量以及存在的安全風(fēng)險(xiǎn)。
本文提出基于ELK(Elasticsearch、Logstash、Kibana)框架,實(shí)現(xiàn)對(duì)Nginx代理的海量日志進(jìn)行采集、清洗、存儲(chǔ)以及建立分析模型并形成可視化圖表。通過(guò)對(duì)日志信息進(jìn)行統(tǒng)計(jì)分析,了解Web服務(wù)器的負(fù)荷、服務(wù)運(yùn)行狀態(tài)以及針對(duì)耗時(shí)請(qǐng)求進(jìn)行優(yōu)化等,實(shí)現(xiàn)實(shí)時(shí)服務(wù)診斷,了解服務(wù)器與網(wǎng)絡(luò)的安全狀態(tài),為網(wǎng)絡(luò)安全決策者提供方案依據(jù)。進(jìn)而實(shí)現(xiàn)對(duì)Nginx代理的業(yè)務(wù)進(jìn)行全域的態(tài)勢(shì)感知,及時(shí)避免安全風(fēng)險(xiǎn),并對(duì)業(yè)務(wù)服務(wù)質(zhì)量進(jìn)行宏觀的實(shí)時(shí)評(píng)價(jià)。
反向代理服務(wù)是指一個(gè)代理服務(wù)器能夠代理外部網(wǎng)絡(luò)上的主機(jī)訪(fǎng)問(wèn)內(nèi)部網(wǎng)絡(luò)[1]。此時(shí)代理服務(wù)器對(duì)外就充當(dāng)一個(gè)“Web服務(wù)器”,但是這個(gè)“Web服務(wù)器”沒(méi)有Web文件,所有的動(dòng)態(tài)文件、靜態(tài)網(wǎng)頁(yè),都保存在內(nèi)部的Web服務(wù)器上。其具體的工作流程如圖1所示。
圖1 反向代理工作原理圖
Nginx在運(yùn)行過(guò)程中會(huì)記錄每次服務(wù)的全流程的詳細(xì)日志數(shù)據(jù),包括請(qǐng)求客戶(hù)端的地域來(lái)源、使用終端等信息,以及代理業(yè)務(wù)的每個(gè)站點(diǎn)的請(qǐng)求響應(yīng)相關(guān)信息[2]。其日志格式分兩種,分別為訪(fǎng)問(wèn)日志(access.log)、錯(cuò)誤日志(error.log),本文主要針對(duì)訪(fǎng)問(wèn)日志進(jìn)行配置與分析。
1.2.1配置文件結(jié)構(gòu)
Nginx服務(wù)器的配置文件nginx.conf文件的結(jié)構(gòu)主要由五個(gè)模塊組成,分別為全局塊、events塊、http塊、server塊、location塊。其關(guān)系結(jié)構(gòu)如圖2所示,其各塊的作用如表1所示。
圖2 配置文件結(jié)構(gòu)
表1 配置文件的模塊介紹
1.2.2 代理配置
本文主要進(jìn)行配置http塊中的“l(fā)og_format”參數(shù),以此來(lái)自定義Nginx日志的格式,其配置信息如下所示。
# 自定義日志格式
log_format main '$args # $binary_remote_addr # $body_bytes_sent # $content_length # $content_type # $document_root # $document_uri # $host # $hostname # $http_cookie # $http_host # $http_referer # $http_user_agent # $http_x_forwarder_for # $limit_rate # $nginx_version # $pid # $query_string # $realpath_root # $remote_addr # $remote_port # $remote_user #[$time_local] # "$request" # $request_body # $request_body_file # $request_completion # $request_method # $request_uri # $scheme # $sent_http_cache_control # $sent_http_connection # $sent_http_content_length # $sent_http_content_type # $sent_http_keep_alive # $sent_http_last_modified # $sent_http_location # $sent_http_transfer_encoding # $server_addr # $server_name # $server_port # $server_protocol # $uri' ' # $status ' ' # "$http_x_forwarded_for"';
表2 0000000000配置文件的字段介紹
為了方便Logstash對(duì)日志的切割清洗,這里使用特殊字符“#”將字段進(jìn)行隔開(kāi),下面介紹部分字段代表的信息,如表2所示。
為了規(guī)范管理代理的多個(gè)站點(diǎn),每個(gè)站點(diǎn)的配置設(shè)置一個(gè)專(zhuān)屬配置文件,且每個(gè)站點(diǎn)對(duì)應(yīng)一個(gè)專(zhuān)屬的日志文件,如其中一個(gè)站點(diǎn)的配置如下所示。
通過(guò)Filebeat(輕量級(jí)開(kāi)源日志文件數(shù)據(jù)搜集器)進(jìn)行日志的采集并推送至Logstash(數(shù)據(jù)收集引擎),Logstash將獲取日志數(shù)據(jù)進(jìn)行切割格式化發(fā)送至Elasticsearch(分布式搜索和分析引擎),Elasticsearch將格式化的日志數(shù)據(jù)進(jìn)行存儲(chǔ)、搜索和分析操作,最終通過(guò)Kibana(數(shù)據(jù)分析和可視化平臺(tái))建立數(shù)據(jù)進(jìn)行搜索、分析和建立統(tǒng)計(jì)圖表模型[3],如圖3所示。
圖3 日志采集框架
通過(guò)自定義配置日志格式后,取其中一條日志內(nèi)容如下所示。
- # xD3E!x9E # 0 # - # - # /var/www/html # / # glxgl.xg.hactcm.edu.cn # qs-agw # - # - # - # curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2 # - # 0 # 1.4.2 # 2448 # - # /var/www/html # 211.69.33.158 # 55705 # - #[02/Aug/2019:10:35:05 +0800] # "HEAD / HTTP/1.1" # - # - # OK # HEAD # / # http # - # close # 9790 # text/html # - # Wed, 16 Jan 2019 10:46:04 GMT # - # - # 211.69.33.161 # glxgl.xg.hactcm.edu.cn # 80 # HTTP/1.1 # / # 200 # "-"
通過(guò)指定Filebeat監(jiān)視日志文件,進(jìn)行日志數(shù)據(jù)采集,并將采集日志信息轉(zhuǎn)發(fā)至Logstash。
# 設(shè)置監(jiān)視的日志目錄
Logstash通過(guò)filter插件過(guò)濾解析input讀取的數(shù)據(jù),可以用grok插件正則解析數(shù)據(jù),date插件格式化日期,geoip插件獲取IP地理位置信息等等。
數(shù)據(jù)切割、格式化、清洗的配置內(nèi)容如下所示。
# 將其切割轉(zhuǎn)換成key-value格式
Kibana是一個(gè)開(kāi)源的分析與可視化平臺(tái),其與Elasticsearch一起使用。通過(guò)Kibana的搜索、查看存放在Elasticsearch中的數(shù)據(jù),繪制各種不同的圖表、表格、地圖等,直觀的展示數(shù)據(jù),從而達(dá)到數(shù)據(jù)分析與可視化目的。
經(jīng)處理的日志被推送至Kibana,Kibana上有一個(gè)“Discover”功能,可實(shí)時(shí)檢測(cè)采集的日志量變化趨勢(shì),以及處理后的日志詳細(xì)內(nèi)容,如圖4所示。
圖4 Kibana日志展示
基于采集的Nginx日志數(shù)據(jù)并結(jié)合其對(duì)應(yīng)的信息含義創(chuàng)建Nginx日志的分析模型,可分為日志統(tǒng)計(jì)、用戶(hù)行為分析、服務(wù)質(zhì)量分析三類(lèi),如表3所示。
表3 Nginx日志分析模型
以“網(wǎng)站響應(yīng)狀態(tài)”模型為例繪制一個(gè)餅狀圖,其步驟如下。
(1)在左側(cè)導(dǎo)航欄中選擇“可視化”,點(diǎn)擊【創(chuàng)建新的可視化】;
(2)選擇可視化類(lèi)型為“餅圖”;
(3)創(chuàng)建數(shù)據(jù)索引,選擇前面配置的索引名,即“nginx”;
(4)左側(cè)的“存儲(chǔ)桶”中點(diǎn)擊【拆分切片】,聚合選擇“次”,字段選擇“status.keyword”,并設(shè)置一個(gè)時(shí)間范圍設(shè)置為“今日”,點(diǎn)擊運(yùn)行圖標(biāo)進(jìn)行繪制,如圖5所示。
圖5 繪制餅狀圖
通過(guò)對(duì)分析模型的建立以及集中可視化呈現(xiàn),可有效掌握服務(wù)器的運(yùn)行狀況和服務(wù)質(zhì)量等相關(guān)信息,發(fā)現(xiàn)和排除錯(cuò)誤原因、了解客戶(hù)的訪(fǎng)問(wèn)分布以及全域業(yè)務(wù)態(tài)勢(shì)感知[4]。
基于“整體統(tǒng)計(jì)”類(lèi)模型的可視化展示,通過(guò)“業(yè)務(wù)請(qǐng)求總量”、“發(fā)送字節(jié)總量”、“響應(yīng)網(wǎng)站狀態(tài)”等指標(biāo)信息,感知業(yè)務(wù)的整體服務(wù)壓力與服務(wù)質(zhì)量。
基于“用戶(hù)行為”類(lèi)模型的可視化展示,從操作系統(tǒng)、瀏覽器、物理設(shè)備等工具分析用戶(hù)的使用偏好度,通過(guò)用戶(hù)對(duì)各網(wǎng)站的訪(fǎng)問(wèn)量,可分析用戶(hù)對(duì)業(yè)務(wù)偏好度;通過(guò)“用戶(hù)來(lái)源區(qū)域”可分析用戶(hù)的來(lái)源地理區(qū)域。
通過(guò)“各網(wǎng)站響應(yīng)狀態(tài)”、“各網(wǎng)站處理請(qǐng)求的時(shí)間”等分析模型,可分析業(yè)務(wù)的穩(wěn)定性,進(jìn)一步反應(yīng)業(yè)務(wù)的服務(wù)質(zhì)量。
通過(guò)從多運(yùn)維角度建立分析模型,多圖標(biāo)類(lèi)型繪制方式,最終將其集中匯總,可實(shí)現(xiàn)對(duì)全域業(yè)務(wù)的運(yùn)行情況的感知以及服務(wù)質(zhì)量的評(píng)價(jià),實(shí)現(xiàn)全域的態(tài)勢(shì)感知。
基于ELK的Nginx反向代理日志分析平臺(tái)的搭建,并對(duì)Nginx反向代理日志的分析方法的探索,以及對(duì)反向代理業(yè)務(wù)的服務(wù)質(zhì)量評(píng)價(jià)體系的研究,實(shí)現(xiàn)了對(duì)Nginx反向代理全域業(yè)務(wù)態(tài)勢(shì)感知。
[1]雷明彬.反向代理技術(shù)在數(shù)字化校園中的應(yīng)用[J].電腦與電信,2009(8).
[2]蘇翔宇,朱愛(ài)群. CentOS7下基于Nginx的反向代理及負(fù)載均衡研究與實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī)(專(zhuān)業(yè)版),2018,No.610(10):63-66.
[3]張彩云,牛永紅,趙迦琪. ELK日志分析平臺(tái)在系統(tǒng)運(yùn)維中的應(yīng)用[J].電子技術(shù)與軟件工程,2017(6):182-183.
[4]田昌鵬.基于Web日志分析的Web QoS研究[J].計(jì)算機(jī)科學(xué),2007,34(6):78-80.