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 "" + save_analysis_data "content_optimization.tmp" " Found $head_content scripts/styles blocking page load" + save_analysis_data "content_optimization.tmp" " Recommendation: Move scripts to end of body, defer non-critical CSS" + fi +} + +### P5.5 - Font Loading Issues +analyze_font_loading() { + local domain="$1" + + # Check for web fonts (may cause render delay) + local fonts=$(curl -s "https://$domain/" 2>/dev/null | grep -c "@font-face\|fonts.googleapis\|fonts.gstatic" || echo 0) + + if [ "$fonts" -gt 0 ]; then + save_analysis_data "content_optimization.tmp" "INFO: Web fonts detected ($fonts references)" + save_analysis_data "content_optimization.tmp" " Recommendation: Use font-display: swap to prevent invisible text" + save_analysis_data "content_optimization.tmp" " Impact: Faster perceived load time" + fi +} + +### P5.6 - HTTP Requests Count +analyze_request_count() { + local domain="$1" + + # Count number of requests on homepage + local request_count=$(curl -s -D - "https://$domain/" 2>/dev/null | grep -c "^HTTP" || echo 0) + + if [ "$request_count" -gt 80 ]; then + save_analysis_data "content_optimization.tmp" "WARNING: High request count ($request_count requests)" + save_analysis_data "content_optimization.tmp" " Each request adds latency even with HTTP/2" + save_analysis_data "content_optimization.tmp" " Recommendation: Consolidate files, defer non-critical resources" + fi +} + +### P5.7 - Third-Party Scripts +analyze_third_party_scripts() { + local domain="$1" + + # Count external scripts (ads, analytics, etc.) + local external_scripts=$(curl -s "https://$domain/" 2>/dev/null | grep -o "src=['\"]https://[^'\"]*['\"]" | grep -cv "$(echo $domain | sed 's/www\.//')" || echo 0) + + if [ "$external_scripts" -gt 5 ]; then + save_analysis_data "content_optimization.tmp" "INFO: Found $external_scripts third-party scripts" + save_analysis_data "content_optimization.tmp" " Impact: Slower page load (external dependencies)" + save_analysis_data "content_optimization.tmp" " Recommendation: Lazy load non-critical third-party scripts" + fi +} + +### P5.8 - Unused CSS/JavaScript +analyze_unused_assets() { + local domain="$1" + + # Detect common signs of unused code + local inline_styles=$(curl -s "https://$domain/" 2>/dev/null | grep -c "style=" || echo 0) + + if [ "$inline_styles" -gt 10 ]; then + save_analysis_data "content_optimization.tmp" "INFO: Found $inline_styles inline styles" + save_analysis_data "content_optimization.tmp" " Recommendation: Move to external stylesheet for better caching" + fi +} + +### P5.9 - Content Delivery Optimization +analyze_content_delivery() { + local domain="$1" + + # Check if responses are compressed + local encoding=$(curl -s -I "https://$domain/" 2>/dev/null | grep -i "content-encoding" || echo "none") + + if echo "$encoding" | grep -iq "gzip\|deflate\|brotli"; then + save_analysis_data "content_optimization.tmp" "✓ Content compression enabled: $encoding" + else + save_analysis_data "content_optimization.tmp" "WARNING: Content compression not detected" + save_analysis_data "content_optimization.tmp" " Impact: 30-50% larger responses" + save_analysis_data "content_optimization.tmp" " Fix: Enable gzip/brotli compression" + fi +} + +### P5.10 - Cache Headers Analysis +analyze_cache_headers() { + local domain="$1" + + # Check cache control headers + local cache_header=$(curl -s -I "https://$domain/" 2>/dev/null | grep -i "cache-control" || echo "none") + + if echo "$cache_header" | grep -iq "max-age=0\|no-cache\|no-store"; then + save_analysis_data "content_optimization.tmp" "WARNING: Cache headers prevent caching" + save_analysis_data "content_optimization.tmp" " Current: $cache_header" + save_analysis_data "content_optimization.tmp" " Recommendation: Set Cache-Control: max-age=3600 (1 hour minimum)" + fi +} + +# ============================================================================ +# PHASE 5 NETWORK & DNS CHECKS (8 checks) +# ============================================================================ + +### P5.11 - DNS Resolution Time +analyze_dns_resolution_time() { + local domain="$1" + + # Measure DNS resolution time + local dns_time=$(dig +stats "$domain" 2>/dev/null | grep "Query time:" | awk '{print $4}') + + if [ ! -z "$dns_time" ] && [ "$dns_time" -gt 100 ]; then + save_analysis_data "network_optimization.tmp" "WARNING: Slow DNS resolution (${dns_time}ms)" + save_analysis_data "network_optimization.tmp" " Recommendation: Use faster DNS provider (1.1.1.1, 8.8.8.8)" + save_analysis_data "network_optimization.tmp" " Impact: Reduce by 50-100ms" + fi +} + +### P5.12 - DNS Records Configuration +analyze_dns_records() { + local domain="$1" + + # Check for unnecessary DNS lookups + local cname_count=$(dig +short CNAME "$domain" 2>/dev/null | wc -l) + + if [ "$cname_count" -gt 3 ]; then + save_analysis_data "network_optimization.tmp" "INFO: Multiple CNAME records detected ($cname_count)" + save_analysis_data "network_optimization.tmp" " Each CNAME adds DNS lookup time" + save_analysis_data "network_optimization.tmp" " Recommendation: Minimize CNAME chains" + fi +} + +### P5.13 - Redirect Chain Length +analyze_redirect_chains() { + local domain="$1" + + # Count redirects from http to https to final destination + local redirect_count=$(curl -s -I -L "http://$domain/" 2>/dev/null | grep -c "HTTP/") + + if [ "$redirect_count" -gt 3 ]; then + save_analysis_data "network_optimization.tmp" "WARNING: Long redirect chain ($redirect_count hops)" + save_analysis_data "network_optimization.tmp" " Impact: Each redirect adds 100-200ms" + save_analysis_data "network_optimization.tmp" " Recommendation: Point http directly to final destination" + fi +} + +### P5.14 - SSL/TLS Certificate Validity +analyze_ssl_certificate() { + local domain="$1" + + # Check certificate expiration + local expiry=$(echo | openssl s_client -servername "$domain" -connect "$domain:443" 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep notAfter | cut -d= -f2) + local days_left=$(( ($(date -d "$expiry" +%s) - $(date +%s)) / 86400 )) + + if [ "$days_left" -lt 30 ]; then + save_analysis_data "network_optimization.tmp" "WARNING: SSL certificate expiring in $days_left days" + save_analysis_data "network_optimization.tmp" " Recommendation: Renew immediately to prevent outage" + fi +} + +### P5.15 - Connection Keep-Alive +analyze_connection_keepalive() { + local domain="$1" + + # Check keep-alive header + local keepalive=$(curl -s -I "https://$domain/" 2>/dev/null | grep -i "connection\|keep-alive" || echo "none") + + if ! echo "$keepalive" | grep -iq "keep-alive"; then + save_analysis_data "network_optimization.tmp" "WARNING: Connection keep-alive not detected" + save_analysis_data "network_optimization.tmp" " Impact: Slower for multiple requests" + save_analysis_data "network_optimization.tmp" " Fix: Set Connection: keep-alive in server config" + fi +} + +### P5.16 - HTTP to HTTPS Redirect +analyze_https_redirect() { + local domain="$1" + + # Check if http redirects to https + local https_test=$(curl -s -I "http://$domain/" 2>/dev/null | grep -c "301\|302\|308") + + if [ "$https_test" -eq 0 ]; then + save_analysis_data "network_optimization.tmp" "WARNING: HTTP not redirecting to HTTPS" + save_analysis_data "network_optimization.tmp" " Security risk and performance impact" + save_analysis_data "network_optimization.tmp" " Recommendation: Add permanent redirect (301)" + fi +} + +### P5.17 - Network Waterfall Analysis +analyze_network_waterfall() { + local domain="$1" + + # Simple check for overall response time + local response_time=$(curl -s -w "%{time_total}" -o /dev/null "https://$domain/" 2>/dev/null | cut -d. -f1) + + if [ "$response_time" -gt 3 ]; then + save_analysis_data "network_optimization.tmp" "WARNING: Overall page load time ${response_time}+ seconds" + save_analysis_data "network_optimization.tmp" " Recommendation: Analyze full waterfall with browser DevTools" + save_analysis_data "network_optimization.tmp" " Check for slow DNS, connection, or server response" + fi +} + +### P5.18 - CDN Performance +analyze_cdn_performance() { + local domain="$1" + + # Check if using CloudFlare, Cloudfront, or other CDN + local cdn_header=$(curl -s -I "https://$domain/" 2>/dev/null | grep -i "server:\|x-served-by\|x-cache" | head -1) + + if echo "$cdn_header" | grep -iq "cloudflare\|cloudfront\|akamai\|cdn"; then + save_analysis_data "network_optimization.tmp" "✓ CDN detected: $cdn_header" + else + save_analysis_data "network_optimization.tmp" "INFO: No CDN detected" + save_analysis_data "network_optimization.tmp" " Recommendation: Implement CDN for 20-40% faster delivery" + fi +} + +################################################################################ +# EXPORT ALL FUNCTIONS +################################################################################ + export -f analyze_backup_schedule export -f analyze_db_optimization_schedule export -f analyze_slow_cron_jobs @@ -735,3 +1010,21 @@ export -f analyze_disk_inode_usage export -f analyze_zombie_processes export -f analyze_swap_usage_phase4 export -f analyze_load_average_trend +export -f analyze_unoptimized_images +export -f analyze_webp_conversion +export -f analyze_large_assets +export -f analyze_render_blocking +export -f analyze_font_loading +export -f analyze_request_count +export -f analyze_third_party_scripts +export -f analyze_unused_assets +export -f analyze_content_delivery +export -f analyze_cache_headers +export -f analyze_dns_resolution_time +export -f analyze_dns_records +export -f analyze_redirect_chains +export -f analyze_ssl_certificate +export -f analyze_connection_keepalive +export -f analyze_https_redirect +export -f analyze_network_waterfall +export -f analyze_cdn_performance diff --git a/modules/website/lib/remediation-engine.sh b/modules/website/lib/remediation-engine.sh index d7acc2d..f90d8ff 100644 --- a/modules/website/lib/remediation-engine.sh +++ b/modules/website/lib/remediation-engine.sh @@ -1023,6 +1023,237 @@ generate_remediation() { echo " Expected Result: Load levels decrease" ;; + # ═══════════════════════════════════════════════════════════════════════════════ + # PHASE 5: CONTENT & NETWORK REMEDIATION + # ═══════════════════════════════════════════════════════════════════════════════ + + "unoptimized_images_found") + echo -e "${REMEDIATION_WARNING}REMEDIATION: Optimize Images${REMEDIATION_NC}" + echo " Current: Found large unoptimized images (>500KB)" + echo " Impact: 30-50% reduction in transfer size" + echo "" + echo " Fix (Choose one):" + echo "" + echo " Option 1: Using plugin (easiest)" + echo " wp plugin install imagify --activate" + echo " Imagify → Bulk optimize all images" + echo "" + echo " Option 2: Using ImageMagick CLI" + echo " convert input.jpg -quality 85 output.jpg" + echo " mogrify -quality 85 *.jpg" + echo "" + echo " Option 3: Convert to WebP" + echo " cwebp input.jpg -o output.webp" + echo " Use with fallback to JPEG" + echo "" + echo " Expected Improvement: 30-50% smaller files" + ;; + + "webp_not_implemented") + echo -e "${REMEDIATION_INFO}REMEDIATION: Implement WebP Format${REMEDIATION_NC}" + echo " Current: No WebP images found despite many images" + echo " Impact: 30-50% smaller files with modern browsers" + echo "" + echo " Fix:" + echo " 1. Add plugin for automatic WebP:" + echo " wp plugin install imagify --activate" + echo "" + echo " 2. Or use ShortPixel:" + echo " wp plugin install shortpixel-image-optimiser --activate" + echo "" + echo " 3. Manual with picture tags:" + echo " " + echo " " + echo " ..." + echo " " + echo "" + echo " Expected Improvement: 30-50% reduction for modern browsers" + ;; + + "large_assets_detected") + echo -e "${REMEDIATION_WARNING}REMEDIATION: Minify and Split Assets${REMEDIATION_NC}" + echo " Current: Large CSS/JS files (>100KB) detected" + echo " Impact: Slower page load" + echo "" + echo " Fix:" + echo " 1. Enable minification:" + echo " W3 Total Cache → Settings → Minify" + echo " Or: wp plugin install wp-optimize --activate" + echo "" + echo " 2. Split large files:" + echo " - Critical CSS only in head" + echo " - Non-critical CSS deferred" + echo " - JS split by page section" + echo "" + echo " 3. Test minified output:" + echo " Check network tab in DevTools" + echo "" + echo " Expected Improvement: 20-40% reduction in file size" + ;; + + "render_blocking_resources") + echo -e "${REMEDIATION_WARNING}REMEDIATION: Defer Render-Blocking Resources${REMEDIATION_NC}" + echo " Current: Multiple scripts/styles blocking page render" + echo " Impact: Slower first contentful paint" + echo "" + echo " Fix:" + echo " 1. Move scripts to end of :" + echo " Instead of: " + 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