it-swarm.xyz

Шаги по оптимизации WordPress в отношении загрузки сервера?

Помимо установки W3 Total Cache или другого плагина кеширования, какие шаги я могу предпринять, чтобы убедиться, что моя тема и сайт работают максимально быстро.

80
Paul Sheldrake

Вы можете установить WordPress на Nginx. Есть ряд ресурсов, чтобы помочь:

Некоторая информация о производительности из этой последней ссылки (которая выглядит немного иначе, чем другие):

Поэтому я решил разместить прокси в WordPress перед статическим кешем в максимально возможной степени. ВСЕ неаутентифицированный трафик подается напрямую из файлового кэша nginx, принимая некоторые запросы (например, генерацию RSS-канала) с 6 страниц в секунду до 7000+ страниц в секунду. Уф. Nginx также обрабатывает журналирование и сжатие, оставляя более тяжелые серверные апачи делать то, что у них получается лучше всего: обслуживать динамические страницы WordPress только при необходимости.

...

На nginx - это так эффективно, это страшно. Я никогда не видел, чтобы он использовал более 10–15 мегабайт RAM и ​​небольшую загрузку процессора даже при самой большой нагрузке. Наши графики ганглиев не лгут: мы вдвое сократили наши требования к памяти, удвоили пропускную способность исходящей сети и полностью выровняли нашу нагрузку. У нас практически не было проблем с тех пор, как мы это создали.

31
Travis Northcutt

Задайте срок действия на стороне клиента для таких вещей, как CSS, изображения, JavaScript и т.д., Которые не нужно повторно загружать для каждого просмотра страницы. Это, безусловно, имело огромное значение для времени загрузки моего сайта. Самая быстрая загрузка - это загрузка, которой никогда не было ...

# 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

Вы можете предварительно распаковать все, что можете (7-Zip - хороший инструмент для этого) и загрузить его в том же месте, что и файл, который вы только что распаковали. Измените .htaccess для обслуживания предварительно сжатых файлов, как показано ниже. Предостережение в том, что вы должны помнить, чтобы повторно сжать их, если/когда вы обновляете вещи. Это сокращает нагрузку на процессор, кроме анализа .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]

Это просто сырой ответ. Есть много вариантов на эту тему. Я написал об этом в блоге и добавил несколько ссылок на более подробные статьи по адресу http://icanhazdot.net/2010/03/23/some-wordpress-stuff/ . Прочитайте это и, что более важно, ссылки, на которые я указываю, - это хорошие ресурсы.

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

Плагин, который я нашел очень полезным, тоже есть wp-minify . С этим следует обратить внимание, что вы должны исключить элементы, относящиеся к конкретной странице (контактную форму, ползунок главной страницы и т.д.), Чтобы не перезагружать полный набор CSS, JS и т.д. Для каждой страницы. Это хороший способ минимизировать, объединить и сжать базовый CSS, JS и т.д. Он значительно сокращает количество http-запросов. Wp-minify хорошо работает с суперкашем, а также с заголовками истечения, которые я подробно описал выше.

Используйте Yslow в Firebug (Firefox) или аналогичный, чтобы отслеживать ваши http-запросы, а также то, что сжато, а что нет. Взгляните на заголовки истечения там тоже. Вскоре вы увидите, что вы можете улучшить.

26
CAD bloke

Сведите к минимуму количество плагинов, которые вы запускаете, к тому, что вам действительно нужно. Особенно следует помнить о плагинах, которые добавляют javascript и CSS-код при каждой загрузке страницы, даже если этот код не используется на странице.

Если вы создаете свою собственную тему с нуля, разбейте свой CSS так, чтобы функции, которые нужны только для определенных шаблонов страниц или типов просмотра (отдельный пост, архивы, категории и т.д.), Загружались только при необходимости.

Настройте W3TC для использования CDN (например, Amazon CloudFront или любой другой, поддерживаемый W3TC).

