it-swarm.asia

Sunucu Yüküyle İlgili WordPress'i Optimize Etme Adımları?

W3 Total Cache veya başka bir önbellek eklentisi kurmanın yanı sıra, temamın ve sitemin mümkün olduğunca hızlı çalışmasını sağlamak için ne gibi adımlar atabilirim.

80
Paul Sheldrake

WordPress'i Nginx'e yükleyebilirsiniz. Yardımcı olacak çok sayıda kaynak var:

Son bağlantıdan gelen bazı performans bilgileri (diğerlerinden biraz farklı ayarlanmış gibi görünüyor):

Bu yüzden mümkün olduğunca statik önbelleğe wordpressin önüne bir proxy koymaya karar verdim. TÜM kimliği doğrulanmamış trafik, doğrudan nginx dosya önbellekten, 6 sayfa/saniye ila 7000+ sayfa/saniye arasında bazı istekleri (RSS besleme üretimi gibi) alarak doğrudan sunulur. Oof. Nginx ayrıca günlüğe kaydetme ve gzipleme işlemlerini gerçekleştirir ve ağır arka uç apaçıklarını en iyi yaptıklarını yapmak için bırakır: yalnızca gerektiğinde dinamik wordpress sayfalarına hizmet eder.

...

Nginx'te - çok etkilidir, korkunçtur. En ağır yükümüz altında bile 10 ila 15 meg _ _ RAM ve bir işlemci bloğu kullandığını hiç görmedim. Ganglion grafiklerimiz yalan söylemez: bellek gereksinimlerimizi yarıya indirdik, giden ağ hacmimizi iki katına çıkardık ve yükümüzü tamamen düzelttik. Bunu kurduğumuzdan beri temelde hiçbir problem yaşamadık.

31
Travis Northcutt

Her sayfa görünümü için yeniden indirilmesi gerekmeyen css, resimler, JavaScript vb. Bu, bugüne kadar sitemin yükleme sürelerinde en büyük farkı yarattı. En hızlı indirme hiç gerçekleşmemiş olan indirme ...

# 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

Makul bir şey yapabileceğiniz her şeyi önceden gzipleyebilirsiniz (7-Zip bunun için iyi bir araçtır) ve yüklediğiniz dosyayla aynı yere yükleyebilirsiniz. Önceden gzip'lenmiş dosyaları sunmak için .htaccess'i değiştirin. Buradaki uyarı, şeyleri güncellediğinizde/değiştirdiğinizde bunları yeniden kaydetmeyi unutmamanız gerektiğidir. Bu, .htaccess'un ayrıştırılması dışında CPU ek yükünü keser.

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]

Bu sadece ham bir cevap. Bu tema üzerinde birçok varyasyon var. Bununla ilgili blog yazdım ve http://icanhazdot.net/2010/03/23/some-wordpress-stuff/ adresindeki daha ayrıntılı makalelere bir kaç referans ekledim. Bunu okuyun ve daha da önemlisi, işaret ettiğim referanslar - onlar iyi kaynaklar.

Sık sık denetlerseniz, kullanıcıların önbelleklerini yenilemeleri gerekeceğini unutmayın.

Çok yararlı bulduğum bir eklenti wp-minify . Bununla dikkat edilmesi gereken, sayfaya özel öğeleri (iletişim formu, ön sayfa kaydırıcısı vb.) Hariç tutmanız gerektiğidir, böylece her sayfa için tüm css, JS etc setlerini tekrar indiremezsiniz. Temel CSS, JS vb .'nizi küçültmek, birleştirmek ve sıkıştırmak için iyi bir yoldur. Http isteklerini çok azaltır. Wp-minify, süper önbellekle ve ayrıca yukarıda ayrıntılı olarak açıkladığım son kullanma süresi başlıklarıyla iyi oynuyor.

Firebug'ta (Firefox) Yslow kullanın ya da http isteklerinizi ve neyin sıkıştırıldığını ve neyin sıkıştırılmadığını izlemek için benzer. İçerideki süre sonu başlıklarına da bir göz atın. Yakında neleri geliştirebileceğinizi göreceksiniz.

26
CAD bloke

Çalıştığınız eklentilerin sayısını, yalnızca gerçekten ihtiyacınız olana indirgeyin. Özellikle her sayfa yüklemesinde javascript ve CSS kodu ekleyen eklentilerin farkında olun, bu sayfa sayfada kullanılmıyor olsa bile.

Kendi temanızı sıfırdan oluşturuyorsanız, yalnızca belirli sayfa şablonlarına veya görünüm türlerine (tek yayın, arşivler, kategori vb.) İhtiyaç duyan özelliklerin yalnızca gerektiğinde yüklenmesini sağlamak için CSS'nizi yıkın.

W3TC'yi bir CDN (Amazon CloudFront veya W3TC tarafından desteklenen herhangi biri gibi) kullanacak şekilde yapılandırın.

