Support » Allmänna frågor » Caching och lastbalansering av statisk WP-sajt

  • Hej,

    Jag vill be om råd angående övergripande design av caching och lastbalansering av Enfold http-sajt som inte har inloggning eller användaranpassat innehåll. Innehållet kommer att förändras sällan.

    Sajten har utformats av en design- men inte teknikkunnig konsult. Den finns idag på en dedikerad testserver som jag själv installerat och hostar i ett colocation center. (Tyvärr kan jag inte länka till den då produkterna ännu inte lanserats.)

    Nu ska jag få på plats en passande fler-server-lösning med caching och lastbalansering och försöker förstå vilka programvaror och ”funktionsplacering” på servrarna som är bäst i mitt fall. OS är Debian Stretch, med Apache och MariaDB. Jag använder inga andra plugins än WordPress Importer.

    De programvaror jag tittat på är Apache reverse proxy cache, Varnish och NGINX. NGINX verkar ha bäst prestanda men jag är av olika (här oväsentliga) anledningar tveksam till att använda den.

    Jag antar att det ”ytterst” bör sitta en lastbalanserande server och att det bakom den finns X st caching-servrar.

    En fråga är om caching-servrarna var och en ska ha en kopia av WP-sajten (dvs X identiska WP-installationer) eller om caching-servrarna ska anropa en gemensam WP-server (med MariaDB på samma maskin).

    En annan fråga är var bilderna bör placeras. På caching-servrarna?

    Tacksam för hjälp.

    MVH

    Niclas

