WordPress – одна з найпопулярніших CMS, але що заважає накидати їм кілька каменів у город?

Основна проблема виникає з WordPress – це продуктивність, ви про неї не будете згадувати досить довго – ну поки відвідування вашого блогу не перевалять за тисячу, а то й дві на добу. Після – до вас почне стукати хостер, і віщати, що заважаєте жити сусідам по хостингу, що тариф треба міняти, і давайте орендуйте виділений сервер під свій блог… бла-бла-бла…

Щоб було наочніше – продемонструю графік використання пам’яті wordpress’ом, який побудував Макс:

Кешуємо

Спочатку мій погляд впав на репозиторій плагінів WordPress, я витягнув оттель WP Super Cache плагін – хостингу звичайно полегшало, але не так, щоб супер, адже до початку роботи даного плагіна, двиг WP таки повинен піднятися. Потім знайшов MaxCache, сенс даного кешування – визначати попадання в кеш до завантаження WP, і цей приріст продуктивності став істотним – LA сервера впав з ~1.0-1.6 до ~0.2-0.4, пам’яті їсти теж стали менше – 634Mb > 525Mb.

Відключаємо плагіни

Крім самого движка, дуже солідну частину навантаження створюють криві й не дуже плагіни. Поки у мене на прикметі два плагіна, які я благополучно відключив:

  • Akismet – алгоритм даної захисту передбачає надсилання коментарів на сервіс для перевірки – але при >200 спам коментарів – це напружує
  • WP-PostViews – це просто примочка – сенс роботи – після завантаження сторінки AJAX’ом стукає на сервер для инкрементации лічильника – тобто для відображення сторінки у вас двічі піднімається рушій WP

Якщо стикалися з якими ще “дивними” плагінами – відпишіться в коментарях…

Оптимізуємо БД

Невеликий запит на видалення сміття з БД (взято отсель).

// видаляємо ревізії постів і все, що з ними пов’язане
DELETE `p`, `pm`, `c`, `tr`
FROM `wp_posts` AS `p`
LEFT JOIN `wp_postmeta` AS `pm`
ON `p`.`ID` = `pm`.`post_id`
LEFT JOIN `wp_comments` AS `c`
ON `p`.`ID` = `c`.`comment_post_ID`
LEFT JOIN `wp_term_relationships` AS `tr`
ON `p`.`ID` = `tr`.`object_id`
WHERE
`p`.`post_type` = ‘revision’;
// запускаємо вбудовані механізми оптимізації
OPTIMIZE TABLE
`wp_posts`,
`wp_postmeta`,
`wp_comments`,
`wp_term_relationships`;

Захист

Скажіть “до чого це тут”, а ні – тут саме місце – досить часто адмінка популярних блогів піддається атаці, а це теж забирає ресурси. Як на мене – найкращий спосіб – це правильно налаштований htaccess для директорії /wp-admin/:

  • Обмежити доступ по IP
    order deny,allow
    deny from all
    allow from 255.255.255.255
  • Додати аутентифікацію засобами Apache

Клієнтська оптимізація

Ох, тут можна розповідати дуже багато, я лише скину посилання на тематичний сайт – webo.in – а там ви знайдете багато матеріалу, копіпаст немає сенсу, скажу лише так – дана оптимізація стане критичною вже за десяток тисяч відвідувачів, я ж зупинився на невеликій правці файлу .htaccess:

# Enable ETag
FileETag MTime Size
# Enable Deflate
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css-text/javascript application/x-javascript
ExpiresActive On
ExpiresDefault “access plus 1 seconds”
ExpiresByType text/html “access plus 1 seconds”
ExpiresByType image/x-icon “access plus 2592000 seconds”
ExpiresByType image/gif “access plus 2592000 seconds”
ExpiresByType image/jpeg “access plus 2592000 seconds”
ExpiresByType image/png “access plus 2592000 seconds”
ExpiresByType text/css “access plus 604800 seconds”
ExpiresByType text/javascript “access plus 216000 seconds”
ExpiresByType application/x-javascript “access plus 216000 seconds”

Результати даного зміни відстежував за допомогою Firefox+Firebug+YSlow, ось власне і скріни ДО і ПІСЛЯ змін:

P. S. до Речі, хостинг у мене тепер український, і сайт, для основної частини аудиторії, тепер буде просто літати…