I passaggi per ottimizzare WordPress per quanto riguarda il carico del server?


82

Oltre all'installazione di W3 Total Cache o di un altro plug-in per la memorizzazione nella cache, quali passi posso fare per assicurarmi che il tema e il sito vengano eseguiti il ​​più velocemente possibile.


se esegui il tuo sito su vps, dovresti provare redis cache.
ahmetlutfu,

Risposte:


33

È possibile installare WordPress su Nginx. Esistono diverse risorse per aiutare:

Alcune informazioni sulle prestazioni di quell'ultimo link (che sembra essere un po 'diverso dall'installazione):

Così ho deciso di mettere un proxy davanti a wordpress nella cache statica il più possibile. TUTTO il traffico non autenticato viene pubblicato direttamente dalla cache del file nginx, prendendo alcune richieste (come la generazione di feed RSS) da 6 pagine / secondo a 7000+ pagine / secondo. Oof. Nginx gestisce anche il logging e il gzipping, lasciando gli apache backend più pesanti a fare ciò che fanno meglio: servire pagine di wordpress dinamiche solo quando necessario.

...

Su nginx: è così efficiente che fa paura. Non l'ho mai visto usare più di 10-15 megabyte di RAM e un blip di CPU, anche con il nostro carico più pesante. I grafici dei nostri gangli non mentono: abbiamo dimezzato i nostri requisiti di memoria, raddoppiato la velocità della nostra rete in uscita e livellato completamente il nostro carico. Fondamentalmente non abbiamo avuto problemi da quando lo abbiamo impostato.


Qualcuno ha delle statistiche sui risparmi sulla velocità dell'utilizzo di Nginx?
Mike Lee,

Mike, ho aggiunto un altro link e alcune informazioni da quel post.
Travis Northcutt,

Ho spostato il mio blog principale da un server 1G che esegue Apache a un server 512M con Nginx. Funziona in modo più fluido, nonostante la riduzione della RAM. Certo, ho altri servizi in esecuzione sul server 1G (e-mail, imap, mailman, molti altri siti web a basso traffico).
Dougal Campbell,

NB l'esecuzione di WordPress su nginx è diversa dall'uso di nginx come cache proxy davanti a Wordpress.
sam,

26

Imposta le scadenze sul lato client per cose come css, immagini, JavaScript ecc. Che non devono essere scaricati nuovamente per ogni visualizzazione di pagina. Questo, di gran lunga, ha fatto la differenza più grande per i tempi di caricamento del mio sito. Il download più veloce è il download che non è mai avvenuto ...

# 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

Puoi pre-gzip tutto ciò che puoi ragionevolmente (7-zip è un buon strumento per questo) e caricarlo nello stesso posto del file che hai appena compresso. Cambia .htaccess per servire i file pre-compressi, come di seguito. L'avvertenza qui è che devi ricordare di ri-decomprimerli se / quando aggiorni le cose. Ciò elimina il sovraccarico della CPU, oltre all'analisi di .htaccess.

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]

Questa è solo una risposta pura. Ci sono molte variazioni su questo tema. Ho scritto un blog su questo e ho aggiunto alcuni riferimenti ad articoli più approfonditi su http://icanhazdot.net/2010/03/23/some-wordpress-stuff/ . Leggi questo e, cosa più importante, i riferimenti a cui indico: sono buone risorse.

Tieni presente che se armeggi spesso gli utenti dovranno aggiornare la loro cache.

Un plugin che ho trovato molto utile è anche wp-minify . La cosa da guardare con questo è che dovresti escludere elementi specifici della pagina (modulo di contatto, dispositivo di scorrimento della pagina iniziale ecc.) In modo da non scaricare nuovamente l'intero set di CSS, JS ecc. Per ogni pagina. È un buon modo per minimizzare, combinare e comprimere il tuo CSS di base, JS ecc. Riduce molto le richieste http. Wp-minify funziona bene con supercache e anche con le intestazioni di scadenza che ho descritto sopra.

Usa Yslow in Firebug (Firefox) o simili per monitorare le tue richieste http e ciò che è e non è compresso. Dai un'occhiata anche alle intestazioni di scadenza. Presto vedrai cosa puoi migliorare.


2
Nel caso in cui qualcuno abbia intenzione di copiare / incollare i tuoi riscritti, c'è un'istanza di "Rewrite" che dovrebbe essere corretta.
Jeremy L