Visar 1 svar - 1 till 4 (av 4 totalt)
  • Hej @kimmeridgien !

    Spännande och bred fråga. Vad som är den perfekta lösningen kommer skilja sig beroende på din förväntade trafik, önskad upptid och budget.

    Om du planerar att ta emot ganska få besökare på statiskt innehåll (läs: typ <100 000/dag) så är det inte ens givet att du behöver sätta upp någon lastbalansering. Med en kraftfull virtuell eller dedikerad maskin och ett sidcacheplugin kan du få en rask leverans av sajten från en punkt. Du kan också installera s.k. persistent Object Cache med Redis eller Memcached (sök på https://wordpress.org/plugins/ ) vilket sänker lasten på databasen avsevärt.

    Om du vill flytta ut hanteringen av cachen till egen hårdvara eller ha det mer som en egen komponent så skulle jag rekommendera Varnish. Det är relativt lätt att sätta upp på egen server, och det finns ett bra tillägg som ger dig en baskonfiguration att jobba utifrån:
    https://sv.wordpress.org/plugins/vcaching/

    Syftet här bör vara att så få requests som möjligt tränger igenom cachen och går ner till backenden.

    Om du vill ta upp det ytterligare ett steg skulle jag reka att sätta upp master/slave-replikering på MariaDB och lastbalansera SQL-frågorna. Ta en titt på HyperDB om du är intresserad av denna rutt: https://wordpress.org/plugins/hyperdb/

    Sist så kan du absolut ha flera maskiner med samma WordPress-kod på och lastbalansera mellan dessa i tex Varnish. En bra sak att tänka på är att man fortfarande bör ha en delad wp-content/uploads-mapp (tex på NFS eller glusterfs). Det kan även hjälpa att ha något flöde för att skjuta ut koden på samtliga maskiner. Här kan du tex köra https://deployer.org/

    Jag är ledsen om mitt svar inte är helt uttömmande då frågan är så bred, om du har några uppföljningsfrågor får du gärna ställa dem.

    Hej Stanislav!

    Stort tack för bra svar. Jag håller på att smälta informationen och bestämma mig för hur jag ska göra.

    Förstår jag dig rätt angående alternativet med delad wp-content/uploads-mapp på NFS? Poängen är att ha _en_ gemensam lagring av innehållet, men denna NFS-mapp kan publiceras mot webben från varje enskild WP-server? Med Varnish på varje WP-server kommer belastningen på NFS-servern bli minimal?

    Om man inte vill avsätta två klustrade maskiner för web-publicering av delad wp-content/uploads-mapp eller NFS-backend, finns det något hinder mot att bygga redundansen genom att istället ha X lastbalanserade WP-servrar med Varnish och lokal lagring av det statiska bildinnehållet? Om bilderna har samma file properties och i övrigt är identiska kopior – finns det någon risk att andras cache-/proxy-servrar ”på vägen” till besökarna ser någon skillnad och refreshar i onödan?

    En helt annan typ av fråga: Finns det tumregler för hur mycket RAM-minne som utnyttjas (mer är alltid bättre för ökat ködjup?) respektive skalning ifråga om dels flera CPU-kärnor och dels flera CPUer jämfört med flera separata servrar?

    MVH

    Niclas

    Hej igen @kimmeridgien !

    Tanken med NFS är som du skriver att man ska kunna ha gemensam lagring istället för att behöva synka filerna med rsync eller liknande (vilket låter som en ganska krånglig lösning om man har fler än två webbfrontar eftersom alla frontar måste synka med varandra).

    Precis som du skriver är tanken att du konfigurerar en ganska lång cachetid i Varnish för allting under /wp-content/uploads/.* vilket gör att det i praktiken inte går så mycket trafik över NFS:en utan att det mesta absorberas av Varnishen.

    Det största problemet med att synka filer istället för att köra NFS är att rsync och liknande inte sker atomiskt, utan med fördröjning. I praktiken kan det innebära att en administratör laddar upp en bild (vilket tex. hamnar på webbfront A). Bilden visas direkt i förhandsgranskningen inne i WordPress men bildlänken lastbalanseras och hämtas via webbfront B som ännu inte fått innehållet replikerat till sig, vilket resulterar i ett temporärt 404-fel. Du kan lösa detta genom att se till att url:arna wp-admin/.* samt när man är inloggad alltid går till en viss specifik webbfront, tex alltid A. Då blir risken endast att besökare ska se något innan det replikerats, men eftersom Rsync bara tar några sekunder så är det i praktiken inte så farligt.
    (PS. Förenklat kan man säga att man är inloggad när kakan wordpress_logged_in_.* är satt. )

    Tror inte det finns några risker eller likn. i övrigt.

    Hur mycket minne som används beror på hur du konfigurerar din PHP-modul (olika om du kör Apache mod_php, Apache worker eller Nginx med php-fpm). Mycket kortfattat så ska du leta efter inställningen för mängden ”workers” eller ”children”. (kallar dem för workers from nu) Minnesanvändningen blir antal workers multiplicerat med mängden minne som en genomsnittlig sidladdning tar. Du kan få en uppskattning av ungefär hur mycket minne varje arbetare drar genom att använda tillägg som Query Monitor, vilket visar minnesanvändning uppe i admin bar.

    Det viktigaste är att inte konfigurera för många workers på för lite minne. I praktiken rekommenderar jag att börja med att allokera 1-2GB minne och sedan utvärdera minnesanvändningen efter några dagar. Allokeras det för lite minne? Skruva upp antal workers. Tar minnet slut och du börjar swappa? Sänk mängden workers.

    Lite om workers i Nginx:
    Visa på Medium.com

    Och i Apache:
    https://www.digitalocean.com/community/tutorials/how-to-optimize-apache-web-server-performance

    Hej Stanislav!

    Tack ännu en gång. Ursäkta mitt sena svar. Jag har pysslat med att migrera sajten först från testservern till en av produktionsservrarna och därifrån till de andra tre produktionsservrarna och utan framgång envisats med att försöka göra det utan att använda en plugin.

    Jag har:
    * Kopierat innehållet i wp-content/uploads med tar -cvpf / -xvpf.
    * Gjort en databasdump på wordpress-databasen på källproduktionsservern och droppat samt skapat wordpress-databasen och slutligen laddat in dumpen på målproduktionsservern.
    * Kollat permalink-inställningarna och sparat om utan ändringar. Av någon anledning visas bara vissa av bilderna trots att de är identiska kopior från källproduktionsservern. Alla produktionsservrarna har identisk installation av WordPress.

    Enligt flera sidor på nätet ska det räcka, men det är något jag missat. Vet du var man måste göra ytterligare?

    MVH

    Niclas

Visar 1 svar - 1 till 4 (av 4 totalt)
  • Ämnet ”Caching och lastbalansering av statisk WP-sajt” är stängt för nya svar.