Apache本身不直接提供“慢查询”日志功能,但可通过自定义日志格式记录请求的处理时间(关键前提)。需修改Apache配置文件(如httpd.conf或虚拟主机配置),添加%{ms}T(毫秒级请求时间)或%D(微秒级请求时间)变量到LogFormat指令中,并关联到CustomLog。例如:
LogFormat "%h %l %u %t \"%r\" %>s %b %{ms}T" slow_log_format # 记录IP、请求时间、状态码、响应大小、处理时间(毫秒)
CustomLog "/var/log/apache2/slow_access.log" slow_log_format # 指定慢日志路径
此配置将生成包含请求处理时间的日志文件,为后续慢查询定位提供基础数据。
通过命令行工具快速提取慢请求。假设慢查询阈值为1秒(1000毫秒),可使用以下命令:
awk '$NF > 1000 {print $0}' /var/log/apache2/slow_access.log # NF表示最后一列(处理时间)
grep "07/Oct/2025:14:" /var/log/apache2/slow_access.log | awk '$NF > 1000'
%r,即请求行):awk '$NF > 1000 {for(i=1;i<=NF;i++) if($i ~ /^\"GET|^\"POST/) {print $i; break}}' /var/log/apache2/slow_access.log
以上命令可快速缩小慢查询的范围,聚焦于处理时间过长的请求。
Apache的慢请求多由应用层代码(如PHP、Python)或数据库查询导致,需关联上下游日志进一步分析:
slowlog = /var/log/php-fpm/slow.log,request_slowlog_timeout = 1s),通过时间戳匹配Apache慢请求与PHP慢日志中的函数调用(如file_get_contents、数据库查询),定位应用层耗时操作。slow_query_log = ON,long_query_time = 1),通过Apache日志中的请求时间戳和SQL语句(若有)匹配数据库慢日志,分析查询执行计划(EXPLAIN命令)是否使用了索引、是否存在全表扫描等问题。对于海量日志,手动筛选效率低,可使用日志分析工具实现可视化与深度分析:
request_time、URL、Referer等字段),存储到Elasticsearch中,利用Kibana创建仪表盘,展示慢请求的时间分布(如高峰时段)、URL排名(哪些接口最慢)、来源分析(如特定IP或地区),快速识别慢查询模式。source="access.log" request_time>1000)快速定位慢请求,利用其统计功能(如top 10 request_time by URI)分析最耗时的接口,支持生成报告并设置告警。根据定位结果,采取针对性优化措施:
EXPLAIN分析执行计划,添加缺失的索引(如针对WHERE条件的字段建索引)、优化查询条件(如避免LIKE '%keyword%'这种无法使用索引的查询)、调整数据库配置(如增大innodb_buffer_pool_size)。MaxClients避免过多并发进程导致内存耗尽)、升级服务器硬件(如增加内存、使用SSD存储),或启用负载均衡(如Nginx反向代理分发请求)。