2
quale istanza?
Bloke CAD

@Nerdling Potresti indicare quale istanza deve essere riparata? Vorrei usare il codice sopra.
Helgatheviking,

Potrebbe essere correlato al fatto che mod gzip è deprecato nelle versioni successive di Apache. Ho dovuto cambiare il mio per mod deflate di recente.
Bloke CAD,

2
Per una buona serie di valori predefiniti per .htaccess, il progetto HTML5 Boilerplate fornisce un modello. github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess
Paul Sheldrake

21

Riduci al minimo il numero di plugin che esegui solo per ciò di cui hai veramente bisogno. Prestare particolare attenzione ai plug-in che aggiungono codice javascript e CSS ad ogni caricamento della pagina, anche quando tale codice non viene utilizzato nella pagina.

Se stai creando il tuo tema da zero, suddividi il CSS in modo che le funzioni che sono necessarie solo per particolari modelli di pagina o tipi di visualizzazione (singolo post, archivi, categoria, ecc.) Vengano caricate solo quando necessario.

Configura W3TC per utilizzare un CDN (come Amazon CloudFront o uno qualsiasi degli altri supportati da W3TC).

Verifica se le opzioni di Minify funzionano per te (alcuni plugin generano js / css che non si minimizzano bene, quindi assicurati di testare il tuo sito dopo aver attivato la funzione di minimizzazione).

Se hai il pieno controllo del tuo server MySQL, assicurati di aver attivato query_cache. Utilizzare uno script di ottimizzazione MySQL per trovare altri modi per ottimizzare la configurazione del database.

Se l'uso di una CDN è problematico per qualche motivo, configura mod_expires nella configurazione di apache. Imposta tempi di scadenza il più a lungo ragionevoli per tipi statici come immagini, CSS, JavaScript, video, audio, ecc.


14

Eseguire memcached e utilizzare una cache degli oggetti per ridurre il numero di query del database. Ciò memorizza nella cache i dati dal database, piuttosto che le pagine. Non sono sicuro che w3-total-cache lo faccia già.

Assicurati di eseguire una cache del codice operativo come APC . (Ce ne sono molti altri disponibili.)


2
APC rende WordPress molto più reattivo, in particolare le pagine di amministrazione. MA, ci sono alcuni potenziali conflitti di configurazione tra WP-SuperCache e APC. Questi non sembrano influenzare la cache W3.
WhIteSidE,

Su questo c'è un eccellente post di Mark Jaquith: APC Object Cache Backend per WordPress . Puoi usare batcache felicemente con APC.
icc97,

8

Oltre a utilizzare un plug-in di cache del disco come wp-cache, colloca il tuo blog su un volume host su cui è impostata la proprietà "noatime". Altrimenti, SSH nel tuo host (se il tuo host web lo fornisce) ed esegui regolarmente questo comando sui tuoi file ogni pochi giorni:

