TL;DR: すぐに試せる応急処置
急いでいる場合は、タイムアウト制限を引き上げることでサーバーに余裕を持たせることができます。テーマの functions.php または機能プラグインに以下のスニペットを追加し、デフォルトの5秒から30秒に延長してください:
add_filter('http_request_args', function($args, $url) {
$args['timeout'] = 30;
return $args;
}, 10, 2);
これは通常、より深い問題を隠しているだけに過ぎないことに注意してください。エラーは止まりますが、設定ミスのファイアウォールや低速なDNSリゾルバーが修正されるわけではありません。
なぜWordPressでcURL error 28が発生するのか
WordPressは正常に動作するために、自分自身と通信する必要があります。wp-cron.php のようなバックグラウンドタスクの実行や、REST APIエンドポイントの検証には「ループバックリクエスト(Loopback Requests)」を使用します。cURL error 28 が表示される場合、それはWordPressが自身のURLにリクエストを送信し、レスポンスを待ったものの、デフォルトの制限時間である10秒以内に応答がなく、最終的にタイムアウトしたことを意味します。
これは単なる見た目上のバグではありません。ループバックの失敗は、予約投稿の公開を妨げ、ブロックエディターの自動保存機能を壊し、さらには一部のWooCommerceの配送連携をクラッシュさせる可能性さえあります。
一般的な根本原因
- **ファイアウォールの過剰なブロック:** UFWやIPTablesなどのツールが、サーバー自身のパブリックIPアドレスへの接続をブロックしている可能性があります。
- **セキュリティプラグインの干渉:** WordfenceやNinjaFirewallなどの強力なプラグインが、これらの内部的な通信をボットによる攻撃と誤認している可能性があります。
- **DNSループ:** サーバーが自身のドメイン名を解決できず、リクエストが無期限にハングアップしている可能性があります。
- **サーバーのリソース枯渇:** CPU使用率が100%に達していたり、メモリが不足していたりすると、PHP-FPMが時間内にリクエストを処理する余裕がなくなります。
- **古いライブラリ:** 古いバージョンのcURL(7.50未満)やOpenSSLを使用していると、SSLハンドシェイク中に大幅な遅延が発生することがあります。
ステップバイステップの修正方法
1. ファイアウォールを開放する
VPS環境では、ファイアウォールが原因である可能性が最も高いです。サーバーがポート80および443で自身と通信できることを確認する必要があります。Ubuntuで UFW を使用している場合は、まずパブリックIPを特定し、それをホワイトリストに登録します:
# サーバーのパブリックIPを確認
curl -4 icanhazip.com
# 自身のIPをホワイトリストに追加(1.2.3.4 を実際のIPに置き換えてください)
sudo ufw allow from 1.2.3.4
マネージドホスティングを利用している場合は、このステップをスキップして、サポートに「ローカルIPのループバック接続を有効にしてほしい」と依頼してください。
2. DNSの「自己認識」を修正する
サーバーが自分の場所を把握していないことがあります。サーバーにSSHでログインし、自身のサイトにアクセスを試みてテストしてください:
ping yourdomain.com
pingがハングアップしたり、「Destination Host Unreachable」エラーが返されたりする場合は、ローカルマップを強制的に設定できます。hostsファイルを編集し、ドメインをローカルのループバックアドレスに直接指定してください:
sudo nano /etc/hosts
# 最下部に追加
127.0.0.1 yourdomain.com
3. プラグインを監査する
セキュリティプラグインやキャッシュプラグインが、これらのリクエストに干渉していることがよくあります。競合を見つけるには:
- WordfenceやAll In One WP Securityなどのセキュリティスイートを一時的に無効にします。
- オブジェクトキャッシュ(Redis/Memcached)を使用している場合はクリアしてください。古いキャッシュエントリがリクエストをループに陥らせることがあります。
- 「サイトヘルス」を再読み込みしてください。エラーが消えた場合は競合が見つかったことになり、そのプラグインの内部ファイアウォール設定を調整する必要があります。
4. ライブラリのアップデートを強制する
Ubuntu 18.04やCentOS 7は、最新のTLS 1.3ハンドシェイクに苦戦する古いバージョンのcURLを搭載していることで有名です。以下のコマンドを実行して、スタックを最新の状態にします:
# Ubuntu/Debianの場合
sudo apt update && sudo apt install --only-upgrade curl openssl php-curl
# CentOS/RHELの場合
sudo yum update curl openssl
サービスの再起動を忘れないでください:sudo systemctl restart nginx php8.1-fpm(バージョンは自身の環境に合わせて調整してください)。
5. ModSecurityを調査する
ModSecurityは強力なウェブアプリケーションファイアウォール(WAF)ですが、しばしば攻撃的すぎることがあります。デフォルトで WordPress/X.X User-Agentをブロックしている可能性があります。/var/log/nginx/error.log のログを詳しく調べてください。サイトヘルスの実行時に 403 Forbidden や 406 Not Acceptable エラーが表示される場合は、サーバーのIPに対してホワイトリストルールを作成する必要があります。
修正を確認する方法
- WordPressダッシュボードに移動します。
- **ツール > サイトヘルス** に移動します。
- 分析が終わるまで待ちます。
- **合格したテスト** を確認します。「REST APIは利用可能です」と「サイトはループバックリクエストを実行できます」に緑色のチェックマークが表示されていれば成功です。
まだ解決しませんか? wp-config.php に WP_PROXY_HOST の設定がないか確認してください。サーバーがプロキシの背後にある場合、WordPressはcURLコールを正しくルーティングするためにその情報を知る必要があります。
参考資料
- [公式サイトヘルスガイド](https://wordpress.org/documentation/article/site-health-screen/)
- [PHP cURL トラブルシューティング](https://www.php.net/manual/en/book.curl.php)
- [WordPress REST API ドキュメント](https://developer.wordpress.org/rest-api/)

