Home › Blog › Article

Monitoring a WordPress Site: Signals That Matter

Monitoring a WordPress Site: Signals That Matter

Monitor a WordPress site by tracking uptime plus certificate expiry, disk usage, PHP error logs, and alert noise. You know it is right when synthetic checks pass from two regions, cert warnings fire 21 days early, disk alerts trigger below 15 percent free, PHP fatals are captured daily, and your team receives fewer than five meaningful alerts per week. Verify each signal with the commands and configs below.

Step-by-Step WordPress Site Monitoring Setup Process

  1. Deploy synthetic HTTP checks from at least two regions with 200-status and body-match assertions.
  2. Add TLS expiry and disk-space probes to your node exporter or cron-based script.
  3. Pipe PHP error logs into a central sink and set WP_DEBUG_LOG for staging only.
  4. Tune alert thresholds, dedupe, and group by service to cut noise.
  5. Run a monthly game-day: expire a test cert, fill a test disk, and confirm rollback works.
  6. Review the action checklist at the end and book maintenance if gaps remain.

1. Beyond Uptime

Uptime tells you the server answered; it does not tell you WordPress rendered. A 200 response from a cached edge node can hide a broken loop, a failed plugin update, or a white screen. You need synthetic checks that assert on content and behavior.

How to do it

Use a curl-based probe run from cron or your monitoring agent. Check for a known string in the HTML, not just status.

#!/bin/bash
URL='https://example.com/'
if curl -sS -f -m 15 -A 'MonCheck/1.0' "$URL" | grep -q 'Just another WordPress site'; then
  echo 'OK: content matched'
else
  echo 'FAIL: content missing' >&2
  exit 1
fi

Run this from two providers (for example a VPS in Frankfurt and one in Oregon) every 60 seconds. In 2026, pair it with a real-browser check using Playwright or Lighthouse CI to catch JavaScript errors that curl cannot see.

How to verify

Break it on purpose: temporarily rename your theme’s index.php on staging and confirm the probe fails within one interval. Roll back by restoring the file and confirming OK returns.

Pitfalls

  • Probing only the homepage: also check a category page and wp-login.php.
  • Ignoring cache: add a random query string like ?nocache=$(date +%s) to bypass full-page cache.

For deeper incident context, see our Nginx 504 and Stuck PHP-FPM log reading guide when timeouts appear in your synthetic results.

2. Certificate Expiry and Disk

Get a Quote

Email + requirement + budget range — we reply with a quote within 24 hours.

An expired TLS certificate blocks visitors entirely; a full disk stops MySQL and PHP-FPM writes. Both are silent until they are fatal.

Certificate expiry

Use OpenSSL to read the remote cert and compute days left. Run this daily from cron.

#!/bin/bash
HOST='example.com'
END=$(echo | openssl s_client -servername "$HOST" -connect "$HOST:443" 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
END_EPOCH=$(date -d "$END" +%s)
NOW=$(date +%s)
DAYS=$(( (END_EPOCH - NOW) / 86400 ))
echo "$DAYS days left"
if [ "$DAYS" -lt 21 ]; then
  logger -t certcheck "ALERT: $HOST expires in $DAYS days"
fi

With Let’s Encrypt and certbot 2.x (current in 2026), renewals run via systemd timer. Verify the timer is active: systemctl list-timers certbot.timer. Roll back a bad renewal by restoring /etc/letsencrypt/live/example.com/ from backup and reloading nginx.

Disk usage

Add a cron check for free space on the partition holding /var/www and /var/lib/mysql.

#!/bin/bash
THRESH=15
PART='/'
USE=$(df -P "$PART" | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$USE" -gt $((100 - THRESH)) ]; then
  logger -t diskcheck "ALERT: $PART is ${USE}% full"
fi

Common pitfall: /var/log growing from debug logs. Rotate with logrotate and set maxsize 100M. Verify by filling a test file with dd, confirming alert, then deleting it.

3. PHP Error Logs

PHP fatals and warnings reveal plugin conflicts and deprecated code before users complain. In 2026, PHP 8.3 is the minimum supported baseline for new projects, so log formats and error levels follow that.

How to capture them

In wp-config.php, enable logging only in non-production, or use a must-use plugin to route errors safely in production without exposing paths.

// wp-config.php — staging only
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('error_log', '/var/log/php/wp-errors.log');

For production, set error_log = /var/log/php/fpm-error.log in your PHP-FPM pool config (/etc/php/8.3/fpm/pool.d/www.conf) and ship with filebeat or vector to a central store. Search daily for PHP Fatal error and Uncaught.

How to verify

Trigger a test error with a tiny mu-plugin: call an undefined function and confirm it lands in the log within one minute. Remove the mu-plugin file to roll back.

Pitfalls

  • Leaving WP_DEBUG_DISPLAY true in production exposes paths; always set false.
  • Not rotating: a runaway log can fill the disk you just monitored in section 2.

Teams running stores should also read how to build a WooCommerce store and pick the right vendor in 2026 since checkout errors show up first in PHP logs.

4. Reducing Alert Noise

4. Reducing Alert Noise

If every blip pages someone, real incidents get ignored. Alert on symptoms, group by service, and set sane thresholds.

How to do it

In Prometheus + Alertmanager (or your SaaS), use inhibition and grouping. Example Alertmanager route for WordPress:

route:
  group_by: ['alertname', 'job']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 12h
  receiver: 'team-email'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['job']

Only page for: synthetic content failure for 3 consecutive intervals, cert under 7 days, disk under 10 percent, or PHP fatal rate above 5 per minute. Everything else goes to a digest.

How to verify

Count alerts over one week. Target is fewer than five actionable pages. If higher, raise thresholds or lengthen group_wait. Roll back config with amtool check-config before reload.

Pitfalls

  • Alerting on CPU alone: a spike may be a backup job, not an outage.
  • No runbook link: every alert should point to the rollback step from the section above.

Site owners who prefer managed coverage can review our WordPress maintenance and care plans that bundle these signals with human response.

Action Checklist

  • Deploy two-region synthetic content checks and test a failure.
  • Add cert and disk cron probes; alert at 21 days and 15 percent free.
  • Centralize PHP error logs from the 8.3 FPM pool and test a fatal capture.
  • Tune Alertmanager grouping and inhibition; measure weekly alert count.
  • Run one game-day per quarter and document rollbacks.

Hire our engineers to run these checks for you. See our maintenance services and the full service list today.

Frequently Asked Questions

What is WordPress site monitoring beyond uptime?

It means checking that pages actually render correct content, not just that the port answers, plus cert, disk, and log signals.

How often should certificate checks run?

Daily is enough; alert at 21 days so you have time to fix renewal before expiry.

Where are PHP errors stored in 2026?

Typically /var/log/php/fpm-error.log or a custom error_log path set in the PHP 8.3 FPM pool config.

References & further reading

Need WordPress Development?

Free proposal and quote within 24 hours — we serve clients worldwide.

QQ