FEATURE PLANNING: PHP-FPM and server-wide optimization system OVERVIEW: Intelligent analyzer that scans all domains, detects PHP configs, analyzes usage patterns, and provides one-click optimization with automatic backups and safety checks. LEVERAGES EXISTING INFRASTRUCTURE: - user-manager.sh: Domain/user detection (70% of work done) - system-detect.sh: Control panel detection - optimize-ct-limit.sh: Traffic analysis model - get_user_log_files(): Log location mapping CORE CAPABILITIES: 1. Detect all PHP-FPM pool configs per domain 2. Find php.ini hierarchy (.user.ini, local, global) 3. Analyze memory usage, traffic patterns, error logs 4. Calculate optimal pm.max_children, memory_limit, opcache 5. Detect issues: max_children reached, memory exhausted, slow requests 6. Provide actionable recommendations with safety checks 7. One-click apply with automatic backups IMPLEMENTATION PHASES: - Phase 1: lib/php-detector.sh (detection logic) - Phase 2: lib/php-analyzer.sh (analysis engine) - Phase 3: modules/performance/php-optimizer.sh (main script) - Phase 4: Integration with live-attack-monitor TRACKED METRICS: - pm.max_children, pm.start_servers, pm.min/max_spare_servers - memory_limit, max_execution_time, upload_max_filesize - opcache settings, hit rates, memory consumption - Process counts, memory usage, CPU patterns - Error rates, slow request logs NEXT: Expand metrics tracking and begin Phase 1 implementation
12 KiB
PHP & Server Optimizer - Comprehensive Planning Document
Overview
Intelligent PHP-FPM, memory, and resource optimizer that analyzes per-domain usage patterns and provides actionable recommendations with one-click fixes.
What We Already Have (Foundation)
✅ user-manager.sh - Complete user/domain detection for cPanel, Plesk, InterWorx ✅ system-detect.sh - Control panel, PHP version, web server detection ✅ optimize-ct-limit.sh - Traffic pattern analysis model (can reuse approach) ✅ Domain home directories already tracked via get_user_info() ✅ Log file detection via get_user_log_files()
Architecture
Module Name
/root/server-toolkit/modules/performance/php-optimizer.sh
Core Components
1. Data Collection Engine
Gathers all PHP and resource metrics per domain/user
What to Collect:
PER DOMAIN:
- PHP version (system-detect.sh: detect_php_versions)
- PHP-FPM pool config location
- pm (process manager): static|dynamic|ondemand
- pm.max_children (current value)
- pm.start_servers
- pm.min_spare_servers
- pm.max_spare_servers
- pm.max_requests
- memory_limit (php.ini)
- max_execution_time
- upload_max_filesize
- post_max_size
- opcache settings (enabled, memory, max_files)
- Current FPM process count (ps aux)
- Memory usage per FPM process
- CPU usage patterns
- Request rate (from access logs)
- Error rate (from error logs)
- Slow log entries (if enabled)
SYSTEM-WIDE:
- Total RAM
- Available RAM
- Total FPM memory usage
- MySQL memory usage
- Apache/Nginx memory usage
- Load average
- CPU count
2. Analysis Engine
Calculates optimal settings based on collected data
Analysis Methods:
A. Memory-Based Calculations:
# Per-domain optimal max_children calculation
avg_fpm_mem_per_process=$(ps aux | grep "php-fpm.*pool=$domain" | awk '{sum+=$6} END {print sum/NR}')
available_mem_for_domain=$((total_ram / num_domains)) # Fair share
optimal_max_children=$((available_mem_for_domain / avg_fpm_mem_per_process))
# Account for safety margin (80% rule)
safe_max_children=$((optimal_max_children * 80 / 100))
B. Traffic-Based Calculations:
# Analyze access logs for concurrent request patterns
peak_concurrent_requests=$(analyze_apache_logs "$domain" 24 hours)
avg_request_duration=$(calculate_avg_php_duration "$domain")
optimal_max_children=$((peak_concurrent_requests * 1.5)) # 50% buffer
C. Problem Detection:
ISSUES_FOUND=()
# Check 1: FPM processes hitting max_children limit
if grep -q "server reached pm.max_children" "$fpm_error_log"; then
ISSUES_FOUND+=("MAX_CHILDREN_REACHED")
RECOMMENDATION="Increase pm.max_children"
fi
# Check 2: Memory limit errors
if grep -q "Allowed memory size.*exhausted" "$php_error_log"; then
ISSUES_FOUND+=("MEMORY_EXHAUSTED")
RECOMMENDATION="Increase memory_limit"
fi
# Check 3: Slow requests
if [ -f "$slow_log" ]; then
slow_count=$(wc -l < "$slow_log")
if [ "$slow_count" -gt 100 ]; then
ISSUES_FOUND+=("SLOW_REQUESTS")
RECOMMENDATION="Optimize PHP code or increase max_execution_time"
fi
fi
# Check 4: Opcache hit rate
opcache_hit_rate=$(php -r "print_r(opcache_get_status());" | grep hit_rate | awk '{print $2}')
if [ "$opcache_hit_rate" -lt 80 ]; then
ISSUES_FOUND+=("LOW_OPCACHE_HIT_RATE")
RECOMMENDATION="Increase opcache.memory_consumption"
fi
3. File Location Detective
Maps all PHP configuration files per domain
cPanel Locations:
# PHP-FPM pools
/opt/cpanel/ea-php*/root/etc/php-fpm.d/$username.conf
/var/cpanel/userdata/$username/$domain
# PHP.ini locations
/opt/cpanel/ea-php*/root/etc/php.d/
~/.php/
/home/$username/.php/
/home/$username/public_html/.user.ini
Plesk Locations:
# PHP-FPM pools
/etc/php-fpm.d/plesk-php*-fpm/$domain.conf
# PHP.ini
/var/www/vhosts/system/$domain/etc/php.ini
InterWorx Locations:
# PHP-FPM pools
/home/$username/var/$domain/php-fpm.conf
# PHP.ini
/home/$username/var/$domain/etc/php.ini
Log File Locations:
# Already handled by get_user_log_files() in user-manager.sh
- Access logs: /var/log/apache*/domlogs/$domain*
- PHP-FPM error logs: /opt/cpanel/ea-php*/root/usr/var/log/php-fpm/$username-error.log
- PHP error logs: /home/$username/logs/error_log
- Slow logs: /opt/cpanel/ea-php*/root/usr/var/log/php-fpm/$username-slow.log
4. Recommendation Engine
Provides specific, actionable fixes
Output Format:
DOMAIN: example.com (user: examplec, PHP 8.2)
STATUS: ⚠️ NEEDS OPTIMIZATION
CURRENT CONFIGURATION:
├─ pm.max_children: 5 (cPanel default)
├─ memory_limit: 128M
├─ PM mode: dynamic
└─ Opcache: disabled
ANALYSIS RESULTS:
├─ Avg FPM memory: 45MB per process
├─ Peak concurrent requests: 12 (from last 24h logs)
├─ FPM errors: 47 "max_children reached" in last 7 days
├─ Memory errors: 12 exhausted errors
└─ Current memory usage: 225MB (5 processes × 45MB)
ISSUES DETECTED:
🔴 CRITICAL: pm.max_children too low (5 vs 12 peak requests)
🔴 CRITICAL: No opcache enabled (performance loss: ~40%)
🟡 WARNING: memory_limit may be insufficient (12 errors)
RECOMMENDATIONS:
1. Increase pm.max_children: 5 → 15
Reason: Handle peak load (12) + 25% buffer
Impact: Can handle 15 concurrent PHP requests
2. Enable opcache with optimal settings
Reason: Massive performance gain, reduce CPU by 40%
Settings:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
3. Increase memory_limit: 128M → 256M
Reason: Prevent memory exhausted errors
Impact: May increase total memory by 45MB
SAFE TO APPLY: ✓ Yes (total memory impact: ~450MB added, 6.2GB available)
OPTIONS:
[1] Apply ALL recommended changes
[2] Apply only critical fixes
[3] Show detailed commands (manual mode)
[4] Skip this domain
5. Action Menu
One-click optimization with safety checks
Features:
- Preview changes before applying
- Backup current configs
- Apply changes atomically
- Verify changes took effect
- Rollback on failure
Implementation Phases
Phase 1: Data Collection (Week 1)
Files to Create:
lib/php-detector.sh- Detect all PHP configs per domainlib/php-analyzer.sh- Analyze logs and calculate metrics
Functions:
detect_php_pools() # Find all FPM pool configs
get_php_config() # Read current PHP settings
analyze_php_logs() # Parse error/slow/access logs for issues
calculate_memory_usage() # Get actual FPM memory per domain
detect_php_issues() # Find max_children errors, memory exhausted, etc.
Phase 2: Analysis & Recommendations (Week 1-2)
Functions:
calculate_optimal_max_children() # Based on memory + traffic
calculate_optimal_memory_limit() # Based on usage patterns
recommend_pm_mode() # static vs dynamic vs ondemand
check_opcache_efficiency() # Hit rate, memory usage
generate_recommendations() # Build recommendation list
assess_safety() # Check if changes are safe to apply
Phase 3: Action Engine (Week 2)
Functions:
backup_php_configs() # Backup before changes
apply_fpm_changes() # Update pool configs
apply_php_ini_changes() # Update php.ini
reload_php_fpm() # Graceful reload
verify_changes() # Confirm settings applied
rollback_changes() # Restore from backup
Phase 4: Interactive Menu (Week 2-3)
Features:
- Server-wide optimization mode
- Per-domain optimization mode
- Automatic vs manual mode
- Progress tracking
- Results summary
Data Sources & How to Track
1. Domain Discovery
# Already have this!
source /root/server-toolkit/lib/user-manager.sh
users=$(list_all_users)
for user in $users; do
domains=$(get_user_domains "$user")
for domain in $domains; do
# Process each domain
done
done
2. PHP-FPM Pool Configs
# cPanel EA-PHP
find /opt/cpanel/ea-php*/root/etc/php-fpm.d/ -name "*.conf" -type f
# Plesk
find /etc/php-fpm.d/ -name "*.conf" -type f 2>/dev/null
# InterWorx
find /home/*/var/*/php-fpm.conf -type f 2>/dev/null
3. PHP Error Logs
# Use existing function!
error_logs=$(get_user_log_files "$user" "error")
4. FPM Slow Logs
# cPanel
find /opt/cpanel/ea-php*/root/usr/var/log/php-fpm/ -name "*-slow.log"
5. Current FPM Processes
# Get live process count per pool
ps aux | grep "php-fpm: pool $domain" | grep -v grep | wc -l
# Get memory usage
ps aux | grep "php-fpm: pool $domain" | awk '{sum+=$6} END {print sum}'
6. Opcache Status
# Query opcache via PHP
php -r "print_r(opcache_get_status());"
# Per-domain opcache (if using PHP-FPM)
echo '<?php print_r(opcache_get_status()); ?>' | \
su -s /bin/bash $username -c "php -q"
Example Usage Flow
# Server-wide optimization
./modules/performance/php-optimizer.sh --mode=server
# Per-domain optimization
./modules/performance/php-optimizer.sh --domain=example.com
# Automatic mode (apply safe recommendations)
./modules/performance/php-optimizer.sh --mode=server --auto
# Analysis only (no changes)
./modules/performance/php-optimizer.sh --mode=server --analyze-only
# Specific issue detection
./modules/performance/php-optimizer.sh --check=max_children
Safety Features
-
Pre-flight Checks:
- Verify sufficient system memory
- Check current load average
- Ensure configs are writable
- Validate syntax before applying
-
Backups:
- Auto-backup all configs before changes
- Keep last 5 backups with timestamps
- Easy rollback:
--rollback=<timestamp>
-
Gradual Changes:
- Never increase max_children by more than 3x
- Apply changes to 1 domain first, verify
- Monitor for 5 minutes before next domain
-
Resource Limits:
- Never allocate more than 80% of total RAM
- Leave 2GB minimum for system
- Respect MySQL reserved memory
Integration Points
1. Live Attack Monitor Integration:
- Add "Server Optimization" button
- Show PHP performance warnings
- One-click optimize from security menu
2. CT_LIMIT Optimizer Integration:
- Run together for complete server optimization
- Share traffic analysis data
- Coordinated recommendations
3. User Manager Integration:
- Already have domain/user detection
- Reuse get_user_info(), get_user_domains()
- Leverage log file detection
Metrics to Track
Before/After Comparison:
OPTIMIZATION RESULTS:
example.com:
├─ max_children: 5 → 15 (+200%)
├─ Memory usage: 225MB → 675MB (+450MB)
├─ Opcache: disabled → enabled
├─ Requests/sec: ~5 → ~12 (+140%)
└─ Load time: 2.5s → 0.8s (-68%)
System Impact:
├─ Total FPM memory: 2.1GB → 3.8GB
├─ Load average: 2.5 → 1.8 (-28%)
└─ Available RAM: 8GB → 6.5GB
Future Enhancements
-
Auto-tuning Daemon:
- Continuous monitoring
- Auto-adjust based on traffic patterns
- ML-based prediction
-
Performance Benchmarking:
- Before/after page load tests
- Automatic ab (Apache Bench) testing
- TTFB measurements
-
Cost Optimization:
- Identify over-provisioned domains
- Suggest downsizing opportunities
- Resource usage reports
-
Alerting:
- Email when max_children hit
- Slack/Discord webhooks
- Integration with monitoring tools
Next Steps
- ✅ Review this plan
- Create lib/php-detector.sh (detection logic)
- Create lib/php-analyzer.sh (analysis logic)
- Create modules/performance/php-optimizer.sh (main script)
- Test on small server first
- Add to live-attack-monitor menu
- Full testing on production