Jaka jest najlepsza opcja buforowania dla wielu witryn WordPress na niepodzielonym hostingu?

13

Jaką konfigurację wtyczki pamięci podręcznej polecasz i dlaczego przy następujących założeniach:

  • pełna kontrola konfiguracji serwera
  • uruchamianie WordPress w trybie wielu witryn / wielu domen
  • większość domen nie używa www.przedrostka (ciasteczka)
  • (pragnienie), aby móc wyłączyć buforowanie dla określonych adresów IP lub na podstawie pliku cookie, gdy wprowadzasz zmiany w witrynie, nie potrzebujesz buforowania.

Szczegóły: Korzystam z wtyczki Firefox Google Page Speed, aby spróbować zoptymalizować szybkość witryny.

Prosimy również nie kierować się ogólnymi wytycznymi, takimi jak mniejsze obrazy.

Bądźmy szczerzy, użycie więcej niż jednej wtyczki pamięci podręcznej przyniesie więcej problemów niż rozwiąże, więc spróbuj podać proste podejście.

sorin
źródło

Odpowiedzi:

4

Podstawową odpowiedzią na „jaka wtyczka” byłaby prawdopodobnie W3 Total Cache . Jest to obecnie jedna z najbardziej funkcjonalnych i aktywnie rozwijanych wtyczek. Jednak cały łańcuch wydajności jest znacznie dłuższy, niż sama wtyczka WordPress.

  1. Konfiguracja serwera WWW (Apache lub coś innego) (czas odpowiedzi, czas do pierwszego bajtu, nagłówki).
  2. Baza danych (czas spędzony na przetwarzaniu zapytań).
  3. PHP / WordPress (czas generowania strony, zużycie pamięci).
  4. Wydajność frontonu (ilość żądań HTTP, przepustowość).

Dobrym początkiem byłaby wtyczka buforowania statycznego (jak W3) z pamięcią podręczną opartą na pamięci operacyjnej, jak APC .

Ale stamtąd jest o wiele więcej (i znacznie bardziej złożone) rzeczy, które możesz zrobić, takie jak sieci dystrybucji treści, alternatywne serwery sieciowe itp.

Rarst
źródło
wp najszybsza pamięć podręczna bije całkowitą pamięć podręczną w3, nawet bez pamięci podręcznej obiektów.
Ярослав Рахматуллин
19

Moja wydajność WordPress i stos buforowania

To najlepszy stos wydajności WordPress dla pojedynczego serwera lub VPS niskiego do średniego zasięgu. Klasyfikuję średni zakres jako pojedynczy rdzeń z około 1G pamięci i dość szybkimi dyskami.

Stos serwerów

  • Linux - Debian Lenny lub Ubuntu
  • Nginx - Skonfigurowany jako pamięć podręczna plików statycznych z odwrotnym proxy
  • Apache - Apache będzie obsługiwał PHP odciążone przez Nginx na alternatywnym porcie
  • MySql - wymagany przez WP, upewnij się, że korzystasz z najnowszej stabilnej wersji
  • PHP - Najnowsza stabilna wersja oddziału 5.2 lub 5.3

Pamięć podręczna PHP

  • APC - Skonfiguruj go z pamięcią mmap i rozmiarem shm co najmniej 128M

Stos wtyczek wydajności WordPress

Dzięki W3 Total Cache używamy dysku do buforowania stron i minimalizacji, ponieważ Nginx będzie bardzo szybko obsługiwał nasze pliki statyczne.

Jak skonfigurować Nginx do obsługi plików statycznych i przekazywania PHP do Apache

Problem z używaniem samego Apache polega na tym, że otwiera połączenie i uderza php przy każdym żądaniu, nawet dla plików statycznych. To marnuje połączenia, ponieważ Apache utrzymuje je otwarte, a gdy masz duży ruch, Twoje połączenia zostaną zablokowane, nawet jeśli nie będą używane.

Domyślnie Apache nasłuchuje żądań na porcie 80, który jest domyślnym portem WWW. Najpierw wprowadzimy zmiany w naszych plikach Apache i wirtualnych hostach, aby nasłuchiwać na porcie 8080.

Konfiguracja Apache

httpd.conf

