Каков наилучший вариант кэширования для многопользовательского WordPress-хостинга?


13

Какую конфигурацию плагина кэширования вы рекомендуете и почему при следующих допущениях:

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

Подробности: я использую плагин Firefox для Google Page Speed, чтобы попытаться оптимизировать скорость сайта.

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

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

Ответы:


4

Базовым ответом на вопрос "какой плагин", вероятно, будет W3 Total Cache . Это один из самых функциональных и активно развивающихся плагинов на данный момент. Однако полная цепочка производительности намного длиннее, чем один плагин WordPress.

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

Хорошим началом будет плагин статического кэширования (например, W3) с кэш-памятью на основе кода операции типа APC .

Но оттуда есть гораздо более (и более сложные) вещи, которые вы можете сделать, такие как сети распространения контента, альтернативные веб-серверы и т. Д.


Самый быстрый кэш wp превосходит общий кэш w3, даже без кеша объектов.
Ярослав Рахматуллин

19

Моя производительность WordPress и стек кэширования

Это лучший стек производительности WordPress для одиночного или среднего сервера с низким и средним диапазоном. Я классифицирую средний диапазон как одноядерный с около 1 ГБ памяти и довольно быстрыми дисками.

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

  • Linux - либо Debian Lenny, либо Ubuntu
  • Nginx - настроен как статический кеш обратного прокси
  • Apache - Apache будет обрабатывать PHP, выгруженный Nginx через альтернативный порт
  • MySql - требуется WP, убедитесь, что вы используете последнюю стабильную версию
  • PHP - последняя стабильная версия ветки 5.2 или 5.3

PHP Cache

  • APC - настройте его с памятью mmap и размером shm не менее 128M

Стек плагинов для WordPress Performance

  • Nginx прокси-кеш интегратор
  • W3 Total Cache - Усовершенствуйте кэш страницы для диска, уменьшите до диска, а объект и дБ до APC.
    • Self Hosted CDN - создайте 4 псевдонима cname, которые указывают на домен на сервере, настроенном только для обслуживания статического файла

В 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 Config

В Debian вы можете использовать репозитории для установки, но они содержат только версию 0.6.33. Чтобы установить более позднюю версию, вы должны добавить пакеты lenny backports

$ 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 host связан с файлом в каталоге сайтов.

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

        }

Self Hosted CDN conf

Для вашей собственной CDN conf вам нужно только настроить ее для обслуживания статических файлов без пропуска прокси

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 Bench эта установка теоретически может обслуживать 1833,56 запросов в секунду

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

альтернативный текст


1
+ Вау, это было впечатляюще, но на данный момент я предпочту пропустить настройку nginx, потому что это сделает настройку сервера слишком сложной.
Сорин

Я хочу следовать вашим инструкциям на моем VPS-хостинге. Но я боюсь, что возникнут какие-либо проблемы, если я сделаю что-то не так. Я не делал этого раньше. Может ли такой пользователь, как я, это сделать?
user391

1
Благодарю. Серьезно полезно. Я собираюсь попробовать это. Я хотел бы изменить это не раз :)
Насир

4

Используйте веб-пространство с минимумом 64 МБ ОЗУ для мультисайта и используйте APC и Memcached на Apache, кэшируйте не статично, и вы можете без проблем использовать все WP-функции. Сканируешь через PageSpeed, читаешь и другие варианты, там была закодирована тема. Кеш может сделать большую работу, но не может исправить плохую тему или плагин. Другим решением является использование поддоменов без файлов cookie в качестве CDN в WordPress. Добавьте это в wp-config.php для файлов cookie только на домене, а не на поддомене.

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

Теперь установите новые функции в functions.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' );

Теперь прочитайте Page Speed ​​на внешних статических URL CDN без файлов cookie.

Также добавьте следующий источник в .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 - это в основном копирование памяти, время доступа к диску менее 1 мс, попробуйте UpCloud!
  • Тонкий слой виртуализации, попробуйте UpCloud! Хранить вдали от популярных поставщиков, не относящихся к предприятиям
  • Быстрая операционная система: нет systemd, достаточно энтропии, баланс IRQ, низкое использование памяти
  • Блокировать атакующих: Fail2ban, навсегда блокировать теневые сети
  • Anycast DNS
  • Быстрый веб-сервер: Apache Event MPM
  • Параллельное соединение CDN с RAM-подобными скоростями (Amazon CloudFront)
  • Высокоскоростной SSL: сертификат ECDSA, источник энтропии, TLS1.2, наборы шифров для AES-NI, кэш сеансов SSL, сшивание OCSP, HTTP / 2
  • Современный PHP с OPcache, подключенный через FastCGI
  • Бережливая установка WordPress: только минимальные и проверенные плагины
  • Redis в кеше объектов в памяти
  • TokuDB (фрактальное дерево) двигатель MariaDB
  • Оптимизация ресурсов
  • Вырезать на JavaScripts
  • Непрерывный мониторинг: Pingdom, HetrixTools

Все мои знания с открытым исходным кодом https://github.com/szepeviktor/debian-server-tools

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.