宋斌偉?鄧汪濤?馬騁犇?阮曉龍



摘? 要:Nginx日志詳細記錄了網站訪問信息,可從中了解網站運行實況和用戶訪問行為,分析Nginx日志,可洞悉業務整體負載情況,幫助優化服務器結構,避免業務安全和運行事故,提升競爭力。基于Elasticsearch,構建日志實時采集、清洗、存儲的完整日志處理流程,自主開發Nginx日志分析平臺,實現日志實時分析與可視化,并探討總結了平臺自底向上的高可用設計。在實踐中應用表明,該平臺具有很高的日志分析、業務洞悉能力,能有效指導智能監控運維工作。
關鍵詞:Nginx;日志分析;Elasticsearch;實時監控;智能監控
中圖分類號:TP311? ? ? ?文獻標識碼:A文章編號:2096-4706(2022)06-0001-08
Research and Implementation of Nginx Log Analysis Platform Based on Elasticsearch
SONG Binwei1, DENG Wangtao1, MA Chengben1, RUAN Xiaolong2
(1.Shangzhen Shuyuan, Henan University of Chinese Medicine, Zhengzhou? 450046, China; 2.School of Information Technology, Henan University of Chinese Medicine, Zhengzhou? 450046, China)
Abstract: The Nginx log records the access information of the website in detail, from which we can understand the current operation situation of the website and the users access behavior. Analyzing the Nginx log can insight into the overall load situation of the business, help to optimize the server structure, avoid business security and operation accidents, and enhance competitiveness. Based on Elasticsearch, this paper constructs a complete log processing flow of real-time log collection, cleaning and storage, independently develops the log analysis platform of Nginx, realizes real-time log analysis and visualization, and discusses and summarizes the bottom-up high availability design of the platform. The practical application shows that the platform has high ability of log analysis and business insight, which can effectively guide the operation and maintenance of intelligent monitoring.
Keyword: Nginx; log analysis; Elasticsearch; real-time monitoring; intelligent monitoring
0? 引? 言
日志一般指服務器自動創建和維護的文件,是系統運行監控、異常服務預警、服務器性能監控的重要數據來源,對于任何平臺而言均是重要的構成部分。隨著5G互聯網時代的到來,服務器日志數量正在呈指數級增長且分散存儲,日志結構日趨復雜,結構化與非結構化日志混雜,導致傳統的日志分析方式[1,2]已不能滿足現如今的日志分析需求。以往,運維人員只能通過遠程管理工具連接到對應的服務器,以人工的方式進行事故后、靜態的日志分析和審計操作。正是因為這種狀況的普遍存在,所以出現了以Elastic Stack為代表的日志分析套件,主要包括Beats、Logstash、Elasticsearch和Kibana等軟件組合,通過組合使用以實現完整日志可視化分析。這種方式具備眾多優點,如配置便捷、數據可視等,但是也存在局限性,比如特定業務使用其Kibana組件,并不能滿足定制化日志分析需求。
針對Elastic Stack自身功能存在的局限性,本文基于其核心組件Elasticsearch自主設計開發了一套Nginx日志分析平臺。在開發過程中設計了體系完整的Nginx日志分析模型,以實現多元化日志可視化分析。在部署過程中進行了整體高可用設計,以滿足平臺的無間斷服務需求。整個平臺旨在將日志數據實時、完整、清晰地呈現在運維人員或用戶面前,打造一個建的成、看得見、管得住、用得好的日志大數據分析平臺。
1? 相關研究
國內外很多研究機構和重點實驗室均做了日志分析領域的相關研究,如莫斯科技術大學、清華大學智能技術與系統國家重點實驗室、中國科學技術大學等。
文獻[3]分析了大數據的可能來源以及相關處理的問題,提出了一種基于Elasticsearch引擎和MapReduce模型的系統來解決用戶驗證的問題。文獻[4]通過研究日志大數據分析,來提高搜索引擎查詢信息的能力。文獻[5]使用了Flume、Elasticsearch以及Kibana等技術手段,提出一種分布式的日志采集分析系統,論證了Flume的分布式的日志采集分析系統方案具有可行性。文獻[6]基于ELK Stack建設系統,探索了其工作原理。文獻[7]設計了一種基于云計算的Hadoop集群框架的Web日志分析平臺,在集群中運用分布式算法處理海量的Web日志數據。文獻[8]基于ELK技術棧,結合Kafka探索了智慧運維大數據分析平臺的解決方案。5201FFD8-8CFA-400F-A3C5-4C10FFCBC5BA
可見,在日志分析領域大多使用開源技術棧來進行,特別是以Elastic Stack為代表的開源日志解決方案,在高校校園網[9]、天文系統[10]、氣象學[11]等均有相關的運用和實踐,并且有著相對不錯的應用效果。但是基于開源軟件建設日志分析平臺,對于特定業務場景下的日志分析工作,凸顯出分析模型單一、配置不夠靈活多樣的問題,不能很好根據實際狀況滿足分析需求。本文在此基礎之上,基于Elasticsearch進一步自主研發Nginx日志分析平臺,滿足Nginx日志分析的特定需求。
2? 基于Elasticsearch的日志分析平臺
2.1? 架構設計
本平臺結合Nginx日志所存儲的服務器物理環境多樣化的實際情況,為保證平臺的可靠性、可擴展性,結合多服務器采集的分布式平臺架構的核心思想,分層設計了主要包括日志采集、日志清洗、日志存儲、可視化平臺等4大模塊,架構如圖1所示。
2.2? 日志實時采集
日志實時采集是日志分析平臺的基礎工程,目前很多應用服務是分布在不同的物理或虛擬化服務器上的,怎樣將這些分散的日志聚合起來,是需要解決的重要問題。本平臺采用了Beats進行分布式部署,構建日志實時采集系統。
Beats是各種單一采集器的集合,安裝后被作為輕量型Agent。常用的Beats采集器有采集日志文件的Filebeat、采集服務器性能指標的Metricbeat、采集網絡數據的PacketBeat等。
本平臺采用Filebeat采集Nginx日志數據。Filebeat工作時會啟動一個或多個探測器,根據提前指定的文件路徑找到日志文件。對于找到的每個日志文件,探測器會啟動相應的harvester進程,進行日志文件的實時收集,并不斷發送到Spooler中集合,最后將日志送往指定的區域。本平臺中是把日志發送到Logstash中進一步處理,工作流程如圖2所示。
2.3? 日志清洗
日志清洗是通過切分數據、靜態連接等方式,將日志數據轉換為Key-Value的過程。本平臺使用Logstash實現日志清洗,其在日志分析中充當porter,是數據源與數據存儲之間的橋梁。
Logstash接收從多種數據源頭的輸入,對數據進行分析、過濾、統一格式后輸出到用戶指定的儲存庫當中。Logstash工作時創建Pipeline,包括Input、Filter和Output完整的工作流程,其中Input用于從數據源獲取數據,Filter用于處理數據,Output用于數據輸出。
本平臺將分布式的Beats中的日志數據作為Input,通過Filter將日志數據進行清洗,最后Output將數據輸出到Elasticsearch集群中進行存儲。在這個過程中Filter是關鍵,一般使用Grok插件實現正則過濾,清洗原始日志,工作步驟如圖3所示。
2.4? 日志存儲
Elasticsearch是一個在Lucene基礎之上建立起來的分布式多用戶能力的全文搜索引擎,可以集中進行數據存儲,基于RESTful API,具有實時搜索、穩定、可靠、快速的特性,可滿足日志大據分析的存儲需求。
Elasticsearch以集群方式部署,節點分為Master Node、Data Node、Client Node。Master Node負責集群當中的數據負載均衡和數據索引的創建、刪除等;Data Node負責數據的存儲、搜索和索引,負載壓力較大,對服務器的配置要求相對較高;Client Node負責路由請求,對不同的請求進行分發、匯總的操作,本質上是負載均衡,以適合高并發的日志存儲場景。
本平臺使用5臺服務器建設Elasticsearch存儲集群,服務器使用CentOS操作系統,建設1個Master Node、4個Data Node的以實現高容量、高可靠、高性能的存儲,拓撲結構如圖4所示。
2.5? 日志分析平臺
日志分析平臺是日志大數據分析的最后一步,可視化呈現將數據庫中抽象的數據轉換成直觀的圖表,幫助用戶看見重要信息,通過圖表洞悉業務。
本平臺自主研發構建日志可視化分析平臺。前端使用Vue可以極大的縮減開發周期,View UI是建立在Vue的開源UI庫,使用這兩個框架,進行快速開發迭代,給平臺的界面帶來了美觀的直觀感受,充分提升了用戶體驗。后端使用PHP框架Yii實現MVC設計模式,后端代碼更簡潔優雅,對關系型和非關系型數據庫提供查詢生成器,對RESTful API進行支持。本平臺使用Yii框架與Elasticsearch集群交互,獲取實時日志數據,實現秒級數據讀取和前端渲染。Mariadb數據庫主要作為數據緩沖池,并存儲日志分析平臺所需要的賬號信息等。
日志可視化分析平臺,使用容器技術docker,分別部署Web服務集群和數據庫服務集群。部署結構如圖5所示。
部署的關鍵腳本為:
# pull docker images
docker pull php:7.2.34-apache
docker pull mariadb:10.7
# create directory
mkdir -p /data/qianniuhua-app/manage
mkdir -p /data/qianniuhua-app/portal
mkdir -p /data/qianniuhua-db
mkdir -p /data/qianniuhua-conf
# create network5201FFD8-8CFA-400F-A3C5-4C10FFCBC5BA
docker network create -d bridge qianniuhua-network
# run container
docker run -d -p 3306:3306 --privileged=true --network qianniuhua-network -e MYSQL_ROOT_PASSWORD=qianniuhua@1q2w -v /data/qianniuhua-db/:/var/lib/mysql:rw --name qianniuhua-db mariadb:10.7
docker run -d -p 80:80 --privileged=true --network qianniuhua-network -v /data/qianniuhua-app/:/var/www/html:rw -v /data/qianniuhua-conf/:/etc/apache2/sites-enabled:rw --name qianniuhua-app php:7.2.34-apache
cp -r app/* /data/qianniuhua-app/
cp -r conf/* /data/qianniuhua-conf/
docker restart qianniuhua-app
3? 高可用設計
3.1? 日志采集清洗的高可用
日志采集清洗要保證在服務器日志采集、日志推送、日志清洗過程的高效性和可靠性。
本平臺將Filebeat部署在不同目標服務器上,實現單臺服務器內部的日志集中采集和主動推送。由于日志數據量大,為避免數據丟失,提高峰值處理能力,在日志推送過程中加入Kafka消息隊列,對日志數據進行隊列化管理直到日志被處理,防止丟失。在日志量激增時,Kafka采用的緩沖機制,可有效提高日志數據處理能力,保證高效性。
部署多節點Logstash,避免因單點故障造成日志清洗功能不可用,實現數據處理的容災。在Logstash集群中,對每一個Logstash配置允許多個輸入源,用于處理Kafka中Filebeat推送的日志,對于輸出也配置允許多個輸出源,配合Elasticsearch集群,輸出到不同的Data Node節點,實現數據的多復制、多備份,實現日志采集清洗的高可用。
3.2? 日志存儲系統的高可用
日志存儲系統的高可用,就是對數據寫入、存儲、讀取過程采用彈性伸縮和冗余機制,保證數據高效讀寫和數據多備份。
本平臺采用集群實現高可用,使用了多臺物理服務器和物理存儲作為部署的基礎環境,在此基礎上采用Kubernetes架構,部署主節點和工作節點,實現可以承載容器的云原生環境,通過docker部署Elasticsearch集群實現數據的冗余存儲和備份。由于集群docker處在Kubernetes構建的云原生環境,因此具備彈性伸縮和修復能力。
在Kubernetes的管理下,Elasticsearch集群可以保持在數據存儲過程中,出現資源不夠情況下自動創建容器,為Elasticsearch集群增添Data Node。Kubernetes主節點中關鍵組件Controller Manager是高可用的關鍵,提供了故障,愈功能,在工作節點上運行的容器,旦出現故障,Kubernetes會自動拉起一個新的容器,如果是工作節點自身的故障,會進行自動故障轉移,保證在Kubernetes管理下的容器可以實現無間斷服務,實現了日志存儲系統的高可用。
3.3? 日志分析平臺的高可用
日志分析平臺的高可用從本質上來講,就是Web服務系統的高可用。
本項目使用Docker集群部署2個日志分析平臺,通過Nginx反向代理進行負載均衡的發布。使用Docker集群部署3個MariaDB數據庫服務,通過主從同步方式建設MariaDB Cluster,實現數據庫服務的讀寫分離,并保證數據一致性。部署結構如圖6所示。
3.4? 安全加固
本平臺通過安全加固保證Web服務的穩定性,數據庫的安全性。具體如下:
(1)操作系統層面。利用防火墻和SELinux,限制訪問關鍵性端口,配置僅保留一個入口供代理服務器訪問。嚴格系統賬戶管理,禁止root用戶遠程登錄,刪除非必要用戶。
(2)業務服務層面。使用Nginx反向代理,將客戶端直接到Web服務端的連接方式分離開,隱藏Web服務真實IP,提供安全保障。同時,代理服務器可作為應用層防火墻,為網站提供多種防護。
(3)數據庫層面。配置數據庫到內部不常用端口,并限制其只對內部提供服務,外部禁止連接。
(4)安全防護層面。使用Nmap定期對服務器和各項業務進行掃描,檢測操作系統、云原生平臺、容器、網站服務、數據庫的安全性,掃描常見漏洞和弱口令,開展針對性的安全加固配置。
4? 應用成效
4.1? 日志分析平臺的建設成效
本平臺的日志數據來源為河南中醫藥大學信息技術學院教學云平臺,教學云平臺目前提供有17套軟件服務、68項網站服務,每日新增訪問日志數據為2~5萬條。本系統對教學云平臺的業務服務日志進行分析,實現訪問數據概覽、業務運行實況、網站訪問分析、資源訪問分析和用戶畫像等。
本平臺訪問時需要登錄,如圖7所示,輸入賬號密碼并完成驗證后登錄。數據概覽功能通過生成多種圖表來展示日志數據,洞悉教學云平臺實時運行服務狀態,如圖8所示。運行實況功能監控實時訪問情況,每60 s刷新訪問量曲線和訪問詳情列表,如圖9所示。訪客分析功能包括訪客分布、訪問方式等子功能,形成訪客畫像,洞察用戶使用何種瀏覽器、操作系統瀏覽網站最多等,指導運維人員對服務器和業務針對性優化,提升服務質量,如圖10所示。數據洞察功能包括盯屏分析、數據統計、數據透視的子功能,具體是統計并展示整體的日志數據指標,如圖11所示。5201FFD8-8CFA-400F-A3C5-4C10FFCBC5BA
4.2? Nginx日志分析模型
本平臺結合Nginx原始日志字段,在數據清洗時引入GeoIP等數據,清洗后數據存儲的字段共67個,關鍵字段含義如表1所示。
清洗后JSON格式的日志數據的單條示例為:
{
“type”: “agwlog”,
“content_type”: “-”,
“client_addr”: “外網”,
“request_method”: “GET”,
“sent_http_connection”: “close”,
“server_addr”: “211.69.33.161”,
“args”: [
“...”
],
“@timestamp”: “2022-01-19T10:36:35.757Z”,
“sent_http_location”: “-”,
“nginx_version”: “1.14.1”,
“sent_http_keep_alive”: “-”,
“index_array”: [
“...”
],
“sent_http_last_modified”: “Tue, 11 Jan 2022 11:07:46 GMT”,
“messagedata”: “topic”,
“scheme”: “http”,
“http_referer”: “-”,
“ua_os”: “Windows 7”,
“sent_http_transfer_encoding”: “chunked”,
“sent_http_cache_control”: “-”,
“server_name”: “it.hactcm.edu.cn”,
“ua_br”: “IE 9”,
“binary_remote_addr”: “tr\\x15\\x0A”,
“content_length”: “-”,
“request_uri”: “/”,
“pid”: “14016”,
“ua_se”: “direct”,
“request_body”: “-”,
“remote_user”: “-”,
“remote_addr”: “116.114.21.10”,
“server_port”: “80”,
“query_string”: “-”,
“limit_rate”: “0”,
“realpath_root”: “/usr/share/nginx/html”,
“http_x_forwarded_for”: “\”-\””,
“sent_http_content_length”: “-”,
“sent_http_content_type2”: [
“...”
],
“request_completion”: “OK”,
“accept_length”: 365,
“http_post”: “-”,
“n_host”: “it.hactcm.edu.cn”,
“request”: “\”GET / HTTP/1.1\””,
“document_root”: “/usr/share/nginx/html”,
“sent_http_content_type”: [
“...”
],
“uri”: “/”,
“request_body_file”: “-”,
“server_protocol”: “HTTP/1.1”,
“local_time”: “2022-01-19T10:36:48.000Z”,
“server_name_ana_arr”: [
“...”
],
“status”: “200”,
“sent_http_content_type_addr”: “html”,
“local_time_arr”: {},
“sent_http_content_type1”: “ text”,
“body_bytQes_sent”: “ 378”,
“http_cookie”: “”,
“geoip”: {},
“@version”: “1”,
“http_x_forwarder_for”: “-”,
“document_uri”: “/”,
“ua_sb”: “PC端”,
“remote_port”: “43400”,
“server_name_ana”: “hactcm.edu.cn”,
“body_bytes”: 0,
“hostname”: “it-nginx”,
“http_user_agent”: “Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0”,5201FFD8-8CFA-400F-A3C5-4C10FFCBC5BA
“_index”: “asc-ser-sevi-agw-agwlog-211069033161-2022.01.19”,
“_type”: “_doc”,
“_id”: “0szocX4BVDckT1ER6EIc”
}
本平臺針對Web業務的訪問特性和清洗后的字段,設計了體系的分析模型[12],形成了數據概覽、運行實況、網站分析、訪客分析、數據洞察六個分析模塊,具體分析模型如表2所示。
5? 結? 論
本文基于Elasticsearch自主開發實現了Nginx日志分析平臺,針對Nginx日志分析這一特定場景,滿足了日志實時采集清洗、存儲、可視化的需要,詳細研究了日志分析平臺構建的各個過程,定制化設計Nginx日志分析模型,洞察日志關鍵信息。在整體上為平臺設計高可用,形成一套行之有效的Nginx日志分析平臺解決方案。
本文還有許多不足之處,如在分析過程中只是直接進行清洗后日志數據分析,沒有進一步分析日志各字段深層聯系,對日志的關聯分析和智能分析不足;日志與業務數據關聯沒有建立起來,使得日志分析與業務的耦合度不夠;預警消息的自動化推送尚未設計和實現。以上不足是今后需要重點研究和解決的問題。后期繼續在本文之上,探索人工智能技術與運維場景有機結合,使用海量日志數據訓練AIOps模型,打造一套智能監控運維解決方案。
參考文獻:
[1] 胡慶寶,姜曉巍,石京燕,等.基于Elasticsearch的實時集群日志采集和分析系統實現 [J].科研信息化技術與應用,2016,7(3):13-18.
[2] 姚攀,馬玉鵬,徐春香.基于ELK的日志分析系統研究及應用 [J].計算機工程與設計,2018,39(7):2090-2095.
[3] VOIT A,STANKUS A,MAGOMEDOV S,et al. Big Data Processing for Full-Text Search and Visualization with Elasticsearch [J].International Journal of Advanced Computer Science and Applications,2017,8(12):76-83.
[4] 余慧佳,劉奕群,張敏,等.基于大規模日志分析的網絡搜索引擎用戶行為分析 [J].中文信息學報,2007,21(1):109-114.
[5] 陳飛,艾中良.基于Flume的分布式日志采集分析系統設計與實現 [J].軟件,2016,37(12):82-88.
[6] 李祥池.基于ELK和Spark Streaming的日志分析系統設計與實現 [J].電子科學技術,2015,2(6):674-678.
[7] 程苗,陳華平.基于Hadoop的Web日志挖掘 [J].計算機工程,2011,37(11):37-39.
[8] 阮曉龍,賀路路.基于ELK+Kafka的智慧運維大數據分析平臺研究與實現 [J].軟件導刊,2020,19(6):150-154.
[9] 周德榮.基于ELK的高校校園網日志平臺研究 [J].赤峰學院學報(自然科學版),2019,35(10):45–47.
[10] 陳亞杰,王鋒,鄧輝,等.ElasticSearch分布式搜索引擎在天文大數據檢索中的應用研究 [J].天文學報,2016,57(2):241-251.
[11] 王立柱,朱茜.實時日志分析系統在河南氣象信息化中的應用 [J].氣象水文海洋儀器,2018,35(3):65-69.
[12] 阮曉龍,張浩林.基于ELK的Apache日志實時分析系統探索與分析模型研究 [J].電腦與信息技術,2020,28(1):54-57.
作者簡介:宋斌偉(1998—),男,漢族,河南駐馬店人,本科在讀,研究方向:日志大數據與AIOps;鄧汪濤(2001—),男,漢族,河南開封人,本科在讀,研究方向:面向互聯網的軟件開發;馬騁犇(2001—),男,漢族,河南洛陽人,本科在讀,研究方向:網絡與信息系統的運維管理;通訊作者:阮曉龍(1981—),男,漢族,河南鄭州人,副教授,經濟學學士學位,工學學士學位,研究方向:智能運維計算機網絡軟件技術。
收稿日期:2022-02-20
基金項目:教育部2021年第一批產學合作協同育人項目(202101327018);河南省教育廳2021年大學生創新創業訓練計劃項目(S202110471018);河南中醫藥大學2021年苗圃工程(MP2021-118)5201FFD8-8CFA-400F-A3C5-4C10FFCBC5BA