wyłącz KeepAlive

ports.conf

NameVirtualHost *:8080
Listen 8080

Wirtualny host na witrynę

<VirtualHost 127.0.0.1:8080>
     ServerAdmin [email protected]
     ServerName yoursite.com
     ServerAlias www.yoursite.com
     DocumentRoot /srv/www/yoursite.com/public_html/
     ErrorLog /srv/www/yoursite.com/logs/error.log
     CustomLog /srv/www/yoursite.com/logs/access.log combined
</VirtualHost>

Powinieneś także zainstalować mod_rpaf, aby twoje logi zawierały prawdziwe adresy IP twoich gości. Jeśli nie, twoje logi będą miały początkowy adres IP 127.0.0.1.

Konfiguracja Nginx

Na Debianie można użyć repozytoriów do zainstalowania, ale zawierają one tylko wersję 0.6.33. Aby zainstalować późniejszą wersję, musisz dodać pakiety lenny backports

$ nano /etc/apt/sources.list

Dodaj ten wiersz do pliku deb http://www.backports.org/debian lenny-backports main

$ nano /etc/apt/preferences

Dodaj do pliku:

Package: nginx
Pin: release a=lenny-backports 
Pin-Priority: 999

Wydaj następujące polecenia, aby zaimportować klucz z backports.org, aby zweryfikować pakiety i zaktualizować bazę danych pakietów systemowych:

$ wget -O - http://backports.org/debian/archive.key | apt-key add -
$ apt-get update

Teraz zainstaluj za pomocą apt-get

apt-get install nginx

Jest to o wiele łatwiejsze niż kompilacja ze źródła.

Konfiguracja Nginx conf i plików serwera

nginx.conf

user www-data;
worker_processes  4;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access.log;
    client_body_temp_path /var/lib/nginx/body 1 2;
    gzip_buffers 32 8k;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;

  gzip_comp_level   6;
  gzip_http_version 1.0;
  gzip_min_length   0;
  gzip_types        text/html text/css image/x-icon
        application/x-javascript application/javascript text/javascript application/atom+xml application/xml ;



    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Teraz musisz skonfigurować wirtualny hosting Nginx. Lubię używać metody obsługującej witryny z każdym v hostem połączonym z plikiem w katalogu witryn.

$ mkdir /etc/nginx/sites-available  
$ mkdir /etc/nginx/sites-enabled
$ touch /etc/nginx/sites-available/yourservername.conf
$ touch /etc/nginx/sites-available/default.conf
$ ln -s  /etc/nginx/sites-available /etc/nginx/sites-enabled
$ nano /etc/nginx/sites-enabled/default.conf

default.conf

Uwaga:

Ustawienia statycznej pamięci podręcznej w poniższych plikach będą działać tylko wtedy, gdy włączona jest wtyczka integratora pamięci podręcznej proxy Nginx.

proxy_cache_path  /var/lib/nginx/cache  levels=1:2   keys_zone=staticfilecache:180m  max_size=500m;
proxy_temp_path /var/lib/nginx/proxy;
proxy_connect_timeout 30;
proxy_read_timeout 120;
proxy_send_timeout 120;

#IMPORTANT - this sets the basic cache key that's used in the static file cache.
proxy_cache_key "$scheme://$host$request_uri";

upstream wordpressapache {
        #The upstream apache server. You can have many of these and weight them accordingly,
        #allowing nginx to function as a caching load balancer 
        server 127.0.0.1:8080 weight=1 fail_timeout=120s;
}

Dla jednej witryny WordPress (w przypadku wielu witryn potrzebujesz tylko jednego vhosta)

