Σταματήστε τα CPU Spikes στο WordPress που προκαλούνται από bots (Μόνο με .htaccess + Wordfence)

Αν το WordPress site σου ξαφνικά φτάνει 100% CPU (ή το hosting δείχνει ότι μαζεύονται lsphp processes), υπάρχει μεγάλη πιθανότητα να αντιμετωπίζεις επιθετικό crawling ή scraping από bots—ειδικά σε WooCommerce κατηγορίες και σελίδες προϊόντων.

Αυτός ο οδηγός δείχνει ένα καθαρό, πρακτικό τρόπο χρησιμοποιώντας μόνο:

  • ένα single snippet στο .htaccess (Apache/LiteSpeed)

  • Wordfence → Tools → Live Traffic για να εντοπίσεις τις IP που επιτίθενται

Χωρίς Cloudflare, χωρίς πρόσβαση σε server.

Πώς να επιβεβαιώσεις ότι είναι bots (2 λεπτά)

1) Έλεγξε το hosting “Resource Usage / Snapshot”

Σε cPanel hosting (ειδικά CloudLinux), άνοιξε Resource Usage → Snapshot και ψάξε για:

  • πολλά lsphp:/home/.../public_html/index.php

  • μερικές φορές wp-cron.php

  • την CPU να μένει “καρφωμένη” ακόμα κι όταν δεν δοκιμάζεις εσύ το site

Αυτό συνήθως σημαίνει ότι τα requests χτυπάνε επανειλημμένα PHP (το cache γίνεται bypass ή δεν σερβίρει hits).

2) Έλεγξε το Wordfence Live Traffic (το καλύτερο σημάδι)

Πήγαινε:

Wordfence → Tools → Live Traffic

Ψάξε για μοτίβα όπως:

  • η ίδια σελίδα να χτυπιέται συνέχεια (π.χ. /product-category/...)

  • πολλά διαφορετικά IP μέσα σε πολύ μικρό χρονικό διάστημα

  • IP από “περίεργες”/απρόσμενες τοποθεσίες

  • “περίεργα” ή ανύπαρκτα user agents

Αν βλέπεις πολλές IP όπως 57.141.4.17, 57.141.4.61, 57.141.4.64 να βαράνε το ίδιο URL, τότε έχεις bot wave.

Η λύση με .htaccess (ένα μόνο snippet)

Κάνε paste το παρακάτω πάνω από το # BEGIN WordPress στο root .htaccess.

Αυτό το snippet κάνει 3 πράγματα:

  • μπλοκάρει το xmlrpc.php (συχνός στόχος bots)

  • μπλοκάρει προφανή scrapers/headless εργαλεία από User-Agent

  • σου επιτρέπει προαιρετικά να μπλοκάρεις IP ranges (το πιο αποτελεσματικό “πυροσβεστικό” σε πραγματικά waves)

📄
Simple Anti-Bot Shield (Apache / LiteSpeed)
Copy to clipboard
# =======================================================
# Simple Anti-Bot Shield (Apache / LiteSpeed)
# Paste ABOVE: # BEGIN WordPress
# =======================================================

# 1) Block XML-RPC (commonly abused; safe for most sites)
<Files "xmlrpc.php">
  Require all denied
</Files>

<IfModule mod_rewrite.c>
RewriteEngine On

# 2) Allow Google (skip the next rules)
RewriteCond %{HTTP_USER_AGENT} (Googlebot|Google-InspectionTool|AdsBot-Google|Mediapartners-Google) [NC]
RewriteRule .* - [S=3]

# 3) Block empty / missing User-Agent (almost always bots)
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^-$
RewriteRule .* - [F,L]

# 4) Block common scrapers and headless browsers
RewriteCond %{HTTP_USER_AGENT} (curl|wget|python-requests|scrapy|aiohttp|httpclient|Go-http-client|libwww-perl|okhttp|node-fetch|axios|postman|httpie|PycURL|HeadlessChrome|PhantomJS|Puppeteer|Playwright|selenium) [NC]
RewriteRule .* - [F,L]