Küçült seçeneklerinin sizin için işe yarayıp yaramadığını görün (bazı eklentiler js/css'yi güzel bir şekilde küçültmez, bu nedenle küçültme özelliğini etkinleştirdikten sonra sitenizi test ettiğinizden emin olun).

MySQL sunucunuzu tam olarak kontrol ediyorsanız, query_cache'nin açık olduğundan emin olun. Veritabanı yapılandırmanızı optimize etmenin başka yollarını bulmak için a MySQL ayarlama komut dosyasını kullanın.

Bir CDN kullanmak nedense sorunluysa, Apache kurulumunuzda mod_expires yapılandırın. Son kullanma zamanlarını resimler, css, javascript, video, ses vb. Statik türler için makul olduğu sürece ayarlayın.

21
Dougal Campbell

Veritabanı sorgularının sayısını azaltmak için memcached komutunu kullanın ve object cache komutunu kullanın. Bu, sayfaları veri tabanından ziyade veritabanında önbelleğe alır. W3-total-cache öğesinin bunu zaten yapıp yapmadığından emin değilim.

APC gibi bir opcode önbellek çalıştırdığınızdan emin olun. (Birkaç tane daha var.)

14
Annika Backstrom

Wp-cache gibi bir disk önbellek eklentisi kullanmanın yanı sıra, blogunuzu "noatime" özelliği ayarlanmış bir Host birimine yerleştirin. Aksi takdirde, Ana Bilgisayarınıza SSH (webhost sunucunuz bunu sağlıyorsa) ve bu komutu rutin olarak birkaç günde bir çalıştırın:

chattr -R +A ~/*

~/* "Dosyalarımı ana dizinin altındaki" anlamına gelir. Uygun gördüğünüz gibi bu yolu değiştirebilirsiniz. Webhost sunucunuz da sağlıyorsa, bunu cpanel'deki bir cron işinde de ayarlayabilirsiniz.

Atime özelliği hakkında daha fazla bilgi için, bkz. this . Linux disk okuma performansını büyük ölçüde hızlandırır.

Bazen siteniz örümcekler tarafından dövülüyor. Sitenize daha fazla sayfa sıralaması getirmeyen ve yalnızca yavaşlatan örümcekleri filtrelemek için SpyderSpanker veya Chennai Central gibi bir araç kullanabilirsiniz. HTTP 304 Değiştirilmemiş mesajlar.

Gördüğüm başka bir şey sadece kötü yazılmış eklentiler. Eklentileri nasıl yapacağınızı öğrenirseniz, bazı eklentilerin nasıl verimsiz bir şekilde kodlandığını görmeye başlarsınız, hatta gelen bağlantı verilerini depolayan, doldurup dolduran ve hiçbir zaman temizlenmeyen bir veritabanı tablosu gibi zaman çizelgeleri bulabilirsiniz.

Buradaki diğer tüm çözümlerin ötesinde, blogunuzdaki bir WordPress web grubu oluşturarak, dosyaları tek bir veritabanına ve dosyalar için tek bir disk birimine (NFS üzerine monte edilmiş bir birim gibi) bağlanan birkaç web düğümü bilgisayarında barındırarak ). Ultra Monkey 'a nasıl devam edeceğinizi öğrenin.

8
Volomike

Kafamın tepesinden birkaç cevap:

1) Mümkün olduğunda/pratikte JavaScript ve CSS'yi birleştirerek tarayıcının Ana Bilgisayarınıza yapması gereken HTTP isteklerinin sayısını en aza indirin.

2) Özellikle paylaşılan barındırma kullanıyorsanız, 3. tarafın CDN'lerine sunulan görüntü/ortamınızın mümkün olduğunca boşaltın.

3) Toplam oluşturma süresini kısaltmak için ön sayfada görüntülemekte olduğunuz yayın sayısını azaltmayı deneyin.

3a) Ön sayfada tam olarak öne çıkan birkaç yazıyı ve alıntı olarak diğer tüm eski yazıyı sunan bir tema kullanmayı deneyin.

7
ZaMoose

WordPress Menüsünü önbelleğe almak da size performans artışı sağlar. Özellikle çok sayıda Sayfa veya dev bir Menü Yapısı varsa, bu dikkate alınmalıdır.

2 kolay adımda yapın. İlk önce, doğrudan wp_nav_menu işlevini çağırmak yerine, menüyü alan veya oluşturan bir işlev oluşturun.

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

    }

}

Temanızda, wp_nav_menus ile get_cached_menu değiştirin. Şimdi, menü her çağrıldığında, tüm Menubuilding yerine bir Databasequery'e sahipsiniz.

Menüler sık ​​sık değişmez - ancak eski geçici olayları silmek için wp_update_nav_menu eylemine de bağlanmanız gerekir.

Bu şekilde yapın:

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

}

Menü, bir dahaki sefere çağrıldığında oluşturulacaktır - ve birileri menüyü tekrar güncelleyene kadar önbellek sürümünü kullanın.

Güncellenmiş versiyon

Sümüklü böcek ve kimlikleri arasında bir hata olduğunu belirtti @helgathevik teşekkürler. İşlevleri güncelleştirdim, böylece hem theme_position hem de menu ile çalışır (doğrudan menü çağrısı için).

Menüler, Temadaki konumlarla değil daima Menü adıyla kaydedilir.

7
fischi

Optimizasyon için kesilmiş bir veritabanı sınıfı kullanın. Bellek kullanımını ve veritabanı erişim hızını azaltmak için kendi kodlarımızla iyi deneyimler yaptık. Bunun yanında, veritabanı yapısının kendisini, çok şey yapan bazı küçük değişikliklerle de optimize edebilirsiniz.

Veri tabanı sınıf kodunun bir kısmı wordpress trac'te bulunabilir, çekirdek haline getirmedi ( Ticket # 11799 ve ilişkili ).

5
hakre

Çok fazla trafik alan bir site için, şu anda mevcut olan içerik için tüm MySQL arabelleğini ayarlamanız gerekir. WordPress'in sürümünden bağımsız olarak, MySQL katmanı konfigürasyonunu hesaplayabilir .

Aslında, innodb_file_per_table'ı etkinleştirmeden InnoDB verileriniz varsa, her masayı kendi fiziksel tablo alanına bölerek InnoDB'yi temizlemeniz gerekir . İyi MySQL ayarlaması yapmak mümkündür. Sınırlı bir donanıma sahip olsanız bile . Bu InnoDB optimizasyonlarını yapmak için birçok senaryo vardır.

IMHO, yapılandırılacak veri miktarını bilmeden my.cnf için iyi ayarları planlayamazsınız. Güncel bir veri setini üretimden aşamalı bir ortama periyodik olarak yüklemeniz, optimizasyonları gerçekleştirmeniz ve üretim sunucusunun my.cnf dosyasında yapılandırmak için sayılarla gelmeniz gerekir.

4
RolandoMySQLDBA

Geçenlerde bu konu hakkında konuştum WordCamp Houston . Yukarıdaki önerilerin tümü mükemmeldir ve önemli olan tüm ön uç öğelerinin tamamen optimize edildiğinden emin olmaktır; bu durumda önbellek ve sunucu performansı sorunları üzerinde çalışmaya başlayabilirsiniz.

Aşamalı görüntü oluşturma, sayfaların daha hızlı yüklenmesini sağlar çünkü kullanıcı tam olarak yüklenmeden önce sayfa içeriğini görür. Bunu yapmak için, herhangi bir engelleme js sayfanın en altında olduğundan ve css en üstte olduğundan emin olun.

Ayrıca çok sayıda sosyal medya düğmesi kullanıyorsanız, komut dosyaları, sayfa tamamen yüklendikten sonra iframe içine yüklenmelerini sağlayacak şekilde özelleştirebilirsiniz. TweetMeMe re Tweet düğmesiyle nasıl yapılacağı hakkında bir öğretici yazı yazdım (artık Twitter kendi retweet düğmesini bıraktığından beri artık kullanılmıyor) ancak yine de diğer paylaşım düğmelerine de uygulanabiliyor.

Sunucu performansı için, ağır PHP ve MySQL kaldırma işlemlerini yapan Apache ile statik içerik için ön uç proxy olarak Nginx'e bakın.

3
Chris_O

genel çıktı sıkıştırmasını etkinleştirebilirsiniz. tarayıcı destekliyorsa bu otomatik olarak çıkan her şeyi gzip olacaktır. Bu, aktarılan dosyaların boyutunu büyük ölçüde azaltır, ancak CPU yükünüzü artırır.

3
Scott M.

Henüz kimseden bahsetmediğinden, herhangi bir LAMP kurulumuyla bağlantılı olarak sunucu performansını artırmak için en önemli adımlardan biri Apache çalışan iş parçacığına ve mod_fcgid'ye geçmek olacaktır.

Bu, sanal özel sunucumda 500 MB belleği serbest bıraktı.

2
nottinhill

Eklentiyi yavaşlatmak için kılavuz

Sayfa Yükleme Süresi adında, sayfa altbilginize zamanlayıcı ekleyen çok basit bir eklenti var. Aslında sadece dört kod satırı:

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

Sonra:

  1. Elektronik tablo oluştur
  2. Tüm aktif eklentilerinizi listeleyin ve onları oraya koyun.
  3. Her dönüş sırasında sayfa yükleme süresini belirterek sayfayı üç kez yenileyin
  4. Eklentilerinizi birer birer devre dışı bırakarak geçirin
  5. 3. adımı tekrarlayın
  6. Eklentileri devre dışı bırakma sırasına dikkat edin

E-tablonuz şöyle görünmeli

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

Bir eklentiyi devre dışı bıraktıktan sonra sayfa yanıt süresi önemli ölçüde artarsa, bu eklentiden kaçınıp korunamayacağını görebilirsiniz.

'Önemli' yavaşlamaya neden olan iki eklenti buldum mqtranslate ve (oldukça eski ama iyi) Çok Düzeyli Gezinme Eklentisi .

1
icc97