Webserver performance verbetering
Dit zijn een paar technische maatregelen voor VPS webserver performance verbetering. Het grootste deel van de capaciteit van een webserver gaat op aan overlast door hackers, spammers en scrapers. Daar komen de zoekmachines, sociale media en cronjobs nog bij als overhead. De echte bezoekers zijn vaak een minderheid.
Maatregelen voor een WordPress website
- Dubbele firewall met plugin Wordfence en de 7G firewall in .htaccess, die vullen elkaar mooi aan. En natuurlijk website optimalisatie maatregelen zoals minificatie, concatenatie, cache, lazy loading.
- Cronjobs om het half uur triggeren met curl op de server, per website verdeeld over het half uur. Daarmee voorkom je piekbelastingen als de cronjobs lange tijd niet getriggerd werden. Cronjobs worden in WordPress alleen getriggerd als WordPress geladen wordt, dus niet door een bezoeker die een gecachte pagina (in platte Html) of een bestand te zien krijgt, en ook niet door een geblokkeerde hacker, spammer of scraper.
- Gebruik de robots.txt: sommige bots (zoals ahrefs) volgen dit op, beter geen bezoek dan geblokkeerd bezoek. Daarom bij 7G:[user agent] de robots.txt uitsluiten.
- Generiek blokkeren in .htaccess, kan worden toegevoegd aan de 7G firewall rules:
^/wp-admin/includes/
^/wp-includes/.*\.php
^/wp-content/((mu-)?plugins|themes)/.*\.php - Overweeg TOR te blokkeren in Wordfence op hostnaam, ik kreeg daar alleen maar hackers en spammers van.
- Sommige scrapers kan je beter in Wordfence blokkeren op hostnaam, bijvoorbeeld *.bc.googleusercontent.com. 7G (in .htaccess) doet een reverse DNS lookup, werkt traag of niet (bij fictieve hostnaam). Wordfence blokkeert heel efficiënt met auto-prepend, vóórdat WordPress actief wordt.
- Geo-blocking voor landen als Rusland, China en India als je daar geen relaties hebt.
- Overweeg om users ingelogged te laten met plugin WordPress Persistent Login, daarmee vermijd je ook de reauth bug, die verschillende oorzaken kan hebben (WP herhaalt de login vele keren).
- Bij veel tags en langzaam typen (er zit wel een delay op de query start) veroorzaakt tag invoer met ajax-tag-search voor elk karakter vanaf het 2e karakter veel ajax calls waarbij per call het aantal substring searches = aantal tags * (gemiddelde taglengte – substring lengte + 1). Bij een krant met 3000 deels lange tags sloeg de server compleet op hol. Je kan de tags-suggestie uitstellen om bijvoorbeeld pas na het 6e karakter te beginnen: verander
minLength
van 2 naar 6 in /wp-admin/js/tags-suggest.min.js, of helemaal uitschakelen door het op 99 te zetten. - Deactiveer plugin Advanced Editor Tools (voorheen TinyMCE Advanced), laadt niet altijd goed, javascript probleem.
Facebook en Twitter
- Facebook, Twitter en Bingbot houden zich niet aan de crawl-delay in robots.txt. Je kunt in Wordfence niet throttlen op user agent (alleen algemeen op zoekmachines en dan nog alleen per IP-adres), maar wel in .htaccess door bijvoorbeeld de helft van de tijd de toegang te blokkeren met http-code 503 (service unavailable), zie code hieronder. Dit moet je fine-tunen aan de hand van de logging.
- WP Fastest Cache sluit Facebook, Twitter, LinkedIn en WhatsApp uit van het gebruik van cache, daar is geen goede reden voor dus corrigeren in .htaccess. Daarnaast triggeren Facebook en anderen geen cache aanmaak, eventueel corrigeren in source code. Sommige andere caching plugins sluiten Facebook en co ook uit van caching.
- Facebook en vele anderen proberen ook de url zonder ‘/’ wat tot een redirect leidt. Zorg in .htaccess voor een trailing ‘/’, zie code hieronder.
Webserver performance: Meten is weten
- Tonen van aantal processen in system run queue kan heel goed met php cron event om piekbelastingen te vinden (gebruik plugin WP Crontrol).
- 7G: logging aanzetten geeft geen merkbare vertraging.
- Server logging.
- Gebruik Wordfence Live Traffic.
Bij piekbelastingen hebben alle loggings gaten.
Webserver performance code voorbeelden
Ad11, Twitter in .htaccess met 7G firewall op de even seconden blokkeren, dus op oneven seconden toelaten:
RewriteCond %{TIME_SEC} ^.[02468]$
RewriteCond %{HTTP_USER_AGENT} (twitter) [NC]
RewriteRule .* /7G_log_503.php?log [END,NE,E=7G_USER_AGENT:%1]
Het programma 7G_log_503.php blokkeert met http-code 503 (service unavailable), aangepaste kopie van 7G_log.php die http-code 403 (forbidden) geeft.
Ad 13, trailing ‘/’ in .htaccess toevoegen waar nodig:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !^/wp-json [NC]
RewriteCond %{REQUEST_URI} !\.(gif|jpg|png|jpeg|ico|css|xml|txt|js|php|x?-?html?|
scss|webp|svg|webm|ogg|mp3|avi|wav|mp4|mov|flv|swf|docx?|pdf|xlsx?|rss2?|me|ttf|otf|woff2?|svg|eot|zip|gz|env)$ [NC]
RewriteRule ^(.*)$ https://www.domainname.ext/\/ [L,R=301]