一、为什么需要监控Apache性能
Apache HTTP Server是全球使用最广泛的Web服务器之一,支撑着数以亿计的网站和应用程序。然而,随着访问量的增长和业务复杂度的提升,Apache服务器可能面临性能瓶颈,导致响应缓慢甚至服务中断。
有效的性能监控可以帮助你:
- 提前发现问题:在用户投诉前发现性能下降
- 容量规划:根据历史数据规划服务器扩容
- 优化性能:找到性能瓶颈并针对性优化
- 保障SLA:确保服务可用性和响应时间达标
- 降低运维成本:自动化监控减少人工巡检
二、使用mod_status模块实时监控
mod_status是Apache自带的状态监控模块,可以提供实时的服务器性能数据。
2.1 启用mod_status
# 在httpd.conf或apache2.conf中启用
LoadModule status_module modules/mod_status.so
# 配置状态页面
<Location /server-status>
SetHandler server-status
Require host example.com
Require ip 192.168.1.0/24
</Location>
# 启用扩展状态(更详细的信息)
ExtendedStatus On
2.2 访问状态页面
配置完成后,访问 http://your-server/server-status 可以看到:
- 服务器启动时间、重启时间
- 总访问量、CPU使用率
- 当前并发连接数、空闲工作线程数
- 每个请求的处理状态和耗时
- 最近访问的URL
Apache Server Status for localhost
Server Version: Apache/2.4.58 (CentOS)
Server MPM: event
Server Built: Jan 10 2026 14:23:05
Current Time: Tuesday, 12-May-2026 02:16:00 CST
Restart Time: Tuesday, 12-May-2026 00:00:00 CST
Parent Server Config. Generation: 1
Parent Server MPM Generation: 0
Server uptime: 2 hours 16 minutes
Total accesses: 123456 - Total Traffic: 1.2 GB
CPU Usage: u12.3 s5.6 cu0 cs0 - 0.21% CPU load
Requests/sec: 15.1 - Bytes served/sec: 123.4 KB
2.3 使用命令行获取状态数据
# 使用curl获取状态页面
curl http://localhost/server-status
# 获取机器可读格式(用于脚本解析)
curl http://localhost/server-status?auto
# 输出示例:
# Scoreboard: ____W_W___W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W
# CPUUsage: 0.21
# ReqPerSec: 15.1
# BytesPerSec: 123.4
# BusyWorkers: 12
# IdleWorkers: 88
三、命令行监控工具
3.1 使用apachectl查看运行时信息
# 查看编译信息和模块
apachectl -M
# 查看配置语法错误
apachectl -t
# 查看服务器状态(类似server-status)
apachectl status
# 查看完整的服务器信息
apachectl fullstatus
3.2 使用systemd查看服务状态
# 查看Apache服务状态
systemctl status httpd # CentOS/RHEL
systemctl status apache2 # Ubuntu/Debian
# 查看资源使用
systemctl show httpd --property=MemoryCurrent,CPUUsageNSec
# 查看服务日志
journalctl -u httpd -f # 实时追踪日志
3.3 使用ps/top监控Apache进程
# 查看Apache进程
ps aux | grep httpd
# 按内存使用排序
ps aux --sort=-%mem | head -20
# 按CPU使用排序
ps aux --sort=-%cpu | head -20
# 统计Apache进程数
ps aux | grep httpd | grep -v grep | wc -l
# 查看每个Apache进程的内存使用
for pid in $(pgrep httpd); do
echo "PID $pid: $(ps -p $pid -o rss=) KB"
done
3.4 使用ss/netstat监控网络连接
# 查看Apache端口(80/443)的连接数
ss -tan | grep :80 | wc -l
ss -tan | grep :443 | wc -l
# 查看连接状态分布
ss -tan | grep :80 | awk '{print $1}' | sort | uniq -c
# 查看每个客户端IP的连接数(找出可能的攻击源)
ss -tan | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
# 使用netstat(老系统)
netstat -an | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn
四、日志分析与监控
4.1 Apache访问日志分析
# 1. 统计QPS(每秒查询数)
# 假设日志格式:IP - - [ timestamp] "method URL protocol" status bytes "referer" "user-agent"
awk '{print $4}' /var/log/httpd/access_log | cut -d: -f1-2 | uniq -c
# 2. 找出最慢的10个请求
awk '{print $NF " "$7}' /var/log/httpd/access_log | sort -rn | head -10
# 3. 统计HTTP状态码分布
awk '{print $9}' /var/log/httpd/access_log | sort | uniq -c | sort -rn
# 4. 找出访问量最大的IP
awk '{print $1}' /var/log/httpd/access_log | sort | uniq -c | sort -rn | head -20
# 5. 统计热门URL
awk '{print $7}' /var/log/httpd/access_log | sort | uniq -c | sort -rn | head -20
# 6. 按小时统计请求量
awk '{print $4}' /var/log/httpd/access_log | cut -d: -f2 | sort | uniq -c
4.2 使用GoAccess进行实时Web日志分析
GoAccess是优秀的实时Web日志分析工具,提供终端和HTML输出。
# 安装GoAccess
sudo yum install -y goaccess # CentOS
sudo apt install -y goaccess # Ubuntu
# 实时终端输出
goaccess /var/log/httpd/access_log -c
# 生成HTML报告
goaccess /var/log/httpd/access_log -o /var/www/html/report.html --log-format=COMBINED
# 实时HTML输出(WebSocket)
goaccess /var/log/httpd/access_log -o /var/www/html/live.html --real-os --ws-url=wss://your-server:7890
# 配置GoAccess(/etc/goaccess.conf)
log-format COMBINED
date-format %d/%b/%Y
log-file /var/log/httpd/access_log
output /var/www/html/report.html
real-os true
4.3 使用AWStats生成统计分析
AWStats是功能强大的日志分析工具,生成详细的统计报告。
# 安装AWStats
sudo yum install -y awstats # CentOS
sudo apt install -y awstats # Ubuntu
# 配置AWStats(/etc/awstats/awstats.conf)
LogFile="/var/log/httpd/access_log"
SiteDomain="example.com"
HostAliases="www.example.com localhost 127.0.0.1"
# 生成统计报告
sudo /usr/share/awstats/tools/awstats_updateall.pl now
# 访问报告
http://your-server/awstats/awstats.pl?config=example.com
五、系统资源监控
5.1 CPU监控
# 使用top查看CPU使用
top -p $(pgrep httpd | head -1)
# 使用htop(更友好的界面)
sudo yum install -y htop
htop
# 使用mpstat查看每个CPU核心的使用率
mpstat -P ALL 1 5
# 使用sar查看历史CPU使用
sar -u 1 5
5.2 内存监控
# 查看Apache内存使用总量
ps aux | grep httpd | grep -v grep | awk '{sum+=$6} END {print sum/1024 " MB"}'
# 查看系统内存使用
free -h
# 查看内存使用历史
sar -r 1 5
5.3 磁盘I/O监控
# 使用iostat查看磁盘I/O
iostat -x 1 5
# 使用iotop查看I/O占用进程
sudo yum install -y iotop
sudo iotop -o
# 查看Apache日志目录的磁盘使用
du -sh /var/log/httpd/
5.4 网络监控
# 使用iftop查看实时网络流量
sudo yum install -y iftop
sudo iftop -i eth0
# 使用nload查看网络带宽使用
sudo yum install -y nload
nload eth0
# 统计Apache端口流量
ss -tan | grep :80 | wc -l
六、使用Prometheus + Grafana监控Apache
6.1 安装和配置Prometheus
# 1. 下载Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar -xzf prometheus-2.45.0.linux-amd64.tar.gz
cd prometheus-2.45.0.linux-amd64
# 2. 配置Prometheus(prometheus.yml)
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'apache'
static_configs:
- targets: ['localhost:9117'] # Apache Exporter端口
# 3. 启动Prometheus
./prometheus --config.file=prometheus.yml
6.2 安装Apache Exporter
Apache Exporter可以将Apache性能指标暴露给Prometheus。
# 1. 安装Apache Exporter
wget https://github.com/Lusitaniae/apache_exporter/releases/download/v0.11.0/apache_exporter-0.11.0.linux-amd64.tar.gz
tar -xzf apache_exporter-0.11.0.linux-amd64.tar.gz
cd apache_exporter-0.11.0.linux-amd64
# 2. 启用Apache mod_status(前面已配置)
# 3. 启动Apache Exporter
./apache_exporter --scrape_uri=http://localhost/server-status?auto --telemetry.address=:9117
# 4. 创建systemd服务(/etc/systemd/system/apache_exporter.service)
[Unit]
Description=Apache Exporter
[Service]
ExecStart=/usr/local/bin/apache_exporter --scrape_uri=http://localhost/server-status?auto
Restart=always
[Install]
WantedBy=multi-user.target
# 5. 启动服务
sudo systemctl enable apache_exporter
sudo systemctl start apache_exporter
6.3 配置Grafana仪表盘
# 1. 安装Grafana
sudo yum install -y grafana # CentOS
sudo apt install -y grafana # Ubuntu
# 2. 启动Grafana
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
# 3. 访问Grafana
http://your-server:3000 # 默认账号admin/admin
# 4. 添加Prometheus数据源
# Configuration → Data Sources → Add data source → Prometheus
# URL: http://localhost:9090
# 5. 导入Apache监控仪表盘
# Import Dashboard → Dashboard ID: 3894(Apache Exporter dashboard)
6.4 关键PromQL查询
# Apache每秒请求数
rate(apache_accesses_total[1m])
# Apache繁忙工作线程数
apache_busy_workers
# Apache空闲工作线程数
apache_idle_workers
# Apache CPU使用率
apache_cpu_usage_percent
# Apache总访问量
apache_accesses_total
七、使用Nagios进行告警监控
7.1 安装Nagios Core
# 安装依赖
sudo yum install -y gcc glibc glibc-common wget unzip httpd php gd gd-devel perl postfix
# 创建nagios用户
sudo useradd nagios
sudo groupadd nagcmd
sudo usermod -a -G nagcmd nagios
sudo usermod -a -G nagcmd apache
# 下载编译Nagios
wget https://github.com/NagiosEnterprises/nagioscore/archive/nagios-4.4.14.tar.gz
tar -xzf nagios-4.4.14.tar.gz
cd nagioscore-nagios-4.4.14/
./configure --with-command-group=nagcmd
make all
sudo make install
sudo make install-commandmode
sudo make install-init
sudo make install-config
sudo make install-webconf
# 设置Nagios管理员密码
sudo htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
# 启动Nagios
sudo systemctl enable nagios
sudo systemctl start nagios
7.2 配置Apache监控
# 在Nagios中配置Apache监控(/usr/local/nagios/etc/objects/commands.cfg)
define command {
command_name check_apache_status
command_line $USER1$/check_http -I $HOSTADDRESS$ -p $ARG1$ -u $ARG2$ -e $ARG3$
}
# 配置服务监控(/usr/local/nagios/etc/objects/localhost.cfg)
define service {
use local-service
host_name localhost
service_description Apache Status
check_command check_apache_status!80!/server-status?auto!200
notifications_enabled 1
}
八、关键性能指标(KPI)详解
8.1 请求处理指标
| 指标 | 说明 | 告警阈值建议 |
|---|---|---|
| QPS (Queries Per Second) | 每秒处理的HTTP请求数 | > 1000 警告,> 2000 严重 |
| 并发连接数 | 当前活跃连接数 | > MaxRequestWorkers的80% |
| 请求队列长度 | 等待处理的请求数 | > 50 需要告警 |
| 慢请求比例 | 响应时间>1s的请求占比 | > 5% 需要优化 |
8.2 资源使用指标
| 指标 | 说明 | 告警阈值建议 |
|---|---|---|
| CPU使用率 | Apache进程CPU占用 | > 80% 持续5分钟告警 |
| 内存使用 | Apache进程总内存占用 | > 系统内存的80% |
| 磁盘I/O等待 | IOUtil% | > 90% 需要告警 |
| 网络带宽 | 进出流量 | > 带宽的80% |
8.3 错误与可用性指标
| 指标 | 说明 | 告警阈值建议 |
|---|---|---|
| 4xx错误率 | 客户端错误比例 | > 5% 需要检查 |
| 5xx错误率 | 服务端错误比例 | > 1% 立即告警 |
| 服务可用性 | Apache是否可访问 | 不可访问立即告警 |
| 重启频率 | Apache重启次数 | > 1次/天需要调查原因 |
九、基于监控的性能调优
9.1 MPM(Multi-Processing Module)调优
Apache支持多种MPM模式,需要根据监控数据选择合适的配置。
# 查看当前MPM
httpd -V | grep -i mpm
# prefork MPM(兼容旧模块,但性能较差)
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
# worker MPM(多线程,性能较好)
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
# event MPM(最新,性能最好,推荐)
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
9.2 根据监控数据调整参数
# 1. 如果并发连接数经常接近MaxRequestWorkers
# → 增加MaxRequestWorkers
# 2. 如果CPU使用率很低但QPS上不去
# → 增加ThreadsPerChild或MaxRequestWorkers
# 3. 如果内存使用过高
# → 减少MaxRequestWorkers,或启用KeepAliveTimeout
# 4. 如果磁盘I/O很高
# → 启用缓存(mod_cache),优化日志写入
9.3 启用缓存提升性能
# 启用mod_cache
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
# 配置磁盘缓存
CacheRoot "/var/cache/httpd/proxy"
CacheDirLevels 2
CacheDirLength 1
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.5
# 对特定URL启用缓存
<Location "/static/">
CacheEnable disk
CacheHeader on
</Location>
十、告警配置最佳实践
10.1 告警规则设计
# Prometheus告警规则示例(/etc/prometheus/alerts.yml)
groups:
- name: apache_alerts
rules:
- alert: ApacheHighQPS
expr: rate(apache_accesses_total[1m]) > 1000
for: 5m
labels:
severity: warning
annotations:
summary: "Apache QPS过高: {{ $value }}"
- alert: ApacheHighErrorRate
expr: rate(apache_accesses_total{status=~"5.."})[5m] / rate(apache_accesses_total[5m]) > 0.01
for: 5m
labels:
severity: critical
annotations:
summary: "Apache 5xx错误率过高: {{ $value | humanizePercentage }}"
- alert: ApacheLowAvailability
expr: up{job="apache"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Apache服务不可用"
10.2 告警通知渠道
# 1. 邮件通知(使用mail或sendmail)
echo "Apache QPS过高" | mail -s "Apache告警" admin@example.com
# 2. Slack通知(通过Webhook)
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"Apache QPS过高告警"}' \
https://hooks.slack.com/services/YOUR/WEBHOOK/URL
# 3. 微信/钉钉通知(通过企业API)
curl -X POST https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text", "text": {"content": "Apache告警: QPS过高"}}'
# 4. PagerDuty集成(紧急告警)
# 在PagerDuty中创建Service,获取Integration Key
# 配置Prometheus Alertmanager使用PagerDuty
十一、总结
Apache服务器性能监控是保障Web服务稳定性和性能的基础工作。本文详细介绍了从基础到高级的监控方法:
- 基础监控:使用mod_status和命令行工具
- 日志分析:使用GoAccess、AWStats分析访问日志
- 系统监控:监控CPU、内存、磁盘I/O、网络
- 高级监控:使用Prometheus + Grafana构建可视化监控平台
- 告警监控:使用Nagios或Alertmanager配置告警
- 性能调优:根据监控数据优化Apache配置
核心建议:
- 多层监控:结合Apache自带工具、系统工具和第三方工具
- 关键指标:重点关注QPS、并发数、错误率、资源使用率
- 可视化:使用Grafana构建实时监控仪表盘
- 主动告警:配置合理的告警规则,提前发现问题
- 持续优化:根据监控数据持续调整Apache配置
通过构建完善的Apache性能监控体系,你可以保障Web服务的稳定运行,提升用户体验,并为业务增长提供可靠的基础设施支持。