server {
        #Only cache 200 responses, and for a default of 20 minutes.
        proxy_cache_valid 200 20m;

        #Listen to your public IP
        listen 80;

        #Probably not needed, as the proxy will pass back the host in "proxy_set_header"
        server_name www.yoursite.com yoursite.com;
        access_log /var/log/nginx/yoursite.proxied.log;  

        # "combined" matches apache's concept of "combined". Neat.
        access_log  /var/log/apache2/nginx-access.log combined;
        # Set the real IP.
        proxy_set_header X-Real-IP  $remote_addr;

        # Set the hostname
        proxy_set_header Host $host;

        #Set the forwarded-for header.
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
                        # If logged in, don't cache.
                        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
                                set $do_not_cache 1;
                        }
                        proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
                        proxy_cache staticfilecache;
                        proxy_pass http://wordpressapache;
        }

        location ~* wp\-.*\.php|wp\-admin {
                        # Don't static file cache admin-looking things.
                        proxy_pass http://wordpressapache;
        }

        location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
                        # Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
                        # whether logged in or not (may be too heavy-handed).
                        proxy_cache_valid 200 120m;
                        expires 864000;
                        proxy_pass http://wordpressapache;
                        proxy_cache staticfilecache;
        }

        location ~* \/[^\/]+\/(feed|\.xml)\/? {
 # Cache RSS looking feeds for 45 minutes unless logged in.
                        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
                                set $do_not_cache 1;
                        }
                        proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
                        proxy_cache_valid 200 45m;
                        proxy_cache staticfilecache;
                        proxy_pass http://wordpressapache;
        }

        location = /50x.html {
                root   /var/www/nginx-default;
        }

        # No access to .htaccess files.
        location ~ /\.ht {
                deny  all;
        }

        }

Konf. CDN na własnym serwerze

W przypadku samo-hostowanej sieci CDN wystarczy skonfigurować ją do obsługi plików statycznych bez przepustki proxy

server {

        proxy_cache_valid 200 20m;
        listen 80;
        server_name yourcdndomain.com;
        access_log   /srv/www/yourcdndomain.com/logs/access.log;
        root   /srv/www/yourcdndomain.com/public_html/;

 proxy_set_header X-Real-IP  $remote_addr;

      location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
                                # Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
                                # whether logged in or not (may be too heavy-handed).

                                proxy_cache_valid 200 120m;
                        expires 7776000;
                        proxy_cache staticfilecache;
                }

location = /50x.html {
                root   /var/www/nginx-default;
        }

 # No access to .htaccess files.
        location ~ /\.ht {
          deny  all;
        }

    }

Teraz uruchom serwery

$ /etc/init.d/apache2 restart  
$/etc/init.d/nginx start

Wyniki testu

Na Apache Bench ta konfiguracja teoretycznie może obsłużyć 1833.56 żądań na sekundę

$ ab -n 1000 -c 20 http://yoursite.com/

alternatywny tekst

Chris_O
źródło
1
+ Wow, to było imponujące, ale na razie wolę pominąć konfigurację nginx, ponieważ spowodowałoby to zbyt złożoną konfigurację serwera.
sorin
Chcę postępować zgodnie z instrukcjami na moim serwerze VPS. Ale obawiam się, że może wystąpić jakiś problem, jeśli zrobię coś złego. Nie zrobiłem tego wcześniej. Czy użytkownik taki jak ja jest w stanie to zrobić?
użytkownik391
1
Dzięki. Poważnie przydatne. Spróbuję tego. Chciałbym móc to zmienić więcej niż raz :)
Nasir
4

Użyj przestrzeni internetowej z minimum 64 MB pamięci RAM dla Multisite i użyj APC i Memcached na Apache, pamięć podręczna nie jest statyczna i możesz bez problemu korzystać ze wszystkich funkcji WP. Możesz skanować za pomocą PageSpeed, czytać także inne opcje, które zostały zakodowane w motywie. Pamięć podręczna może wykonać świetną robotę, ale nie może naprawić złego motywu lub wtyczki. Innym rozwiązaniem jest użycie poddomen bez plików cookie jako CDN w WordPress. Dodaj to do wp-config.php dla plików cookie tylko w domenie, a nie w subdomenie.

define( 'COOKIE_DOMAIN', 'example.com' );

Teraz ustaw nowe funkcje w functions.php motywu lub napisz wtyczkę, aby zastąpić ścieżkę z treści statycznej do swoich poddomen, niestandardowej sieci CDN.