# 5) Block generic "bot" keyword (except Googlebot)
RewriteCond %{HTTP_USER_AGENT} bot [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot [NC]
RewriteRule .* - [F,L]

</IfModule>

# 6) OPTIONAL: Block attacker IP ranges (recommended during spikes)
# Add the /24 ranges you discover from Wordfence Live Traffic.
<RequireAll>
  Require all granted
  # Example blocks (uncomment and edit):
  # Require not ip 57.141.4.0/24
  # Require not ip 116.179.33.0/24
</RequireAll>

Χρειάζεσαι IP blocking για να δουλέψει;

Όχι πάντα.

  • Αν το πρόβλημα είναι κυρίως “εύκολοι” scrapers, οι κανόνες User-Agent μόνοι τους μπορεί να μειώσουν το load.

  • Αν τρως bot wave με “κανονικά” User-Agents, το IP blocking είναι αυτό που πραγματικά σταματάει το flood.

Σε πραγματικά περιστατικά, το IP blocking συχνά δίνει τη μεγαλύτερη πτώση στην CPU, γιατί κόβει το request πριν φτάσει WordPress/PHP.

Πώς να μπλοκάρεις το σωστό IP range (χωρίς λάθη)

Βήμα 1: μάζεψε 5–20 IP από το Wordfence Live Traffic

Παράδειγμα:

  • 57.141.4.17

  • 57.141.4.61

  • 57.141.4.64

Βήμα 2: κάνε τα IP /24 range

Αν οι περισσότερες IP έχουν τα ίδια πρώτα 3 blocks:

57.141.4.X → μπλοκ: 57.141.4.0/24

Βάλ’ το εδώ:

📄
How to block the correct IP range
Copy to clipboard
<RequireAll>
  Require all granted
  Require not ip 57.141.4.0/24
</RequireAll>

Σημαντικό: το 57.141.0.0/24 δεν μπλοκάρει το 57.141.4.*.
Το /24 ταιριάζει μόνο το τελευταίο κομμάτι του τρίτου block.

Τι να ΜΗΝ κάνεις (συχνά λάθη)

❌ Μην μπλοκάρεις Googlebot με IP

Οι IP του Google crawling αλλάζουν και δεν πρέπει να τις μπλοκάρεις “μαντεύοντας”. Αν θες να μειώσεις crawl rate, κάν’ το από Search Console (όχι από .htaccess).

❌ Μην μπλοκάρεις τεράστια ranges “στα τυφλά” (π.χ. /16)

Ξεκίνα με /24 που βλέπεις στα logs. Μεγάλωσε το range μόνο αν το επιβεβαιώσεις ότι είναι ασφαλές.

❌ Μην ανακατεύεις deny from με Require not ip

Χρησιμοποίησε μία προσέγγιση. Το snippet παραπάνω χρησιμοποιεί τη σύγχρονη, σταθερή μορφή:

Require not ip ...

Γρήγορο checklist μετά την ενεργοποίηση του snippet

  1. Παρακολούθησε Wordfence Live Traffic:

  • οι attacker IP θα πέσουν, ή θα αρχίσουν να παίρνουν 403.

  1. Παρακολούθησε cPanel Resource Usage / Snapshot:

  • λιγότερα index.php processes

  • η CPU πρέπει να αρχίσει να πέφτει μέσα σε λίγα λεπτά

Όταν αυτό δεν είναι αρκετό (και τι να κάνεις μετά)

Αν το site σου τρώει συχνά bot waves, το .htaccess θα βοηθήσει αλλά δεν θα σου δώσει πραγματικό rate-limiting.

Η μακροπρόθεσμη λύση είναι WAF/rate-limiter (π.χ. Cloudflare), αλλά αν θες να μείνεις “hosting-only”, κράτα αυτή τη συνήθεια:

  • παρακολούθα το Live Traffic

  • πρόσθεσε/αφαίρεσε /24 blocks όταν χρειάζεται

  • κράτα μόνιμα το UA shield