Μετάβαση στο περιεχόμενο
EuroVPSEuroVPS
Περιοχή πελατών

Rate limit στο ακριβό μονοπάτι, όχι στον crawler

Βρείτε τα URL που κοστίζουν πραγματική δουλειά και περιορίστε εκεί τους crawlers με HAProxy stick tables και 429, χωρίς να βλάψετε την αναζήτηση ή τους επισκέπτες.

Από EuroVPS Engineering

5 λεπτά ανάγνωσης
Rate limit στο ακριβό μονοπάτι, όχι στον crawler

Το να μπλοκάρετε bots είναι εύκολο και συνήθως λάθος. Οι μηχανές αναζήτησης σάς φέρνουν επισκέπτες, τα link previews σάς φέρνουν κλικ, και ακόμη και οι επιθετικοί AI crawlers είναι συχνά κίνηση που προτιμάτε να επιβραδύνετε παρά να αποκλείσετε. Η καλύτερη προσέγγιση είναι να βρείτε πού πραγματικά σας κοστίζουν χρήματα οι crawlers, που είναι μια χούφτα μονοπάτια χωρίς cache και βαριά στη βάση δεδομένων, και να ελέγξετε τον ρυθμό εκεί, στον load balancer. Έτσι το κάνουμε εμείς.

Μάθετε τι είναι ακριβό πριν γράψετε κανόνα

Το κόστος ζει στα μονοπάτια που αστοχούν στην cache και φτάνουν στην PHP και στη βάση δεδομένων: sitemaps που παράγονται επί τόπου, αναζήτηση, faceted πλοήγηση όπου κάθε συνδυασμός φίλτρων είναι ένα φρέσκο query, και οτιδήποτε με query string που η cache δεν ξέρει.

Το access log σας ήδη σας λέει ποια είναι. Αν το log καταγράφει τον χρόνο αιτήματος (το $request_time του nginx, για παράδειγμα, ως τελευταίο πεδίο), αθροίστε τον χρόνο ανά μονοπάτι:

awk '{split($7, p, "?"); t[p[1]] += $NF; n[p[1]]++}
     END {for (u in t) printf "%10.1f s %8d req  %s\n", t[u], n[u], u}' access.log \
  | sort -rn | head -20

Μετά δείτε ποιος τον ξοδεύει, ανά user agent, σε αυτά τα μονοπάτια:

awk -F'"' '$2 ~ /sitemap|search|filter=/ {print $6}' access.log \
  | sort | uniq -c | sort -rn | head -20

Δύο λίστες, δουλειά ενός απογεύματος, και ξέρετε ακριβώς πού θα αποδώσει ένας κανόνας.

Rate limit με HAProxy stick tables

Το HAProxy μπορεί να μετρά ρυθμούς αιτημάτων ανά πελάτη και ανά user agent στη μνήμη, σε ταχύτητα γραμμής, και να ενεργεί πάνω τους. Μια ελάχιστη ρύθμιση που προστατεύει μόνο τα ακριβά μονοπάτια:

backend st_src
    stick-table type ipv6 size 200k expire 10m store http_req_rate(10s)

backend st_ua
    stick-table type string len 128 size 20k expire 10m store http_req_rate(10s)

frontend fe_web
    # bind lines and certificates as usual
    acl expensive path_beg /sitemap /search
    acl expensive url_sub -i filter=
    http-request track-sc0 src table st_src if expensive
    http-request track-sc1 req.fhdr(user-agent) table st_ua if expensive
    http-request deny deny_status 429 hdr Retry-After 60 if expensive { sc_http_req_rate(0) gt 20 }
    http-request deny deny_status 429 hdr Retry-After 60 if expensive { sc_http_req_rate(1) gt 60 }

Τρεις σχεδιαστικές επιλογές μετρούν εδώ. Παρακολουθούνται μόνο τα ακριβά μονοπάτια, οπότε τίποτα άλλο στο site δεν αγγίζεται. Η απάντηση είναι ένα 429 με header Retry-After, που οι ευγενικοί crawlers καταλαβαίνουν ως «επιβράδυνε και ξαναέλα», όχι ως σφάλμα για το οποίο θα σας τιμωρήσουν. Και ο δεύτερος πίνακας μετρά ανά user agent, που πιάνει έναν crawler μοιρασμένο σε πολλές διευθύνσεις ο οποίος θα γλιστρούσε κάτω από ένα όριο ανά διεύθυνση. Τα παραπάνω κατώφλια είναι ενδεικτικά: ορίστε τα δικά σας από όσα μπορεί πραγματικά να σερβίρει το μονοπάτι χωρίς cache.

Αναγνωρίστε τους crawlers προσεκτικά

Ταιριάξτε τα user agents χαλαρά

