Який найкращий варіант кешування для багатосторінкового WordPress на хостингу, що не використовується спільно?


13

Яку конфігурацію плагіну кешування ви рекомендуєте, і чому в наступних припущеннях:

  • повний контроль конфігурації сервера
  • запуск WordPress у режимі з кількома сайтами та з кількома доменами
  • більшість доменів не використовують www.префікс (cookies)
  • (бажання) мати можливість вимкнути кешування для конкретних IP-адрес або на основі файлу cookie, коли ви вносите зміни на сайт, вам не потрібно кешування.

Детальніше: Я використовую плагін Firefox Google Page Speed, щоб спробувати оптимізувати швидкість веб-сайту.

Також будь ласка, не керуйтеся загальними рекомендаціями, як-от менші зображення.

Будемо чесними, використання декількох плагінів кешування принесе вам більше проблем, ніж вирішить, тому спробуйте дати простий підхід.

Відповіді:


4

Основна відповідь на "який плагін", ймовірно, буде W3 Total Cache . Це один з найбільш функціональних і активно розвинутих плагінів на даний момент. Однак повний ланцюжок продуктивності набагато довший, ніж плагін WordPress самостійно може працювати.

  1. Конфігурація веб-сервера (Apache або щось інше) (час відповіді, час на перший байт, заголовки).
  2. База даних (витрачена за часом обробка запитів).
  3. PHP / WordPress (час генерації сторінки, витрата пам'яті).
  4. Виробничі характеристики (кількість HTTP-запитів, пропускна здатність).

Хорошим початком буде статичний плагін кешування (наприклад, W3) з кешованою пам’яттю на основі коду, як APC .

Але звідти ви можете зробити більше (і набагато складніших) речей, як-от мережі розповсюдження контенту, альтернативні веб-сервери тощо.


wp найшвидший кеш- файти б'є w3 загальний кеш, навіть без кеш-об’єктів.
Ярослав Рахматуллін

19

Моя WordPress продуктивність та кешування стек

Це найкращий стек продуктивності WordPress для одного сервера низького та середнього діапазону або VPS. Я класифікую середній діапазон як одноядерний, що має близько 1 Г пам'яті і досить швидкі диски.

Серверний стек

  • Linux - або Debian Lenny, або Ubuntu
  • Nginx - Налаштовується як кеш-файл статичного зворотного проксі
  • Apache - Apache буде обробляти PHP, завантажений Nginx на альтернативному порті
  • MySql - вимагає WP, переконайтеся, що ви працюєте з останньою стабільною версією
  • PHP - остання стабільна версія 5,2 або 5,3 відділення

PHP кеш

  • APC - Налаштуйте його за допомогою mmap-пам’яті та розміром shm принаймні 128М

WordPress Plugin стек продуктивності

  • Інтегратор кешу проксі-сервера Nginx
  • W3 Total Cache - Встановлення кешу сторінки на розширений диск, мінімізація на диску та об'єкт і db в APC.
    • Self Hosted CDN - Створіть 4 псевдоніми імен, які вказують на домен на сервері, налаштований просто для подання статичного файлу

За допомогою W3 Total Cache ми використовуємо диск для кешування сторінок і мінімізуємо, оскільки Nginx дуже швидко обслуговуватиме наші статичні файли.

Як налаштувати Nginx для обслуговування статичних файлів та передачі PHP Apache

Проблема лише з використанням Apache полягає в тому, що він відкриває з'єднання і звертається до php на кожен запит, навіть для статичних файлів. Це втрачає зв’язки, оскільки Apache буде тримати їх відкритими, і коли у вас буде багато трафіку, ваші з'єднання будуть забиті, навіть якщо вони не використовуються.

За замовчуванням Apache прослуховує запити на порт 80, який є веб-портом за замовчуванням. Спочатку ми збираємося внести зміни до нашого Apache conf та файлів віртуальних хостів для прослуховування через порт 8080.

Apache Config

httpd.conf

вимкніть KeepAlive на вимкненому

ports.conf

NameVirtualHost *:8080
Listen 8080

Віртуальний хост сайту

<VirtualHost 127.0.0.1:8080>
     ServerAdmin info@yoursite.com
     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>

Вам також слід встановити mod_rpaf, щоб ваші журнали містили справжні ip адреси ваших відвідувачів. Якщо ні, ваші журнали матимуть 127.0.0.1 як вихідну ip адресу.

Налаштування Nginx

На Debian ви можете використовувати сховища для установки, але вони містять лише версію 0.6.33. Щоб встановити більш пізню версію, вам потрібно додати пакети із заднім числом

$ nano /etc/apt/sources.list

Додайте цей файл у файл deb http://www.backports.org/debian lenny-backports main

$ nano /etc/apt/preferences

Додайте у файл таке:

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

Виконайте такі команди, щоб імпортувати ключ з backports.org для перевірки пакунків та оновлення бази даних вашої системи:

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

Тепер встановіть з apt-get

apt-get install nginx

Це набагато простіше, ніж компілювати з джерела.

Конфігурація файлів Nginx і файлів сервера

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/*;
}

Тепер вам потрібно буде налаштувати свій віртуальний хостинг Nginx. Мені подобається використовувати метод з підтримкою сайтів із кожним символом хоста v, пов’язаним з файлом у доступній для сайтів каталозі.

$ 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

Примітка:

Налаштування статичного кешу в наступних файлах працюватимуть лише у тому випадку, якщо плагін інтегратора кеша проксі 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;
}

За конфіденційність сайту WordPress (для веб-сайтів вам знадобиться лише один vhost)

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

        }

CDN конф. Конф

Для власної конфіденційної конфіденційності CDN вам потрібно лише встановити її для обслуговування статичних файлів без пропуску проксі

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

    }

Тепер запустіть сервери

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

Результати порівняння

На лавці Apache ця установка теоретично може обслуговувати 1833,56 запитів в секунду

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

alt текст


1
+ Ого, це вражало, але на даний момент я вважаю за краще пропустити налаштування nginx, оскільки це зробить налаштування сервера занадто складним.
sorin

Я хочу слідувати вашим інструкціям на моєму VPS-хостингу. Але я боюся, якщо якась проблема може виникнути, якщо я щось не так. Я раніше цього не робив. Чи може такий користувач, як я, це зробити?
користувач391

1
Спасибі. Серйозно корисно. Я збираюся спробувати це. Я б хотів, щоб я міг це змінити не раз :)
Nasir

4

Використовуйте веб-простір з мінімальним 64MB Ram для Multisite та використовуйте APC та Memcached на Apache, кеш не є статичним, і ви можете без проблем використовувати всі WP-функції. Ви скануєте через PageSpeed, читайте також інші параметри, там було закодовано тему. Кеш може зробити чудову роботу, але не може виправити погану тему чи плагін. Іншим рішенням є використання субдоменів без файлів cookie як CDN в WordPress. Додайте це до wp-config.php для файлів cookie лише в домені, а не піддомену.

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

Тепер встановіть нові функції в function.php теми або напишіть плагін, щоб замінити статичний контент форми до ваших субдоменів, вашим власним 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 );
}

тепер функція для шаблону та таблиці стилів

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

Тепер читайте «Швидкість сторінки» на статичних URL-адресах переднього інтернету без куки.

Також додайте наступне джерело до .htaccess для вмісту повторюваних блоків:

##
# 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]

Будь ласка, використовуйте функцію, також є прикладами, і ви можете написати свої рішення з моїми ідеями.


0

Стек веб-серверів

По суті, зберігайте кожну операцію в пам’яті!

  • Сучасний процесор, висока пропускна здатність пам’яті як WordPress - це головним чином копіювання пам’яті, час доступу до диска нижче msec, спробуйте UpCloud!
  • Тонкий шар віртуалізації, спробуйте UpCloud! Тримайтеся подалі від популярних непідприємницьких постачальників
  • Швидка операційна система: відсутність системності, достатня ентропія, баланс IRQ, низьке використання пам'яті
  • Блокування забиваючих зловмисників: Fail2ban, постійно блокує тіньові мережі
  • Anycast DNS
  • Швидкий веб-сервер: Apache Event MPM
  • CDN паралельного з'єднання зі швидкістю, що нагадує оперативну пам'ять (Amazon CloudFront)
  • Високошвидкісний SSL: сертифікат ECDSA, джерело ентропії, TLS1.2, шифри для AES-NI, кеш-сеанс SSL, зшивання OCSP, HTTP / 2
  • Сучасний PHP з OPcache, підключений через FastCGI
  • Lean WordPress: лише мінімальні та перевірені плагіни
  • Повторне кешування об'єктів в пам'яті
  • Двигун MariaDB TokuDB (фрактальне дерево)
  • Оптимізація ресурсів
  • Виріжте на JavaScripts
  • Постійний моніторинг: Pingdom, HetrixTools

Усі мої знання є відкритим кодом https://github.com/szepeviktor/debian-server-tools

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.