it-swarm.dev

Kroky k optimalizaci WordPress vzhledem k zatížení serveru?

Kromě instalace W3 Celkem mezipaměti nebo jiný plugin pro ukládání do mezipaměti, jaké kroky mohu udělat, aby se ujistil, že moje téma a web běží co nejrychleji.

80
Paul Sheldrake

Můžete nainstalovat WordPress na Nginx. Existuje několik zdrojů, které vám pomohou:

Některé informace o výkonu z tohoto posledního odkazu (což je trochu jiné nastavení než ostatní):

Tak jsem se rozhodl dát proxy před wordpress do statické cache co nejvíce. Veškerý neoverený provoz je obsluhován přímo z mezipaměti souborů nginx, přičemž některé požadavky (např. Generování RSS kanálů) jsou od 6 stran/sekundu do 7000+ stránek/sekundu. Oof. Nginx také zpracovává protokolování a gzipping, zanechává těžší backend apaches dělat to, co dělají nejlépe: slouží dynamické wordpress stránky pouze v případě potřeby.

...

Na nginxu je to tak účinné, že je to děsivé. Nikdy jsem neviděl používat více než 10 až 15 megabajtů RAM a výkyv CPU, a to i pod naším nejtěžším zatížením. Naše grafy ganglia nelžou: snížili jsme nároky na paměť, zdvojnásobili propustnost odchozí sítě a zcela vyrovnali naši zátěž. Neměli jsme v podstatě žádné problémy, protože jsme to nastavili.

31
Travis Northcutt

Nastavte klientské expiries pro věci jako css, obrázky, JavaScript atd., Které nemusejí být znovu stahovány pro každé zobrazení stránky. Toto, zdaleka, dělal největší rozdíl k mým časům načítání stránek. Nejrychlejší stahování je stažení, které se nikdy nestalo ...

# BEGIN Expire headers
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 7200 seconds"
  ExpiresByType image/x-icon "access plus 2592000 seconds"
  ExpiresByType image/jpeg "access plus 2592000 seconds"
  ExpiresByType image/png "access plus 2592000 seconds"
  ExpiresByType image/gif "access plus 2592000 seconds"
  ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
  ExpiresByType text/css "access plus 2592000 seconds"
  ExpiresByType text/javascript "access plus 2592000 seconds"
  ExpiresByType application/x-javascript "access plus 2592000 seconds"
  ExpiresByType text/html "access plus 7200 seconds"
  ExpiresByType application/xhtml+xml "access plus 7200 seconds"
</IfModule>
# END Expire headers

# BEGIN Cache-Control Headers
<IfModule mod_headers.c>
  <FilesMatch "\\.(ico|jpe?g|png|gif|swf|gz)$">
    Header set Cache-Control "max-age=2592000, public"
  </FilesMatch>
  <FilesMatch "\\.(css)$">
    Header set Cache-Control "max-age=2592000, public"
  </FilesMatch>
  <FilesMatch "\\.(js)$">
    Header set Cache-Control "max-age=2592000, private"
  </FilesMatch>
<filesMatch "\\.(html|htm)$">
Header set Cache-Control "max-age=7200, public"
</filesMatch>
# Disable caching for scripts and other dynamic files
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
</IfModule>
# END Cache-Control Headers

Můžete před-gzip vše, co můžete rozumně (7-Zip je dobrý nástroj pro to) & nahrát na stejném místě jako soubor, který jste právě gzipped. Změnit .htaccess sloužit pre-gzipped soubory, jak je uvedeno níže. Výstrahou je, že si musíte pamatovat, zda je chcete aktualizovat. Tím se kromě analýzy .htaccess vypíše režie CPU.

