WordPressサーバーが重い!原因特定から高速化まで完全解決ガイド

Web

「最初は速かったのに、最近めちゃくちゃ重い…」 「管理画面を開くのに30秒もかかる」 「アクセスが増えるとサーバーがダウンする」

WordPressサイトの80%以上が速度問題を抱えています。

でも、原因さえ特定できれば 表示速度を10倍速くすることも可能です!

この記事では、 重い原因の特定方法から具体的な対策まで、 優先順位付きで完全解説します。


スポンサーリンク

【緊急度順】今すぐ確認すべき7つの原因

1. 不正アクセス・ボット攻撃(緊急度:★★★★★)

症状:

  • 急激にサーバー負荷が上昇
  • アクセスログが異常に多い
  • CPU使用率100%

確認方法:

# リアルタイムアクセス確認
tail -f /var/log/apache2/access.log | grep -E "wp-login|xmlrpc|admin-ajax"

# 攻撃元IPの特定
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20

# WordPressログイン試行の確認
grep "wp-login.php" /var/log/apache2/access.log | wc -l

即効対策:

# .htaccessで攻撃をブロック
<Files wp-login.php>
    Order Deny,Allow
    Deny from all
    Allow from あなたのIP
</Files>

<Files xmlrpc.php>
    Order Deny,Allow
    Deny from all
</Files>

2. プラグインの暴走(緊急度:★★★★☆)

重いプラグインTOP10:

  1. Jetpack(全機能ON時)
  2. WooCommerce(大規模ショップ)
  3. WPML(多言語サイト)
  4. Broken Link Checker
  5. WP Statistics
  6. All in One SEO(重複機能)
  7. Wordfence(フルスキャン時)
  8. Contact Form 7(大量スパム時)
  9. Revolution Slider
  10. Visual Composer系

診断プラグイン:Query Monitor

# インストール
wp plugin install query-monitor --activate

# 確認ポイント:
- Database Queries(クエリ数)
- Page Generation Time(生成時間)
- Memory Usage(メモリ使用量)

3. データベースの肥大化(緊急度:★★★★☆)

確認コマンド:

-- テーブルサイズ確認
SELECT 
    table_name AS 'Table',
    ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)'
FROM information_schema.TABLES
WHERE table_schema = 'wordpress_db'
ORDER BY (data_length + index_length) DESC;

-- 投稿リビジョン数確認
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision';

-- 自動下書き数確認
SELECT COUNT(*) FROM wp_posts WHERE post_status = 'auto-draft';

-- スパムコメント数確認
SELECT COUNT(*) FROM wp_comments WHERE comment_approved = 'spam';

4. 画像の最適化不足(緊急度:★★★☆☆)

問題のある画像:

  • 5MB以上の写真をそのままアップロード
  • PNGで写真を保存
  • WebP未対応

確認方法:

# 大きな画像ファイルを検索
find /var/www/html/wp-content/uploads -type f -size +1M -exec ls -lh {} \;

# 画像形式の統計
find /var/www/html/wp-content/uploads -type f \( -iname "*.jpg" -o -iname "*.png" -o -iname "*.gif" \) | wc -l

サーバーリソース診断

CPU・メモリ・ディスクの確認

# リアルタイムリソース監視
top
htop

# メモリ使用状況
free -h

# ディスク使用状況
df -h

# プロセスごとのメモリ使用量
ps aux | grep -E "apache|php|mysql" | awk '{sum+=$6} END {print "Total RSS: " sum/1024 " MB"}'

# MySQLの状態確認
mysqladmin -u root -p status

Apache/Nginxのチューニング

Apache(prefork)の設定例:

# /etc/apache2/mods-available/mpm_prefork.conf
<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      150  # メモリに応じて調整
    MaxConnectionsPerChild 3000
</IfModule>

Nginxの設定例:

# /etc/nginx/nginx.conf
worker_processes auto;
worker_connections 1024;

# Gzip圧縮
gzip on;
gzip_vary on;
gzip_types text/plain text/css text/javascript application/javascript;

# ファイルキャッシュ
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 365d;
    add_header Cache-Control "public, immutable";
}

WordPress本体の最適化

wp-config.phpの最適化設定

// リビジョン制限
define('WP_POST_REVISIONS', 3);

// 自動保存間隔を延長(秒)
define('AUTOSAVE_INTERVAL', 300);

// ゴミ箱自動削除(日)
define('EMPTY_TRASH_DAYS', 7);

// メモリ制限を増やす
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');

// データベースクエリをログ
define('SAVEQUERIES', true);

// 管理画面のメモリ
define('WP_MAX_MEMORY_LIMIT', '256M');

// デバッグ(開発環境のみ)
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY', false);

データベース最適化

# MySQLチューニング(my.cnf)
[mysqld]
query_cache_type = 1
query_cache_size = 32M
query_cache_limit = 2M
tmp_table_size = 64M
max_heap_table_size = 64M
innodb_buffer_pool_size = 256M  # RAMの25-50%

# テーブル最適化
mysqlcheck -u root -p --auto-repair --optimize wordpress_db

# WP-CLIでの最適化
wp db optimize

キャッシュ戦略(最重要)

レベル1:ブラウザキャッシュ

.htaccessに追加:

