使用Prometheus+Grafana监控WordPress服务器

本文详解使用Prometheus+Grafana搭建完整的WordPress服务器监控系统。

监控架构

WordPress Server
  ├── Node Exporter (系统指标)
  ├── MySQL Exporter (数据库指标)
  ├── Nginx Exporter (Web服务器指标)
  └── WordPress Exporter (应用指标)
         ↓
Prometheus (时序数据库)
         ↓
Grafana (可视化仪表盘 + 告警)

安装Prometheus

Ubuntu/Debian

# 创建prometheus用户
sudo useradd --no-create-home --shell /bin/false prometheus

# 下载最新版本
wget https://github.com/prometheus/prometheus/releases/download/v2.50.0/prometheus-2.50.0.linux-amd64.tar.gz
tar -xzf prometheus-2.50.0.linux-amd64.tar.gz

# 移动文件
sudo cp prometheus-2.50.0.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.50.0.linux-amd64/promtool /usr/local/bin/

# 创建配置文件目录
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus

# 复制配置
sudo cp -r prometheus-2.50.0.linux-amd64/consoles /etc/prometheus
sudo cp -r prometheus-2.50.0.linux-amd64/console_libraries /etc/prometheus

prometheus.yml 配置

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - localhost:9093

rule_files:
  - "/etc/prometheus/alert_rules.yml"

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node"
    static_configs:
      - targets: ["localhost:9100"]

  - job_name: "mysql"
    static_configs:
      - targets: ["localhost:9104"]

  - job_name: "nginx"
    static_configs:
      - targets: ["localhost:9113"]

  - job_name: "wordpress"
    metrics_path: "/wp-json/prometheus/metrics"
    static_configs:
      - targets: ["localhost:80"]

安装Node Exporter(系统监控)

# 下载
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar -xzf node_exporter-1.7.0.linux-amd64.tar.gz

# 安装
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/node_exporter

# 创建systemd服务
sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<EOT
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
EOT

# 启动
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter

安装MySQL Exporter(数据库监控)

# 创建监控用户
mysql -u root -p -e "
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'SecurePassword123!' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;
"

# 下载exporter
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz
tar -xzf mysqld_exporter-0.15.0.linux-amd64.tar.gz

# 配置
echo "DATA_SOURCE_NAME=\"exporter:SecurePassword123!@(localhost:3306)/\"" | sudo tee /etc/default/mysqld_exporter

# 安装
sudo cp mysqld_exporter-0.15.0.linux-amd64/mysqld_exporter /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/mysqld_exporter

# 创建systemd服务(类似Node Exporter)

安装Grafana

# Ubuntu/Debian
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install grafana

# 启动
sudo systemctl enable grafana-server
sudo systemctl start grafana-server

# 访问 http://your-server:3000 (默认 admin/admin)

添加Prometheus数据源

1. 登录Grafana  Configuration  Data Sources
2. Add data source  Prometheus
3. URL: http://localhost:9090
4. Click "Save & Test"

导入Dashboard

推荐Dashboard ID

Dashboard ID 说明
Node Exporter Full 1860 完整系统监控
MySQL Overview 7362 MySQL性能监控
Nginx Stats 9614 Nginx状态监控
WordPress Prometheus 12097 WordPress专用
# 导入方式:
# Grafana → + → Import → 输入Dashboard ID → Load

自定义告警规则

/etc/prometheus/alert_rules.yml

groups:
  - name: wordpress_alerts
    rules:
      # 服务器CPU > 80%
      - alert: HighCpuLoad
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU负载过高: {{ $value }}%"
          description: "服务器 {{ $labels.instance }} CPU使用率超过80%"

      # 内存使用 > 90%
      - alert: HighMemoryUsage
        expr: (1 - (node_memory_MemAvailable / node_memory_MemTotal)) * 100 > 90
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "内存使用率过高: {{ $value }}%"

      # 磁盘使用 > 85%
      - alert: HighDiskUsage
        expr: (1 - (node_filesystem_avail / node_filesystem_size)) * 100 > 85
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "磁盘使用率过高: {{ $value }}%"

      # MySQL连接数 > 80%
      - alert: MySQLTooManyConnections
        expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100 > 80
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "MySQL连接数过高"

配置Alertmanager(告警发送)

# /etc/alertmanager/alertmanager.yml
global:
  smtp_smarthost: 'smtp.gmail.com:587'
  smtp_from: 'alerts@example.com'
  smtp_auth_username: 'alerts@example.com'
  smtp_auth_password: 'app_password'

route:
  receiver: 'email-alerts'

receivers:
  - name: 'email-alerts'
    email_configs:
      - to: 'admin@example.com'
        subject: '[Alert] {{ .GroupLabels.alertname }}'
        body: |
          {{ range .Alerts }}
          Alert: {{ .Annotations.summary }}
          Description: {{ .Annotations.description }}
          {{ end }}

WordPress专用指标导出

创建简易PHP导出脚本

// wp-content/metrics.php
header('Content-Type: text/plain');

// 文章总数
$post_count = wp_count_posts('post')->publish;
echo "wp_posts_total $post_count\n";

// 页面总数
$page_count = wp_count_posts('page')->publish;
echo "wp_pages_total $page_count\n";

// 评论待审
$pending_comments = get_comments(['status' => '0', 'count' => true]);
echo "wp_comments_pending $pending_comments\n";

// 用户总数
$user_count = count_users()['total_users'];
echo "wp_users_total $user_count\n";

监控关键指标

类别 指标 告警阈值
系统 CPU使用率 > 80%
系统 内存使用率 > 90%
系统 磁盘使用率 > 85%
MySQL 连接数占比 > 80%
MySQL 慢查询数量 > 10/分钟
Nginx 4xx错误率 > 5%
Nginx 5xx错误率 > 1%
WordPress PHP-FPM进程数 > 80% max_children

自动化部署(使用Ansible)

# ansible playbook
- name: Install Prometheus stack
  hosts: monitoring
  become: yes

  tasks:
    - name: Install Prometheus
      unarchive:
        src: https://github.com/.../prometheus.tar.gz
        dest: /tmp/
        remote_src: yes

    - name: Start Node Exporter
      systemd:
        name: node_exporter
        state: started
        enabled: yes

最佳实践

  1. 分离监控服务器:不要和业务同机
  2. 长期存储:使用VictoriaMetrics或Thanos扩展Prometheus
  3. 告警分级:warning(邮件)和critical(短信/电话)
  4. 保留策略:Prometheus数据保留15-30天
  5. 备份Grafana仪表盘:导出JSON,纳入版本控制

通过完整的监控,可以在用户投诉前发现并解决问题。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。