2021-04-20 22:50:15
监控所有服务器的Nginx请求需通过日志记录、日志分析、分布式日志收集及性能优化实现,核心步骤包括配置统一日志格式、使用集中化工具(如ELK或Prometheus+Grafana)汇总分析多服务器日志,并规避格式不一致、文件过大等常见问题。
一、日志记录:Nginx日志机制的基础Nginx默认生成两类日志:
关键配置:在nginx.conf中定义日志格式和路径,例如:
http { log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" "$request_time"'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn;}ELK Stack(Elasticsearch+Logstash+Kibana):
Logstash:收集并解析Nginx日志,支持自定义字段提取。
Elasticsearch:存储和索引日志数据,支持快速查询。
Kibana:可视化分析,生成请求分布、状态码统计等图表。
部署示例:
在每台Nginx服务器安装Filebeat,将日志发送到Logstash。
Logstash配置输入(Filebeat)、过滤(解析日志)和输出(Elasticsearch)。
Kibana连接Elasticsearch,创建仪表盘。
Prometheus + Grafana:
Prometheus:通过nginx-log-exporter或自定义Exporter采集日志指标(如请求数、状态码)。
Grafana:配置Prometheus数据源,绘制实时监控图表。
优势:轻量级,适合Kubernetes环境。
处理异常(如日志行格式不符)。
使用多线程或异步IO加速大文件处理。
Rsyslog/Syslog-ng:
每台服务器配置Rsyslog将日志发送到中央服务器。
中央服务器Rsyslog配置接收日志并写入文件或数据库。
示例配置(客户端):*.* @central-server:514
中央服务器配置:module(load="imudp")input(type="imudp" port="514")$template RemoteLogs,"/var/log/nginx/remote/%HOSTNAME%/%PROGRAMNAME%.log"*.* ?RemoteLogs
Fluentd:
支持多种输入(Tail Nginx日志)、过滤(解析JSON)和输出(Elasticsearch)。
配置示例:<source> @type tail path /var/log/nginx/access.log pos_file /var/log/nginx/access.log.pos tag nginx.access <parse> @type regexp expression /^(?<ip>S+) S+ S+ [.*?] "(?<method>S+) (?<url>S+) HTTP/d.d" (?<status>d{3})/ </parse></source><match nginx.access> @type elasticsearch host "elasticsearch" index_name "nginx-access"</match>
统一所有服务器的log_format,或在分析脚本中兼容多种格式。
使用logrotate切割日志,或通过sed/awk预处理过滤无关行。
脚本中添加try-except(Python)或信号处理(Bash),避免因单行错误中断。
敏感信息(如用户Token)需在日志中脱敏,或限制日志访问权限(chmod 640)。
使用哈希表(如Python的defaultdict)统计频率,避免嵌套循环。
对频繁查询的指标(如每小时请求数)缓存结果,减少重复计算。
设定存储周期(如保留30天日志),或归档到冷存储(如S3)。
监控所有服务器的Nginx请求需结合日志记录、集中化分析工具和分布式收集策略。推荐使用ELK或Prometheus+Grafana实现自动化监控,同时通过日志轮转、格式统一和性能优化确保系统稳定。自定义脚本适合小规模或高度定制化场景,但需投入更多维护成本。