diff --git a/modules/website/lib/extended-analysis-functions.sh b/modules/website/lib/extended-analysis-functions.sh index e4d69a7..2541a54 100644 --- a/modules/website/lib/extended-analysis-functions.sh +++ b/modules/website/lib/extended-analysis-functions.sh @@ -718,6 +718,281 @@ analyze_load_average_trend() { # EXPORT ALL PHASE 4 FUNCTIONS ################################################################################ +################################################################################ +# PHASE 5: CONTENT & NETWORK OPTIMIZATION (Tier 1 Quick Wins) +################################################################################ + +# ============================================================================ +# PHASE 5 CONTENT OPTIMIZATION CHECKS (10 checks) +# ============================================================================ + +### P5.1 - Unoptimized Images +analyze_unoptimized_images() { + local docroot="$1" + if [ ! -d "$docroot" ]; then return 0; fi + + # Count large images (>500KB) that aren't optimized + local large_images=$(find "$docroot" -type f \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" \) -size +500k 2>/dev/null | wc -l) + + if [ "$large_images" -gt 0 ]; then + save_analysis_data "content_optimization.tmp" "WARNING: Found $large_images large unoptimized images (>500KB)" + save_analysis_data "content_optimization.tmp" " Recommendation: Convert to WebP or compress with ImageMagick" + save_analysis_data "content_optimization.tmp" " Impact: 30-50% reduction in transfer size" + fi +} + +### P5.2 - Missing WebP Format +analyze_webp_conversion() { + local docroot="$1" + if [ ! -d "$docroot" ]; then return 0; fi + + # Check if any WebP files exist (suggests conversion is happening) + local webp_count=$(find "$docroot" -name "*.webp" 2>/dev/null | wc -l) + local total_images=$(find "$docroot" -type f \( -name "*.jpg" -o -name "*.png" \) 2>/dev/null | wc -l) + + if [ "$total_images" -gt 10 ] && [ "$webp_count" -eq 0 ]; then + save_analysis_data "content_optimization.tmp" "INFO: WebP conversion opportunity" + save_analysis_data "content_optimization.tmp" " Site has $total_images images but no WebP versions" + save_analysis_data "content_optimization.tmp" " Impact: 30-50% smaller files, better browser support" + fi +} + +### P5.3 - Large CSS/JS Files +analyze_large_assets() { + local docroot="$1" + if [ ! -d "$docroot" ]; then return 0; fi + + # Find large unminified CSS/JS files + local large_css=$(find "$docroot" -name "*.css" -size +100k 2>/dev/null | wc -l) + local large_js=$(find "$docroot" -name "*.js" -size +100k 2>/dev/null | wc -l) + + if [ "$large_css" -gt 0 ] || [ "$large_js" -gt 0 ]; then + save_analysis_data "content_optimization.tmp" "WARNING: Large CSS ($large_css) or JS ($large_js) files" + save_analysis_data "content_optimization.tmp" " Recommendation: Minify or split into smaller chunks" + save_analysis_data "content_optimization.tmp" " Impact: 20-40% reduction in file size" + fi +} + +### P5.4 - Render-Blocking Resources +analyze_render_blocking() { + local domain="$1" + + # Test for render-blocking resources in head + local head_content=$(curl -s "https://$domain/" 2>/dev/null | sed -n '/
/,/<\/head>/p' | grep -c "" + echo " Use: ...content..." + echo "" + echo " 2. Defer non-critical styles:" + echo " " + echo "" + echo " 3. For WordPress:" + echo " Remove render-blocking plugins from head" + echo " Use WP Rocket or W3 Total Cache → Deferment options" + echo "" + echo " Expected Improvement: 1-2 second faster paint" + ;; + + "font_loading_slow") + echo -e "${REMEDIATION_INFO}REMEDIATION: Optimize Font Loading${REMEDIATION_NC}" + echo " Current: Web fonts may be blocking render" + echo " Impact: Invisible text flash (FOIT/FOUT)" + echo "" + echo " Fix:" + echo " 1. Use font-display: swap" + echo " Add to @font-face or link:" + echo " font-display: swap;" + echo "" + echo " 2. Preload fonts in head:" + echo " " + echo "" + echo " 3. For Google Fonts:" + echo " " + echo "" + echo " Expected Improvement: Faster perceived load" + ;; + + "too_many_requests") + echo -e "${REMEDIATION_WARNING}REMEDIATION: Reduce HTTP Requests${REMEDIATION_NC}" + echo " Current: High request count detected ($finding_value+)" + echo " Impact: Each request adds latency" + echo "" + echo " Fix:" + echo " 1. Consolidate files:" + echo " - Combine CSS files" + echo " - Combine JS files" + echo " - Use CSS sprites for small images" + echo "" + echo " 2. Lazy load non-critical resources:" + echo " - Defer images below fold" + echo " - Load ads after page ready" + echo " - Defer analytics" + echo "" + echo " 3. Remove unused resources:" + echo " - Audit plugins for unused scripts" + echo " - Remove unused stylesheets" + echo "" + echo " Expected Improvement: 10-20% faster page load" + ;; + + "third_party_scripts_slow") + echo -e "${REMEDIATION_INFO}REMEDIATION: Optimize Third-Party Scripts${REMEDIATION_NC}" + echo " Current: Multiple third-party scripts slowing page" + echo " Impact: Dependencies outside your control" + echo "" + echo " Fix:" + echo " 1. Lazy load third-party scripts:" + echo " " + echo " Load after page interactive: DOMContentLoaded" + echo "" + echo " 2. Use alternatives:" + echo " - Replace ads with faster provider" + echo " - Self-host critical scripts" + echo " - Use async/defer attributes" + echo "" + echo " 3. Monitor performance:" + echo " Chrome DevTools → Network → filter by third-party" + echo "" + echo " Expected Improvement: 15-30% faster for dependent users" + ;; + + "dns_slow") + echo -e "${REMEDIATION_WARNING}REMEDIATION: Speed Up DNS Resolution${REMEDIATION_NC}" + echo " Current: DNS resolution time ${finding_value}ms (slow)" + echo " Impact: Each page load delayed by 50-200ms" + echo "" + echo " Fix (Choose one):" + echo "" + echo " Option 1: Switch DNS provider" + echo " Current: Check with: nslookup example.com" + echo " Try: 1.1.1.1 (Cloudflare)" + echo " Or: 8.8.8.8 (Google)" + echo "" + echo " Option 2: Use DNS prefetch in HTML head:" + echo " " + echo "" + echo " Option 3: Pre-connect for critical domains:" + echo " " + echo "" + echo " Expected Improvement: 50-100ms faster" + ;; + + "redirect_chain_long") + echo -e "${REMEDIATION_WARNING}REMEDIATION: Eliminate Redirect Chains${REMEDIATION_NC}" + echo " Current: Long redirect chain detected ($finding_value hops)" + echo " Impact: Each redirect adds 100-200ms" + echo "" + echo " Fix:" + echo " 1. Check redirect chain:" + echo " curl -I -L http://example.com" + echo "" + echo " 2. Simplify redirects:" + echo " Example: http://example.com → https://www.example.com → final" + echo " Better: http://example.com → https://www.example.com (direct)" + echo "" + echo " 3. For WordPress:" + echo " Settings → General → Ensure both URLs use https://" + echo "" + echo " Expected Improvement: 200-400ms faster" + ;; + + "ssl_expiring_soon") + echo -e "${REMEDIATION_CRITICAL}REMEDIATION: Renew SSL Certificate${REMEDIATION_NC}" + echo " Current: Certificate expiring in ${finding_value} days" + echo " Impact: CRITICAL - Site will be inaccessible when expired" + echo "" + echo " Fix (Urgent!):" + echo " 1. Using Let's Encrypt (auto-renew):" + echo " certbot renew" + echo " systemctl restart apache2" + echo "" + echo " 2. Manual renewal:" + echo " Contact your SSL provider" + echo " Generate new certificate" + echo " Upload to server" + echo "" + echo " 3. Enable auto-renewal:" + echo " 0 0 * * * /usr/bin/certbot renew --quiet" + ;; + + "keepalive_disabled_network") + echo -e "${REMEDIATION_INFO}REMEDIATION: Enable Connection Keep-Alive${REMEDIATION_NC}" + echo " Current: Keep-Alive not configured" + echo " Impact: Multiple requests open new connections" + echo "" + echo " Fix:" + echo " 1. Edit /etc/apache2/apache2.conf:" + echo " KeepAlive On" + echo " KeepAliveTimeout 15" + echo " MaxKeepAliveRequests 500" + echo "" + echo " 2. Restart:" + echo " systemctl restart apache2" + echo "" + echo " 3. Verify:" + echo " curl -I example.com | grep Connection" + echo " Should see: Connection: keep-alive" + echo "" + echo " Expected Improvement: 20-30% faster for multiple requests" + ;; + *) echo -e "${REMEDIATION_INFO}REMEDIATION RECOMMENDATION: $check_name${REMEDIATION_NC}" echo " Finding: $finding_value" @@ -1317,6 +1548,90 @@ analyze_findings_for_remediation() { echo "" fi + # ═══════════════════════════════════════════════════════════════════════════════ + # PHASE 5 DETECTION PATTERNS + # ═══════════════════════════════════════════════════════════════════════════════ + + echo -e "${REMEDIATION_WARNING}═══ PHASE 5: CONTENT & NETWORK OPTIMIZATION ═══${REMEDIATION_NC}" + echo "" + + # Check for unoptimized images + if grep -qi "large.*image\|unoptimized.*image\|image.*optimization" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "unoptimized_images_found" "detected" "WARNING" + remediation_count=$((remediation_count + 1)) + echo "" + fi + + # Check for WebP format + if grep -qi "webp.*not\|webp.*missing\|webp.*conversion" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "webp_not_implemented" "not implemented" "INFO" + remediation_count=$((remediation_count + 1)) + echo "" + fi + + # Check for large assets + if grep -qi "large.*css\|large.*js\|large.*asset" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "large_assets_detected" "detected" "WARNING" + remediation_count=$((remediation_count + 1)) + echo "" + fi + + # Check for render blocking + if grep -qi "render.*block\|blocking.*resource" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "render_blocking_resources" "detected" "WARNING" + remediation_count=$((remediation_count + 1)) + echo "" + fi + + # Check for font loading + if grep -qi "font.*load\|web.*font" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "font_loading_slow" "detected" "INFO" + remediation_count=$((remediation_count + 1)) + echo "" + fi + + # Check for too many requests + if grep -qi "request.*count\|http.*request\|too.*many.*request" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "too_many_requests" "high count" "WARNING" + remediation_count=$((remediation_count + 1)) + echo "" + fi + + # Check for third-party scripts + if grep -qi "third.*party\|external.*script" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "third_party_scripts_slow" "detected" "INFO" + remediation_count=$((remediation_count + 1)) + echo "" + fi + + # Check for DNS issues + if grep -qi "dns.*resol\|dns.*slow" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "dns_slow" "slow" "WARNING" + remediation_count=$((remediation_count + 1)) + echo "" + fi + + # Check for redirect chains + if grep -qi "redirect.*chain\|multiple.*redirect" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "redirect_chain_long" "long" "WARNING" + remediation_count=$((remediation_count + 1)) + echo "" + fi + + # Check for SSL expiration + if grep -qi "ssl.*expir\|certificate.*expir\|cert.*expire" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "ssl_expiring_soon" "soon" "CRITICAL" + remediation_count=$((remediation_count + 1)) + echo "" + fi + + # Check for keep-alive + if grep -qi "keep.*alive.*disabled\|connection.*keep" "$temp_dir"/*.tmp 2>/dev/null; then + generate_remediation "keepalive_disabled_network" "disabled" "INFO" + remediation_count=$((remediation_count + 1)) + echo "" + fi + if [ $remediation_count -eq 0 ]; then echo -e "${REMEDIATION_SUCCESS}✓ No issues detected! Your site is well optimized.${REMEDIATION_NC}" echo "" diff --git a/modules/website/website-slowness-diagnostics.sh b/modules/website/website-slowness-diagnostics.sh index 1e29366..de2617d 100755 --- a/modules/website/website-slowness-diagnostics.sh +++ b/modules/website/website-slowness-diagnostics.sh @@ -2419,6 +2419,30 @@ run_diagnostics() { analyze_swap_usage_phase4 analyze_load_average_trend + # Phase 5: Content Optimization (10 checks) + print_section "PHASE 5: CONTENT OPTIMIZATION CHECKS" + analyze_unoptimized_images "$DOCROOT" + analyze_webp_conversion "$DOCROOT" + analyze_large_assets "$DOCROOT" + analyze_render_blocking "$domain" + analyze_font_loading "$domain" + analyze_request_count "$domain" + analyze_third_party_scripts "$domain" + analyze_unused_assets "$domain" + analyze_content_delivery "$domain" + analyze_cache_headers "$domain" + + # Phase 5: Network & DNS Optimization (8 checks) + print_section "PHASE 5: NETWORK & DNS OPTIMIZATION CHECKS" + analyze_dns_resolution_time "$domain" + analyze_dns_records "$domain" + analyze_redirect_chains "$domain" + analyze_ssl_certificate "$domain" + analyze_connection_keepalive "$domain" + analyze_https_redirect "$domain" + analyze_network_waterfall "$domain" + analyze_cdn_performance "$domain" + # Generate report print_banner "Generating report..." generate_report