RewriteEngine on
#Check to see if browser can accept gzip files. If so and we have it - serve it!
ReWriteCond %{HTTP:accept-encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
#make sure there's no trailing .gz on the url
ReWriteCond %{REQUEST_FILENAME} !^.+\.gz$
#check to see if a .gz version of the file exists.
RewriteCond %{REQUEST_FILENAME}.gz -f
#All conditions met so add .gz to URL filename (invisibly)
RewriteRule ^(.+) $1.gz [QSA,L]

To je jen hrubá odpověď. Existuje mnoho variant tohoto tématu. O tom jsem blogoval a přidal několik odkazů na podrobnější články na http://icanhazdot.net/2010/03/23/some-wordpress-stuff/ . Přečtěte si to, a co je důležitější, odkazy, na které poukazuji - jsou to dobré zdroje.

Uvědomte si, že pokud často hádáte, uživatelé budou muset aktualizovat svou vyrovnávací paměť.

Plugin, který jsem našel velmi užitečný, je wp-minify . To, co je třeba sledovat, je to, že byste měli vyloučit položky specifické pro stránku (kontaktní formulář, posuvník na titulní stránce atd.), Abyste nemuseli stahovat celou sadu css, JS atd. Pro každou stránku. Je to dobrý způsob, jak minifikovat, kombinovat a komprimovat základní linku CSS, JS atd. Je to mnohokrát omezeno na požadavky http. Wp-minify hraje dobře se supercache a také s hlavičkami, které jsem popsal výše.

Použijte Yslow v Firebugu (Firefox) nebo podobné pro sledování vašich http požadavků a co je a není komprimované. Podívejte se také na záhlaví platnosti. Brzy uvidíte, co můžete zlepšit.

26
CAD bloke

Minimalizujte počet zásuvných modulů, na které běžíte, pouze to, co opravdu potřebujete. Zejména si uvědomte, pluginy, které přidávají JavaScript a CSS kód na každém zatížení stránky, i když tento kód není používán na stránce.

Pokud vytváříte vlastní motiv od nuly, rozdělte si CSS tak, aby funkce, které jsou potřeba pouze pro jednotlivé šablony stránek nebo typy zobrazení (jeden příspěvek, archivy, kategorie atd.), Byly načteny pouze v případě potřeby.

Nakonfigurujte W3TC tak, aby používal CDN (např. Amazon CloudFront nebo některý z dalších podporovaných W3TC).

Zjistěte, zda funkce Minify fungují pro vás (některé pluginy generují js/css, který nebude pěkně minifikovat, takže po aktivaci funkce minify otestujte své stránky).

Pokud máte plnou kontrolu nad MySQL serverem, ujistěte se, že máte dotaz_cache zapnutý. Použijte MySQL ladicí skript pro nalezení dalších způsobů, jak optimalizovat konfiguraci vaší databáze.

Pokud je z nějakého důvodu problematické používat CDN, nakonfigurujte mod_expires ve vašem nastavení Apache. Nastavte dobu platnosti tak dlouho, jak je rozumné pro statické typy, jako jsou obrázky, css, javascript, video, zvuk atd.

21
Dougal Campbell

Spustit memcached a použít cache objektů ke snížení počtu databázových dotazů. Tato data ukládají data z databáze místo stránek. Nejste si jisti, zda to w3-total-cache již provádí.

Ujistěte se, že používáte mezipaměť operačního systému jako APC . (K dispozici je několik dalších.)

14
Annika Backstrom

Kromě použití zásuvného modulu pro ukládání do mezipaměti disku, jako je například wp-cache, umístěte svůj blog na svazek hostitele, na kterém je nastavena vlastnost „noatime“. V opačném případě SSH do vašeho hostitele (pokud to webhosting poskytuje) a běžně spouštíte tento příkaz ve vašich souborech každých několik dní:

chattr -R +A ~/*

~/* Znamená "mé soubory ve svém domovském adresáři". Cestu můžete změnit, jak uznáte za vhodné. Můžete také nastavit to na cron úlohu v cpanel, pokud váš webhostitel poskytuje.

Pro více informací o vlastnostech atime viz this . To urychlí Linux disk čtení výkon velmi.

Někdy jsou vaše stránky bušeny pavouky. Můžete použít nástroj, jako je SpyderSpanker nebo Chennai Central, abyste odfiltrovali pavouky, kteří nepomáhají přivést více stránek na vaše stránky a pouze zpomalit, a pak jim poslat náhodné pavouky (např. Google, Bing atd.) Tím, že jim pošlou náhodné informace. HTTP 304 Zprávy nejsou změněny.

Další věc, kterou vidím, je jen špatně napsaný plugin. Pokud se naučíte, jak dělat pluginy, začnete vidět, jak jsou některé pluginy neefektivně kódované, nebo dokonce najít timebomby, například databázovou tabulku, která vyplňuje a vyplňuje a nikdy se nevymaže, ukládají věci jako příchozí data připojení.

Kromě všech ostatních řešení zde můžete také vytvořit webovou farmu WordPress svého blogu tak, že ji umístíte na několik počítačů s webovými uzly, které se všechny připojí zpět k jedné databázi a jednomu svazku disků pro soubory (například svazek připojený přes systém souborů NFS). ). Podívejte se na Ultra Monkey pro to, jak to všechno dostat.

8
Volomike

Několik odpovědí z horní části mé hlavy:

1) Minimalizujte počet požadavků HTTP, které má prohlížeč provést, aby váš hostitel zřetězil JavaScript a CSS, pokud je to možné/praktické.

2) Vypusťte co nejvíce svého obrazu/média sloužícího třetím stranám, zejména pokud používáte sdílený hosting.

3) Zkuste snížit počet příspěvků, které se zobrazují na titulní stránce, aby se snížil celkový čas vykreslení.

3a) Pokuste se použít téma, které na úvodní stránce a všech ostatních starších příspěvcích prezentuje několik uváděných příspěvků.

7
ZaMoose

Ukládání do paměti WordPress Menu také zvyšuje výkon. Zejména pokud máte mnoho stránek nebo obří strukturu menu, je třeba to zvážit.

Udělej to ve 2 jednoduchých krocích. Nejdříve vytvořte funkci, která získá nebo vytvoří nabídku namísto přímého volání wp_nav_menu.

function get_cached_menu( $menuargs ) {

    if ( !isset( $menuargs['menu'] ) ) {

        $theme_locations = get_nav_menu_locations();
        $nav_menu_selected_id = $theme_locations[$menuargs['theme_location']];
        $termslug = get_term_by( 'id', $nav_menu_selected_id, 'nav_menu' );
        $transient = 'menu_' . $termslug->slug . '_transient';

    } else {

        $transient = 'menu_' . $menuargs['menu'] . '_transient';

    }


    if ( !get_transient( $transient ) ) { // check if the menu is already cached

        $menuargs['echo'] = '0'; // set the output to return
        $this_menu = wp_nav_menu( $menuargs ); // build the menu with the given $menuargs
        echo $this_menu; // output the menu for this run
        set_transient( $transient, $this_menu ); // set the transient, where the build HTML is saved

    } else {

        echo get_transient( $transient ); // just output the cached version

    }

}

V motivu nahraďte wp_nav_menus znakem get_cached_menu. Nyní, pokaždé, když je volána nabídka, máte místo celé Menubuilding jeden Databasequery.

Nabídky se nemění často - ale musíte také zavěsit do akce wp_update_nav_menu, abyste odstranili staré přechody.

Udělej to takhle:

add_action('wp_update_nav_menu', 'my_delete_menu_transients');

function my_delete_menu_transients($nav_menu_selected_id) {

    $termslug = get_term_by( 'id', $nav_menu_selected_id, 'nav_menu' );

    $transient = 'menu_' . $termslug->slug . '_transient';

    delete_transient( $transient ); 

}

Menu se vygeneruje při příštím zavolání stránky - a bude používat verzi uloženou v mezipaměti, dokud někdo znovu neobnoví nabídku.

Aktualizovaná verze

Díky @helgatheviking za poukázání na chybu mezi slimáky a ID. Aktualizoval jsem funkce tak, aby fungoval jak s theme_position a menu (pro přímé volání menu).

Nabídky se vždy ukládají s názvem Menu, nikoli do pozice v tématu.

7
fischi

Použijte třídu databáze, která je oříznuta pro optimalizaci. Vyrobili jsme dobré zkušenosti s vlastním kódem pro snížení využití paměti a rychlosti přístupu k databázi. Kromě toho můžete optimalizovat samotnou strukturu databáze některými malými změnami, které také hodně fungují.

Část kódu třídy databáze lze nalézt v wordpress trac, neudělal to do jádra ( Ticket # 11799 a související ).

5
hakre

Pro vysoce obchodované stránky byste měli naladit všechny vyrovnávací paměti MySQL pro obsah, který je nyní na místě. Bez ohledu na verzi WordPressu, může mít vrstva MySQL svou konfiguraci vypočítanou .

Ve skutečnosti, pokud máte InnoDB data bez povolení innodb_file_per_table, musíte vyčistit InnoDB segmentováním každé tabulky do vlastního fyzického tabulkového prostoru . Je možné udělat slušné ladění MySQL i když máte omezený hardware . Existují mnoho scénářů pro provádění takových optimalizací InnoDB .

IMHO, nemůžete naplánovat dobré nastavení pro my.cnf, aniž byste věděli, kolik dat chcete konfigurovat. Budete muset pravidelně načítat aktuální sadu dat z výroby do pracovního prostředí, provádět optimalizace a odcházet s čísly, která se mají konfigurovat v my.cnf produkčního serveru.

4
RolandoMySQLDBA

Nedávno jsem mluvil o tomto tématu na WordCamp Houston . Všechna výše uvedená doporučení jsou skvělá a důležitá věc je zajistit, aby všechny předlohy byly plně optimalizovány, a poté můžete začít pracovat na problémech ukládání do mezipaměti a výkonu serveru.

Progresivní vykreslování způsobí, že se vaše stránky budou cítit rychleji, protože uživatel uvidí obsah stránky dříve, než bude plně načten. Chcete-li to provést, ujistěte se, že blokování js je na samém konci stránky a css je nahoře.

Také pokud používáte spoustu tlačítek sociálních médií, můžete přizpůsobit skripty tak, aby byly načteny v iframe po úplném načtení stránky. Napsal jsem tutoriál, jak to udělat s TweetMeMe re Tweet tlačítko (nyní zastaralé, protože Twitter vydala své vlastní retweet tlačítko), ale stále lze použít na další tlačítka sdílení.

Pro výkon serveru se podívejte na Nginx jako proxy server pro statický obsah s Apache, který zpracovává těžké PHP a MySQL zvedání.

3
Chris_O

můžete povolit globální výstupní kompresi . to bude gzip vše jít automaticky, pokud prohlížeč podporuje. To výrazně snižuje velikost přenesených souborů, ale zvyšuje zatížení procesoru.

3
Scott M.

Vzhledem k tomu, že se o tom nikdo ještě nezmínil, jedním z nejdůležitějších kroků ke zvýšení výkonu serveru ve spojení s jakýmkoliv nastavením LAMP by bylo přepnutí na pracovní vlákno Apache a mod_fcgid.

To uvolnilo 500MB paměti na mém virtuálním privátním serveru.

2
nottinhill

Průvodce pro kontrolu plugin zpomalit

Je zde krásně jednoduchý plugin nazvaný Page Load Time , který přidává časovač do zápatí stránky. Vlastně pouze čtyři řádky kódu:

<?php
function ur_pageload_footer() {
    printf(__('Page in %s seconds', 'pageload'), timer_stop());
}
add_action('wp_footer', 'ur_pageload_footer')

Pak:

  1. Vytvořte tabulku
  2. Seznam všech vašich aktivních pluginů a dát je tam
  3. Obnovte stránku třikrát, přičemž si všimnete doby načítání stránky v každém tahu
  4. Projděte si pluginy jeden po druhém a deaktivujte je
  5. Opakujte krok 3
  6. Všimněte si, že jste deaktivovali pluginy

Vaše tabulka by měla vypadat podobně

+-------+-------+-------+-------+--------+
| Run 1 | Run 2 | Run 3 | Order | Plugin |

Pokud tedy po deaktivaci pluginu doba odezvy stránky významně vzroste, můžete vidět, zda se tomuto pluginu můžete vyhnout.

Našel jsem dva pluginy, které způsobily „významné“ zpomalení mqtranslate a (spíše staré, ale dobré) Víceúrovňové navigační moduly .

1
icc97