Summary: This guide lays out a practical Moodle troubleshooting workflow, including symptom capture, log inspection, X-Sendfile validation, PHP-FPM sizing, timeout analysis, and common hidden configuration issues.

This is the structured response for “the site is broken or slow” when you need to move from symptoms to a real root cause instead of changing random settings.

Step 1: Write down the symptom precisely

Do not begin with theory. Begin with a reproducible statement:

  • course creation takes 40 seconds
  • large downloads fail
  • grading triggers a timeout
  • welcome emails show the wrong sender name

This matters because different symptom classes point to different layers immediately.

Step 2: Confirm access to the right systems

You should have access to:

  • Moodle admin
  • the web server
  • PHP-FPM configuration and status pages if available
  • database access or monitoring
  • logs for the relevant time window

If you cannot inspect all those layers, troubleshooting becomes speculation very quickly.

Step 3: Check recent changes first

Before tuning anything, ask what changed recently:

  • plugin deployment
  • upgrade
  • PHP version change
  • database import
  • web server config edit
  • traffic spike

The most efficient fixes often come from correlating the failure to a recent change rather than from deep system analysis.

Step 4: Validate large-file delivery separately

If the problem involves large files, check file delivery as its own subsystem. The SOP explicitly covers Apache mod_xsendfile as a common performance and reliability fix.

The sequence is:

  1. confirm mod_xsendfile is installed
  2. add the required Apache directives to the vhost
  3. enable the corresponding Moodle setting
  4. test both a direct Apache file and a Moodle-served file

This is one of the fastest ways to resolve “large downloads are slow or broken” without rewriting application code.

Step 5: Check PHP-FPM sizing before blaming Moodle

Many “Moodle is slow” complaints are really PHP-FPM pool exhaustion. Look for:

  • max children warnings
  • request queueing
  • under-sized pools relative to available RAM
  • multiple sites sharing the same pool or server resources poorly

The SOP specifically calls out checking the pool configuration and status pages rather than guessing at values.

Step 6: Separate timeout types by layer

Timeouts do not all mean the same thing. Distinguish between:

  • Apache or FastCGI read timeouts
  • Varnish or proxy timeouts
  • MySQL connection timeout or dropped connection
  • application-side slowness due to expensive queries or blocked PHP workers

Increasing every timeout value without identifying the failing layer usually just hides the real problem.

Step 7: Look for configuration mistakes that are easy to miss

The SOP includes several issues that are easy to overlook because they are small:

  • spaces or stray output in PHP files
  • wrong sender-name configuration for welcome emails
  • CLI PHP version not matching the web PHP version
  • environment-specific performance regressions such as the ICM course-creation case study

These often explain “we only changed something small” incidents.

Step 8: Close the loop after the fix

When the issue is resolved, document:

  • what failed
  • why it failed
  • what fixed it
  • what should be monitored or changed to prevent recurrence

If you skip this, you will eventually rediscover the same incident under a different name.


Solin specializes in Moodle troubleshooting, performance analysis, and production incident recovery. Need help? Contact us.

Solin helps teams diagnose and resolve Moodle incidents, regressions, and hard-to-reproduce production problems. Need help? Contact us.

Contact us