# ブラウザキャッシュの設定
<IfModule mod_expires.c>
    ExpiresActive On
    
    # 画像
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType image/webp "access plus 1 year"
    
    # CSS/JS
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType text/javascript "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    
    # その他
    ExpiresByType application/pdf "access plus 1 month"
    ExpiresByType font/woff2 "access plus 1 year"
</IfModule>

レベル2:ページキャッシュ

推奨プラグイン(軽い順):

  1. WP Super Cache
wp plugin install wp-super-cache --activate
  1. W3 Total Cache
wp plugin install w3-total-cache --activate
  1. LiteSpeed Cache(LiteSpeedサーバー限定)
wp plugin install litespeed-cache --activate

レベル3:オブジェクトキャッシュ(Redis)

# Redisインストール
sudo apt install redis-server
sudo systemctl enable redis-server

# PHPモジュール
sudo apt install php-redis

# WordPressプラグイン
wp plugin install redis-cache --activate

wp-config.phpに追加:

define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_CACHE_KEY_SALT', 'yourdomain_');

画像最適化

自動圧縮プラグイン

推奨プラグイン:

  1. EWWW Image Optimizer(無料・高機能)
  2. Smush(無料枠あり)
  3. ShortPixel(高圧縮率)

WebP対応

# .htaccessでWebP配信
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_ACCEPT} image/webp
    RewriteCond %{REQUEST_FILENAME} (.*)\.(jpe?g|png)$
    RewriteCond %{REQUEST_FILENAME}.webp -f
    RewriteRule (.+)\.(jpe?g|png)$ %{REQUEST_FILENAME}.webp [T=image/webp,E=accept:1]
</IfModule>

遅延読み込み(Lazy Load)

// functions.phpに追加
add_filter('wp_lazy_loading_enabled', '__return_true');

// または専用プラグイン
// a3 Lazy Load
// Lazy Load by WP Rocket

CDN導入

無料CDNサービス

Cloudflare(最も人気):

  1. cloudflare.comでアカウント作成
  2. ドメイン追加
  3. DNSをCloudflareに変更
  4. 以下を設定:
    • SSL/TLS: Full
    • Caching Level: Standard
    • Browser Cache TTL: 1 month

日本国内CDN

  • JPCDN:日本最適化
  • ImageFlux:画像特化
  • fastly:高速配信

不要データの削除

データベースクリーンアップ

-- リビジョン削除
DELETE FROM wp_posts WHERE post_type = 'revision';

-- 自動下書き削除
DELETE FROM wp_posts WHERE post_status = 'auto-draft';

-- ゴミ箱を空に
DELETE FROM wp_posts WHERE post_status = 'trash';

-- スパムコメント削除
DELETE FROM wp_comments WHERE comment_approved = 'spam';

-- 期限切れトランジェント削除
DELETE FROM wp_options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP();
DELETE FROM wp_options WHERE option_name LIKE '_site_transient_timeout_%' AND option_value < UNIX_TIMESTAMP();

プラグインでの自動化

# WP-Optimizeインストール
wp plugin install wp-optimize --activate

# 定期実行設定可能

高度な最適化

PHPバージョンアップ

# PHP 8.1以上推奨
sudo apt install php8.1 php8.1-fpm php8.1-mysql php8.1-xml php8.1-mbstring

# バージョン確認
php -v

OPcache有効化

; php.ini
[opcache]
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2

データベース移行(大規模サイト)

# MariaDB 10.6+への移行
sudo apt install mariadb-server

# またはMySQL 8.0+
sudo apt install mysql-server-8.0

監視ツール

無料監視ツール

  1. Google PageSpeed Insights
  2. GTmetrix
  3. Pingdom Tools
  4. New Relic(無料枠)

サーバー監視

# 監視スクリプト
#!/bin/bash
# monitor.sh

echo "=== Server Status ==="
echo "CPU Usage:"
top -bn1 | grep "Cpu(s)" | awk '{print $2}'

echo "Memory Usage:"
free -h | grep Mem | awk '{print "Used: " $3 " / Total: " $2}'

echo "MySQL Queries:"
mysqladmin -u root -p processlist | wc -l

echo "Apache Connections:"
netstat -an | grep :80 | wc -l

トラブルシューティング

管理画面だけが重い

// functions.phpに追加
// Heartbeat APIの制限
add_action('init', function() {
    wp_deregister_script('heartbeat');
});

特定ページだけ重い

# Query Monitorで特定
# デバッグバーで詳細確認
wp plugin install debug-bar --activate

緊急時の応急処置

# 全プラグイン無効化
mv wp-content/plugins wp-content/plugins_backup

# キャッシュクリア
rm -rf wp-content/cache/*

# Apache再起動
sudo systemctl restart apache2

# MySQL再起動
sudo systemctl restart mysql

まとめ:優先順位チェックリスト

今すぐやること(効果大):
✅ 不正アクセスのブロック
✅ キャッシュプラグイン導入
✅ 画像最適化
✅ データベース最適化

1週間以内にやること:
✅ CDN導入
✅ 不要プラグイン削除
✅ PHPバージョンアップ

定期メンテナンス:
✅ データベースクリーンアップ
✅ ログ監視
✅ バックアップ


これらの対策を実施すれば、 体感速度が3倍以上改善するはずです!

まずは原因を特定して、 優先順位の高いものから対策していきましょう。


コメント

タイトルとURLをコピーしました