// replace for CDN on bloginfo
if ( !function_exists('fb_add_static_wpurl') ) {
    function fb_add_static_wpurl($info, $show) {

        if ( is_admin() )
            return $info;

        $keys = array(
            'url',
            'wpurl',
            'stylesheet_url',
            'stylesheet_directory',
            'template_url',
            'template_directory',
            );

        if ( in_array( $show, $keys ) ) {

            $wpurl = get_bloginfo('wpurl');

            $search = array(
                $wpurl . '/wp-content/images/',
                $wpurl . '/wp-content/download/',
                $wpurl . '/wp-content/themes/',
                $wpurl . '/wp-content/plugins/',
            );

            $replace = array(
                'http://cdn1.example.com/',
                'http://cdn2.example.com/',
                'http://cdn3.example.com/',
                'http://cdn4.example.com/',
            );

            return str_replace( $search, $replace, $info );

        } else {
            return $info;
        }
    }
    add_filter( 'bloginfo_url', 'fb_add_static_wpurl', 9999, 2 );
}

teraz funkcja dla szablonu i ścieżki arkusza stylów

function fb_add_static_stylesheet_uri($uri) {

            if ( is_admin() )
                return $uri;

            $wpurl = get_bloginfo('wpurl');

            $search = array(
                $wpurl . '/wp-content/images/',
                $wpurl . '/wp-content/download/',
                $wpurl . '/wp-content/themes/',
                $wpurl . '/wp-content/plugins/',
            );

            $replace = array(
                'http://cdn1.example.com/',
                'http://cdn2.example.com/',
                'http://cdn3.example.com/',
                'http://cdn4.example.com/',
            );
            return str_replace( $search, $replace, $uri );

}
add_filter ( 'template_directory_uri', 'fb_add_static_stylesheet_uri' );
add_filter ( 'stylesheet_uri', 'fb_add_static_stylesheet_uri' );
add_filter ( 'stylesheet_directory_uri', 'fb_add_static_stylesheet_uri' );

Teraz przeczytaj Prędkość strony na statycznych adresach URL CDN bez plików cookie.

Dodaj również następujące źródło do pliku .htaccess, aby zablokować publikację treści:

##
# Explicitly send a 404 header if a file on cdn[0-9].example.org is not
# found. This will prevent the start page (empty URL) from being loaded.
##
RewriteCond %{HTTP_HOST} ^cdn[0-9]\.example\.org [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* - [R=404,L]

##
# Do not dispatch dynamic resources via cdn[0-9].example.org.
##
RewriteCond %{HTTP_HOST} ^cdn[0-9]\.example\.org [NC]
RewriteCond %{REQUEST_FILENAME} \.(php|html)$
RewriteRule .* - [R=404,L]

Skorzystaj z funkcji, to także przykłady i możesz pisać swoje rozwiązania z moimi pomysłami.

bueltge
źródło
0

Stos serwera WWW

Zasadniczo zachowaj każdą operację w pamięci!

  • Nowoczesny procesor, duża przepustowość pamięci, ponieważ WordPress to głównie kopiowanie pamięci, czas dostępu do dysku poniżej milisekund, wypróbuj UpCloud!
  • Cienka warstwa wirtualizacji, wypróbuj UpCloud! Trzymaj się z dala od popularnych dostawców spoza przedsiębiorstwa
  • Szybki system operacyjny: brak systemowego, wystarczająca entropia, równowaga IRQ, niskie zużycie pamięci
  • Blokuj napastników atakujących: Fail2ban, trwale blokuj sieci cieni
  • Anycast DNS
  • Szybki serwer internetowy: Apache Event MPM
  • Połączenie równoległe CDN z prędkościami zbliżonymi do pamięci RAM (Amazon CloudFront)
  • High Speed ​​SSL: certyfikat ECDSA, źródło Entropy, TLS 1.2, Ciphersuites dla AES-NI, pamięć podręczna sesji SSL, zszywanie OCSP, HTTP / 2
  • Nowoczesne PHP z OPcache, połączone przez FastCGI
  • Lean WordPress: tylko minimalne i sprawdzone wtyczki
  • Ponownie cache obiektów w pamięci
  • Silnik TokuDB (fraktalne drzewo) MariaDB
  • Optymalizacja zasobów
  • Cięcie na JavaScript
  • Ciągłe monitorowanie: Pingdom, HetrixTools

Cała moja wiedza jest open-source https://github.com/szepeviktor/debian-server-tools

Szépe Viktor
źródło