Посмотрите, подходят ли вам варианты Minify (некоторые плагины генерируют js/css, который не будет хорошо минимизироваться, поэтому не забудьте протестировать свой сайт после активации функции minify).

Если у вас есть полный контроль над сервером MySQL, убедитесь, что у вас включен query_cache. Используйте скрипт настройки MySQL , чтобы найти другие способы оптимизации конфигурации вашей базы данных.

Если по какой-либо причине использование CDN проблематично, настройте mod_expires в настройках Apache. Установите время истечения срока действия для статических типов, таких как изображения, CSS, Javascript, видео, аудио и т.д.

21
Dougal Campbell

Запустите memcached и используйте объектный кеш , чтобы уменьшить количество запросов к базе данных. Это кэширует данные из базы данных, а не страниц. Не уверен, что w3-total-cache уже делает это.

Убедитесь, что вы используете кэш кода операции, например APC . (Есть еще несколько доступных.)

14
Annika Backstrom

Помимо использования подключаемого модуля кэширования диска, такого как wp-cache, разместите свой блог на томе Host, для которого установлено свойство noatime. В противном случае, подключитесь к вашему хосту по SSH (если ваш веб-хостинг это предоставляет) и регулярно запускайте эту команду для ваших файлов каждые несколько дней:

chattr -R +A ~/*

~/* Означает "мои файлы в моем домашнем каталоге". Вы можете изменить этот путь, как считаете нужным. Вы также можете настроить это для задания cron в cpanel, если ваш веб-хостинг предоставляет это.

Для получения дополнительной информации о свойствах atime см. это . Это значительно повышает производительность чтения с диска Linux.

Иногда ваш сайт забивают пауки. Вы можете использовать такой инструмент, как SpyderSpanker или Chennai Central, чтобы отфильтровать пауков, которые не помогают повысить рейтинг страниц на вашем сайте и просто замедлить его, а затем подавить хороших пауков (таких как Google, Bing и т.д.), Отправив их случайным образом. HTTP 304 Не модифицированные сообщения.

Еще я вижу плохо написанные плагины. Если вы научитесь создавать плагины, вы начнете видеть, как некоторые плагины неэффективно кодируются, или даже находите бомбы замедленного действия, такие как таблица базы данных, которая заполняется и заполняется и никогда не очищается, храня такие вещи, как данные входящего соединения.

Помимо всех других решений здесь, вы также можете создать веб-ферму WordPress вашего блога, разместив ее на нескольких компьютерах с веб-узлами, которые подключаются к одной базе данных и одному дисковому тому для файлов (например, тому, смонтированному через NFS). ). Проверьте Ultra Monkey о том, как все это сделать.

8
Volomike

Несколько ответов из головы:

1) Минимизируйте количество HTTP-запросов, которые браузер должен сделать к вашему Хосту, объединяя JavaScript и CSS, где это возможно/практично.

2) Перенесите как можно больше ваших изображений/мультимедиа на сторонние CDN, особенно если вы используете виртуальный хостинг.

3) Попробуйте уменьшить количество сообщений, отображаемых на главной странице, чтобы сократить общее время рендеринга.

3a) Попробуйте использовать тему, которая представляет несколько популярных постов в полном объеме на первой странице и все другие старые посты в качестве выдержек.

7
ZaMoose

Кэширование меню WordPress также повышает производительность. Особенно, если у вас много страниц или гигантская структура меню, это следует учитывать.

Сделайте это в 2 простых шага. Сначала создайте функцию, которая получает или создает меню, вместо непосредственного вызова wp_nav_menu.

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

    }

}

В вашей теме замените wp_nav_menus на get_cached_menu. Теперь, каждый раз, когда вызывается меню, у вас есть один запрос к базе данных вместо всего меню.

Меню меняются не часто - но вам также нужно подключиться к действию wp_update_nav_menu, чтобы удалить старые переходные процессы.

Сделай это так:

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

}

Меню будет сгенерировано при следующем вызове страницы - и используйте кэшированную версию, пока кто-нибудь снова не обновит меню.

Обновленная версия

Спасибо @helgatheviking за указание на ошибку между слизнями и идентификаторами. Я обновил функции, чтобы они работали как с theme_position, так и с menu (для прямого вызова меню).

Меню всегда сохраняются с названием меню, а не с позицией в теме.

7
fischi

Используйте класс базы данных, который обрезан для оптимизации. Мы сделали хороший опыт с собственным кодом, чтобы уменьшить использование памяти и скорость доступа к базе данных. Кроме того, вы можете оптимизировать структуру базы данных путем небольших изменений, которые также делают многое.

Часть кода класса базы данных можно найти в wordpress trac, он не попал в ядро ​​( Билет № 11799 и связанный ).

5
hakre

Для сайта с высокой посещаемостью вы должны настроить все буферы MySQL для содержимого, которое сейчас доступно. Независимо от версии WordPress, уровень MySQL можно вычислить .

Фактически, если у вас есть данные InnoDB без включения innodb_file_per_table, вам нужно очистить InnoDB, сегментируя каждую таблицу в ее собственное физическое табличное пространство . Можно выполнить достойную настройку MySQL даже если у вас ограниченное оборудование . Есть много сценариев для такой оптимизации InnoDB .

ИМХО, вы не можете планировать хорошие настройки для my.cnf, не зная объема данных для настройки. Вам придется периодически загружать текущий набор данных из рабочей среды в промежуточную среду, выполнять оптимизацию и получать номера для настройки в my.cnf рабочего сервера.

4
RolandoMySQLDBA

Я недавно говорил на эту тему в WordCamp Хьюстон . Все вышеперечисленные рекомендации хороши, и важно убедиться, что весь интерфейс полностью оптимизирован, и вы можете приступить к решению проблем с кэшированием и производительностью сервера.

Прогрессивный рендеринг заставит ваши страницы чувствовать себя быстрее, потому что пользователь увидит содержимое страницы до ее полной загрузки. Для этого убедитесь, что любой блокирующий js находится в самом низу страницы, а css вверху.

Также, если вы используете много кнопок социальных сетей, вы можете настроить скрипты так, чтобы они загружались в iframe после полной загрузки страницы. Я написал учебник о том, как это сделать с помощью кнопки Tweet re Tweet TweetMeMe (в настоящее время устарел, поскольку Twitter выпустил свою собственную кнопку ретвита), но все же можно применять к другим кнопкам общего доступа.

Для производительности сервера посмотрите на Nginx в качестве внешнего прокси для статического контента с Apache, обрабатывающего тяжелые PHP и ​​подъем MySQL.

3
Chris_O

вы можете включить глобальное выходное сжатие . это автоматически распаковывает все, что происходит, если браузер поддерживает это. Это резко уменьшает размер передаваемых файлов, но увеличивает нагрузку на процессор.

3
Scott M.

Поскольку никто еще не упомянул об этом, одним из наиболее важных шагов для повышения производительности сервера в сочетании с любой настройкой LAMP будет переключение на рабочий поток Apache и mod_fcgid.

Это освободило 500 МБ памяти на моем виртуальном частном сервере.

2
nottinhill

Руководство по проверке замедления работы плагина

Есть красивый простой плагин под названием Page Load Time , который добавляет таймер в нижний колонтитул вашей страницы. На самом деле всего четыре строки кода:

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

Затем:

  1. Создать электронную таблицу
  2. Перечислите все ваши активные плагины и поместите их туда
  3. Обновите страницу три раза, отмечая время загрузки страницы каждый ход
  4. Просмотрите свои плагины один за другим, отключив их
  5. Повторите шаг 3
  6. Обратите внимание на порядок, в котором вы деактивировали плагины

Ваша таблица должна выглядеть примерно так

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

Поэтому, если после деактивации плагина время отклика страницы значительно возрастает, вы можете увидеть, сможете ли вы избежать этого плагина.

Я нашел два плагина, которые вызывали "значительное" замедление mqtranslate и (довольно старый, но хороший) Многоуровневый навигационный плагин .

1
icc97