Οι crawlers αλλάζουν τη μορφή των συμβολοσειρών user agent, προσθέτοντας tokens έκδοσης, URL ή νέα ονόματα προϊόντων. Ένας κανόνας που ταιριάζει ολόκληρη τη συμβολοσειρά ακριβώς σταματά να δουλεύει τη μέρα που αυτή αλλάζει. Το ταίριασμα υποσυμβολοσειράς στο σταθερό μέρος (hdr_sub(user-agent) -i <name>) συνεχίζει να δουλεύει.

Μην μπλοκάρετε κατά λάθος τη μηχανή αναζήτησης

Επαληθεύστε έναν crawler πριν τον αντιμετωπίσετε ειδικά. Οι μεγάλες μηχανές αναζήτησης δημοσιεύουν πώς: μια reverse DNS αναζήτηση στη διεύθυνση του πελάτη πρέπει να επιστρέψει hostname στο domain τους, και μια forward αναζήτηση σε αυτό το hostname πρέπει να επιστρέψει την ίδια διεύθυνση.

host <client-address>        # should return a name in the engine's published domain
host <name-returned-above>   # should return the same client address

Οι γνήσιοι crawlers τότε παίρνουν rate limit στα ακριβά μονοπάτια όπως όλοι, και συνεχίζουν να σαρώνουν ελεύθερα το υπόλοιπο site. Οι απατεώνες δεν παίρνουν χάρες.

Απορρίψτε τα σχήματα που δεν είναι ποτέ νόμιμα

Κάποια μοτίβα αιτημάτων δεν έχουν καμία νόμιμη χρήση: URL που κωδικοποιούνται ξανά και ξανά μέχρι να γίνουν χιλιάδες χαρακτήρες, αδύνατοι συνδυασμοί παραμέτρων, το ίδιο percent-encoding εφαρμοσμένο τρεις φορές. Ένας μόνο κανόνας στο edge τα απορρίπτει πριν κοστίσουν οτιδήποτε:

http-request deny deny_status 400 if { url_sub -i %2525 }

Προσαρμόστε το μοτίβο σε όσα δείχνουν τα logs σας. Το νόημα είναι ότι ο load balancer είναι το φθηνότερο σημείο του stack για να πείτε όχι.

Προστατέψτε την PHP από ό,τι περνά

Κανένας κανόνας στο edge δεν είναι τέλειος, οπότε το επίπεδο εφαρμογής χρειάζεται τα δικά του όρια. Σε κάθε PHP-FPM pool, ένα timeout τερματισμού εμποδίζει ένα παθολογικό αίτημα να κρατά έναν worker για λεπτά, και ένα ανώτατο όριο μνήμης το εμποδίζει να μεγαλώνει χωρίς όριο:

request_terminate_timeout = 60s
php_admin_value[memory_limit] = 256M
pm.max_requests = 500

Ορίστε τα μαζί με τους κανόνες του edge, ώστε τα δύο επίπεδα να συμφωνούν στο πώς μοιάζει ένα λογικό αίτημα. Στο μεταξύ το Varnish συνεχίζει να σερβίρει σελίδες από την cache, οπότε αναγνώστες και αγοραστές δεν νιώθουν τίποτα από όλα αυτά.

Πώς το τρέχουμε εμείς

Στα ειδησεογραφικά και e-commerce properties που λειτουργούμε, τα μονοπάτια sitemap, αναζήτησης και φιλτραρισμένων λιστών παίρνουν φρουρούς ρυθμού από την πρώτη μέρα, διαστασιολογημένους σε όσα μπορεί να σερβίρει κάθε site χωρίς cache. Νέοι κανόνες γράφονται από τα access logs, εγκαθίστανται σε κάθε edge του property, και καταγράφονται με αριθμούς πριν και μετά για τον πελάτη. Όταν εμφανίζεται ένας νέος crawler, ένας στοχευμένος κανόνας μπορεί συνήθως να είναι σε θέση σε κάθε edge μέσα σε λεπτά από την αναγνώριση του μοτίβου.

Ελέγξτε το δικό σας edge

  • Ποια πέντε μονοπάτια κόστισαν τον περισσότερο χρόνο PHP και βάσης δεδομένων την περασμένη εβδομάδα;
  • Ποιος τα ζήτησε, ανά user agent;
  • Τα όριά σας ισχύουν μόνο εκεί που είναι το κόστος, ή σε όλο το site;
  • Απαντάτε με 429 και Retry-After, ή με αποκλεισμό;
  • Πότε επιβεβαίωσε κάποιος τελευταία φορά ότι οι κανόνες ταιριάζουν ακόμη με τη ζωντανή κίνηση;

Αν οι crawlers τρώνε τη χωρητικότητά σας, μπορούμε να διαβάσουμε τα logs σας μαζί σας και να γράψουμε τους κανόνες. Μιλήστε με έναν μηχανικό

Related

  • /what-we-do/operations/edge-traffic-control/
  • /what-we-do/data-web/high-availability-web-tiers/
  • /what-we-do/data-web/performance-audits/

Δημοσιεύθηκε 12 Οκτωβρίου 2026.

Όλες οι σημειώσεις