chattr -R +A ~/*

~ / * Significa "i miei file nella mia home directory". Puoi cambiare quel percorso come ritieni opportuno. Puoi anche impostarlo su un processo cron in cpanel se il tuo host web lo fornisce.

Per maggiori informazioni sulla proprietà atime, vedi questo . Accelera notevolmente le prestazioni di lettura del disco Linux.

A volte il tuo sito viene martellato dai ragni. Puoi utilizzare uno strumento come SpyderSpanker o Chennai Central per filtrare i ragni che non aiutano a portare più rango di pagina sul tuo sito e semplicemente a rallentarlo, quindi a limitare i buoni ragni (come Google, Bing, ecc.) Inviandoli a caso Messaggi HTTP 304 non modificati.

Un'altra cosa che vedo sono solo plugin scritti male. Se impari come creare plug-in, inizi a vedere in che modo alcuni plug-in sono codificati in modo inefficiente o addirittura a trovare bombe a tempo, come una tabella di database che si riempie e si riempie e non viene mai ripulita, archiviando cose come i dati di connessione in entrata.

Oltre a tutte le altre soluzioni qui, puoi anche creare una web farm WordPress del tuo blog ospitandola su diversi PC con nodo Web che si ricollegano tutti a un singolo database e un singolo volume del disco per i file (come un volume montato su NFS ). Dai un'occhiata a Ultra Monkey per sapere come farlo.


7

Alcune risposte dalla cima della mia testa:

1) Riduci al minimo il numero di richieste HTTP che il browser deve presentare al tuo host concatenando JavaScript e CSS ove possibile / pratico.

2) Offri il maggior numero possibile di immagini / contenuti multimediali a CDN di terze parti, in particolare se stai utilizzando l'hosting condiviso.

3) Prova a ridurre il numero di post che stai visualizzando sulla prima pagina per ridurre il tempo di rendering totale.

3a) Prova a utilizzare un tema che presenti alcuni post in primo piano nella pagina principale e tutti gli altri post più vecchi come estratti.


2
+1 per ridurre il numero di post, questo dà una spinta enorme senza costi. Le persone non hanno davvero bisogno di vedere dieci vecchi post, ho appena impostato il mio conf a otto.
ripper234,

7

La memorizzazione nella cache del menu WordPress ti dà anche un aumento delle prestazioni. Soprattutto se hai molte pagine o una struttura di menu gigante, questo dovrebbe essere considerato.

Fallo in 2 semplici passaggi. Inizialmente, crea una funzione che ottenga o crei il menu, anziché chiamare wp_nav_menudirettamente.

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

    }

}

Nel tuo tema, sostituisci la wp_nav_menus con get_cached_menu. Ora, ogni volta che viene chiamato il menu, hai una query Database invece dell'intera creazione menu.

I menu non cambiano spesso, ma devi anche agganciarti wp_update_nav_menuall'azione per eliminare i vecchi transitori.

Fai cosi:

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 ); 

}

Il menu verrà generato al successivo richiamo della pagina e utilizzerà la versione cache fino a quando qualcuno non aggiornerà nuovamente il menu.

Versione aggiornata

Grazie @helgatheviking per aver segnalato un errore tra lumache e ID. Ho aggiornato le funzioni in modo che funzioni sia con theme_positionche menu(per una chiamata diretta del menu).

I menu vengono sempre salvati con il nome del menu, non con la posizione nel tema.


Sembra un'idea davvero interessante. Sto riscontrando un problema con il codice comunque. Quando cancelliamo il transitorio, $nav_menu_selected_idè un numero, mentre quando si chiama get_cached_menu()il menu_idè una variabile stringa, perché quel parametro diventa l'ID CSS per l' <ul>elemento.
Helgatheviking,

5

Utilizzare una classe di database che viene ritagliata per l'ottimizzazione. Abbiamo fatto buone esperienze con il proprio codice per ridurre l'utilizzo della memoria e la velocità di accesso al database. Accanto a questo, è possibile ottimizzare la struttura del database stesso con alcune piccole modifiche che fanno molto.

Parte del codice di classe del database può essere trovato nel trac di wordpress, ma non è stato trasformato in core ( Ticket # 11799 e relativi ).


Soluzione interessante. Ecco l'URL del biglietto Trac nel caso in cui qualcuno sia interessato anche: core.trac.wordpress.org/ticket/11799
Mike Lee,

4

Per un sito altamente trafficato, è necessario ottimizzare tutti i buffer MySQL per il contenuto attualmente disponibile. Indipendentemente dalla versione di WordPress, possibile calcolare la configurazione del livello MySQL .

Infatti, se si dispone di dati InnoDB senza abilitare innodb_file_per_table, è necessario ripulire InnoDB segmentando ogni tabella nel proprio tablespace fisico . È possibile eseguire un'ottimizzazione MySQL decente anche se si dispone di un hardware limitato . Esistono molti scenari per eseguire tali ottimizzazioni di InnoDB .

IMHO, non puoi pianificare buone impostazioni per my.cnf senza conoscere la quantità di dati per cui configurare. Dovresti caricare periodicamente un set di dati corrente dalla produzione in un ambiente di gestione temporanea, eseguire ottimizzazioni e fornire i numeri da configurare nel my.cnf del server di produzione.


3

potresti abilitare la compressione globale dell'output . questo aprirà automaticamente tutto ciò che esce se il browser lo supporta. Ciò riduce drasticamente la dimensione dei file trasferiti, ma aumenta il carico della CPU.


Ciò tenderà a far "sentire" il tuo sito molto più lentamente. Yahoo! i documenti tecnici suggeriscono di svuotare il codice subito dopo la fine della testa e prima dell'inizio del corpo in modo che gli script e gli stili possano iniziare a caricarsi. Bufferando l'intera pagina, impedisci che ciò accada, e quindi la pagina "sembra" lenta perché l'utente deve attendere che WordPress esegua il rendering dell'intera pagina prima che l'utente veda qualcosa.
WhIteSidE,

Scott non stava parlando del buffering dell'intera pagina ma usando la compressione dell'output di apache. È qualcosa di diverso, solo se si utilizza la compressione dell'output PHP tramite il buffer di output ciò avrebbe le carenze che descrivi vagamente. Ma non di per sé perché alla fine l'output di buffering può rendere le cose più veloci. Questo ha a che fare con l'I / O sul tuo server.
Hacre,

3

Di recente ho parlato di questo argomento al WordCamp Houston . Tutti i consigli di cui sopra sono fantastici e l'importante è assicurarsi che tutto il materiale del front-end sia completamente ottimizzato, quindi è possibile iniziare a lavorare sulla cache e sui problemi di prestazioni del server.

Il rendering progressivo renderà le tue pagine più veloci perché l'utente vedrà il contenuto della pagina prima che sia completamente caricato. Per fare questo assicurati che qualsiasi blocco js sia nella parte inferiore della pagina e css sia nella parte superiore.

Inoltre, se usi molti pulsanti dei social media, puoi personalizzare gli script per farli caricare in un iframe dopo che la pagina è stata caricata completamente. Ho scritto un tutorial su come farlo con il pulsante Tweet di TweetMeMe (ora obsoleto da quando Twitter ha rilasciato il proprio pulsante di retweet) ma può ancora essere applicato ad altri pulsanti di condivisione.

Per le prestazioni del server, cerca Nginx come proxy front-end per contenuti statici con Apache che gestisce il pesante PHP e MySQL.


2

Poiché nessuno lo ha ancora menzionato, uno dei passaggi più importanti per migliorare le prestazioni del server in combinazione con qualsiasi impostazione LAMP sarebbe quello di passare al thread di lavoro apache e mod_fcgid.

Ciò ha liberato 500 MB di memoria sul mio server privato virtuale.


Ci ho provato prima, ma non sono mai riuscito a far funzionare un ambiente apache worker + fcgi stabile. Se qualcuno conosce alcune buone istruzioni di installazione per questo sotto Ubuntu, per favore pubblicale. Sarei particolarmente grato per le istruzioni che descrivono in dettaglio alcune delle direttive di configurazione di Apache che influiscono sul comportamento FCGI e spiegano in che modo modificarle potrebbe influire sull'utilizzo della memoria, sulle prestazioni, ecc. Attualmente sto usando un apache biforcuto con un fronte nginx- nel server cache proxy.
Dougal Campbell,

Definisci stabile. La mia installazione è molto stabile, ma nella mia configurazione avresti bisogno di 2 GB di RAM. Devi solo leggere e modificare. la documentazione di apache su fcgi è piuttosto ampia.
Meshfields

3
prova a controllare virtualmin.com è molto stabile e gratuito
Ünsal Korkmaz l'

1

Guida per il controllo del plug-in rallentato

C'è un plugin meravigliosamente semplice chiamato Page Load Time , che aggiunge il timer al piè di pagina. In realtà sono solo quattro righe di codice:

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

Poi:

  1. Crea un foglio di calcolo
  2. Elenca tutti i plugin attivi e inseriscili
  3. Aggiorna la pagina tre volte rilevando il tempo di caricamento della pagina ogni turno
  4. Scorri i plug-in uno a uno disattivandoli
  5. Ripetere il passaggio 3
  6. Nota l'ordine in cui hai disattivato i plugin

Il foglio di calcolo dovrebbe assomigliare a qualcosa

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

Quindi se dopo aver disattivato un plugin il tempo di risposta della pagina aumenta in modo significativo, puoi vedere se riesci ad evitare quel plugin.

Ho trovato due plugin che hanno causato un rallentamento 'significativo' di mqtranslate e (il piuttosto vecchio ma buono) Plugin di Navigazione multilivello .


Sarebbe davvero bello automatizzare questo processo: phantomjs e selenio (o qualcosa di simile), quindi viene eseguito automaticamente e alla fine genera un piccolo report.
Paul Sheldrake,

-1

Attenersi al plug-in W3 Total Cache per la funzionalità di memorizzazione nella cache in WordPress. Abilita la memorizzazione nella cache delle pagine e la memorizzazione nella cache del database dalla pagina delle impostazioni del plug-in. Assicurati di scegliere 'Alternative PHP Cache (APC / APCu)' come meccanismo di memorizzazione nella cache. NON abilitare alcuna minificazione in W3 Total Cache in quanto vi sono molte possibilità di interrompere l'aspetto e / o la funzionalità del tuo sito. Lo lasceremo a Cloudflare.

Una volta terminata la configurazione delle altre funzionalità del plug-in, configura Cloudflare per il tuo sito web. Assicurati di abilitare Cloudflare anche nelle impostazioni W3 Total Cache in "Estensioni".

Cloudflare è una rete di distribuzione di contenuti che memorizza nella cache tutti i contenuti statici (file di immagini, CSS, JS, documenti, ecc.) Dal tuo sito e li fornisce ai tuoi visitatori dai loro server globali. Questo può aiutare ad accelerare i tempi di caricamento della pagina e ridurre il carico sul tuo server. Per un elenco di tipi di file memorizzati nella cache di Cloudlfare, consulta questo elenco . Inoltre, Cloudflare ha un piano gratuito.

In Cloudflare, impostare il livello di memorizzazione nella cache su standard e impostare la scadenza della cache del browser su un valore almeno superiore a 20 ore. Abilita Always Online ™ in modo che, anche se il tuo server non funziona, Cloudflare servirà le pagine statiche del tuo sito Web dalla loro cache. Abilita anche la loro funzione di minimizzazione automatica (ricorda perché ti ho chiesto di non abilitare la minimizzazione è W3 Total Cache? Perché Cloudflare lo fa meglio!) Quindi imposta Rocket Loader ™ su automatico.

Ecco un estratto di ciò che fa Rocket Loader:

  • Riduzione del numero di richieste di rete raggruppando file JavaScript, anche di terze parti, per evitare di rallentare il rendering della pagina.

  • Caricamento in modo asincrono di script, inclusi script di terze parti, in modo
    che non impediscano il caricamento
    immediato del contenuto della pagina .

  • Memorizzazione nella cache degli script localmente (utilizzando LocalStorage, disponibile sulla maggior parte dei
    browser e smartphone) in modo che non vengano recuperati se non
    necessario.

Ulteriori informazioni possono essere trovate qui .

Se possibile, passa al framework Genesis per WordPress perché sono puliti senza alcun gonfiamento. Genesis è stata costruita pensando alla velocità e al SEO. Io stesso l'ho testato e i miei punteggi PageSpeed ​​erano buoni. Inoltre, se stai utilizzando Genesis, non dimenticare di abilitare la cache dei frammenti nelle impostazioni della cache totale W3.

Poiché ora stai utilizzando Cloudlfare come CDN, puoi utilizzare un plug-in come " Imagify " o " Compress JPEG and PNG images " di TingPNG per comprimere le tue immagini. Entrambi sono plugin gratuiti disponibili nel repository dei plugin di WordPress.org. Inoltre, Imagify supporta il potente algoritmo di compressione con perdita.

Infine, installa il plug-in " Rimuovi stringhe di query da risorse statiche " dal repository di WordPress in modo da rimuovere le stringhe di query da risorse statiche come i file CSS e JS. Questo perché le risorse con un "?" O "&" nell'URL non vengono memorizzate nella cache da alcuni server di cache del proxy (ricordate, Cloudflare è anche un server di cache del proxy).

Quindi installa il plug-in " Utilizza le librerie di Google ". Questo plug-in consente al tuo sito WordPress di utilizzare la CDN dell'API della libreria AJAX di Google anziché pubblicare direttamente questi file dall'installazione di WordPress.

Alcuni dei vantaggi sono:

  • Aumenta la possibilità che un utente abbia già questi file memorizzati nella cache.
  • Elimina il carico aggiuntivo dal tuo server.
  • Utilizza le versioni compresse delle librerie (se disponibili).
  • I server di Google sono impostati per negoziare la compressione HTTP con il browser richiedente.

Ultimo ma non meno importante, utilizzare il plug -in ' WP-Optimize ' di Ruhani Rabin per pulire e ottimizzare il database.

Spero che questo risponda alla tua domanda in merito all'ottimizzazione di WordPress per ridurre il carico del server.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.