2026年7月9日
2026年7月9日
WordPressのマイクロサービス化とは?現実的な分割の進め方と判断基準
WordPressで「マイクロサービス化」と呼ばれる取り組みの多くは、WordPress本体を細かいサービスに分解することではなく、表示側を切り離すヘッドレス化か、検索・メディア・定期処理など負荷や役割の大きい部分を外部のサービスに切り出すことを指します。WordPressは1つのPHPアプリケーションとデータベースで動く設計なので、無理に分解すると運用の手間だけが増えがちです。この記事では、分割すべきかどうかの判断基準と、効果の出やすい順に段階的に切り出す方法を説明します。
最初に整理しておきたいこと
マイクロサービスアーキテクチャは、独立してデプロイ・拡張できる小さなサービスを、APIでつないでシステムを組み立てる考え方です。大きな開発組織で、チームごとに別々の速度で機能を出したい場合に効果を発揮します。一方で、サービス間の通信、認証、障害時の切り分け、監視の仕組みが必要になり、小規模なチームにとっては負担が大きくなります。
WordPressの場合、投稿・ユーザー・オプション・プラグインのデータが1つのデータベースを共有し、プラグインはフックで互いの処理に入り込みます。この仕組みがWordPressの拡張性の源ですが、裏を返せば「ユーザー管理だけ別サービスにする」といった分解は、既存のプラグインの多くが動かなくなることを意味します。
そのため、WordPressでの現実的な選択肢は次の3つに整理できます。
- 表示側の分離(ヘッドレス化):WordPressは管理画面とAPIだけを担当し、表示はNext.jsなどの別アプリケーションが行う
- 機能の切り出し:検索、メディア配信、メール送信、定期処理、重いバッチ処理を外部サービスや別プロセスに任せる
- インフラの分離:Webサーバー、PHP、データベース、キャッシュを別々のコンテナやサーバーに分け、それぞれを拡張できるようにする
3つ目はマイクロサービスではなく構成の分離ですが、「スケールしにくい」という悩みの多くはここで解決します。
分割を検討すべきかの判断基準
分割の前に、今の課題が本当に構成の問題なのかを確かめます。表示が遅い、アクセスが集中すると落ちるといった悩みは、ページキャッシュ、オブジェクトキャッシュ(Redisなど)、CDN、PHP-FPMとデータベースの調整で改善することが多く、こちらのほうが費用も手間もはるかに少なく済みます。
次のような状況なら、分割を検討する価値があります。
- Webサイトに加えて、スマートフォンアプリや別のサービスにも同じコンテンツを配信したい
- 表示側をReactなどで作り込みたいフロントエンド担当と、記事を書く編集担当が分かれている
- サイト内検索が遅く、データベースの検索クエリが負荷の大部分を占めている
- 画像や動画の量が多く、サーバーのディスクと転送量が限界に近い
- 定期処理や外部連携の重い処理が、訪問者へのページ表示を遅くしている
反対に、少人数で運用している、テーマとプラグインの組み合わせで機能を作っている、表示の見た目を管理画面から編集者が変えたい、という場合は、分割で得られるものより失うもののほうが大きくなりやすいと考えてください。
段階1:定期処理とメール送信を切り離す
最も手軽で効果が分かりやすいのが、WP-Cronの切り離しです。WP-Cronは標準では訪問者のアクセスをきっかけに動くため、重い定期処理があるとその訪問者の表示が遅くなり、アクセスが少ない時間帯には予定どおりに動きません。サーバーのcronから実行するように変えると、表示と定期処理を分けられます。
// wp-config.php("That's all, stop editing!" の行より上に追記)
define( 'DISABLE_WP_CRON', true );
# crontab -e で Webサーバーの実行ユーザーに登録(5分ごと)
*/5 * * * * cd /var/www/html && /usr/local/bin/wp cron event run --due-now --quiet
wp コマンドのパスとWordPressの設置場所は環境に合わせて変えてください。設定後は wp cron event list で次回の実行予定が進んでいるかを確認します。cronの登録を忘れたまま DISABLE_WP_CRON だけを設定すると、予約投稿や自動更新が止まる点に注意が必要です。
メール送信も、サーバーから直接送るのではなく、SMTPリレーやメール配信サービスのAPIに任せると、到達率が上がり、送信処理の失敗も追いやすくなります。
段階2:メディアと検索を外部サービスに任せる
画像や動画は、オブジェクトストレージ(Amazon S3など)とCDNに置くと、WordPressのサーバーは配信の負荷から解放されます。この連携は専用のプラグインで実現するのが一般的で、アップロード時にストレージへ転送し、記事内のURLをCDNのものに置き換えます。導入前には、既存のメディアの移行方法と、プラグインを外したときにURLがどうなるかを確認しておきます。
サイト内検索は、Elasticsearch や OpenSearch などの検索エンジンに切り出すと、記事数が多いサイトでも速く、表記ゆれに強い検索ができます。WordPressとの連携には ElasticPress のような専用プラグインがあり、投稿の保存時に検索エンジン側のデータも更新されます。検索エンジンは別途サーバーやマネージドサービスの費用と運用が必要になる点を踏まえて判断します(費用や対応バージョンは2026年10月現在の各サービスの案内で確認してください)。
段階3:外部サービスへの通知はWebフックで疎結合にする
記事の公開をきっかけに、別のシステム(静的サイトの再生成、通知、外部データベースへの同期など)を動かしたい場合は、WordPressから処理を直接実行するのではなく、Webフックで通知だけを送ります。受け取る側が止まっていても、WordPressの投稿操作が巻き込まれないようにするためです。
<?php
// mu-plugins/publish-webhook.php
defined( 'ABSPATH' ) || exit;
add_action( 'transition_post_status', function ( $new_status, $old_status, $post ) {
if ( 'publish' !== $new_status || 'post' !== $post->post_type ) {
return;
}
if ( wp_is_post_revision( $post ) || wp_is_post_autosave( $post ) ) {
return;
}
if ( ! defined( 'WEBHOOK_SECRET' ) ) {
return; // 共有鍵が未設定なら送らない
}
$body = wp_json_encode( array(
'id' => $post->ID,
'status' => $new_status,
'url' => get_permalink( $post ),
) );
wp_remote_post( 'https://hooks.example.com/wp-publish', array(
'headers' => array(
'Content-Type' => 'application/json',
// 受信側で検証する署名。共有鍵は wp-config.php で定数として定義しておく
'X-Signature' => hash_hmac( 'sha256', $body, WEBHOOK_SECRET ),
),
'body' => $body,
'timeout' => 3,
'blocking' => false,
) );
}, 10, 3 );
transition_post_status は新規公開だけでなく、公開済みの記事を更新したとき(公開から公開への遷移)にも呼ばれます。新規公開だけを通知したい場合は、条件に 'publish' === $old_status なら戻る処理を加えます。blocking を false にすると、WordPressは応答を待たずに次の処理へ進むため、受信側が遅くても投稿画面が待たされません。その代わり送信の成否は分からないため、取りこぼしが許されない連携では、受信側で定期的にREST APIから差分を取り直す仕組みを併用します。署名用の WEBHOOK_SECRET は define( 'WEBHOOK_SECRET', 'your-webhook-secret' ); のように wp-config.php で定義し、実際には推測されにくい長い値にします。
段階4:ヘッドレス化で表示を分離する
表示側を別のアプリケーションにする場合、WordPressは標準のREST API(/wp-json/wp/v2/)か、WPGraphQLプラグインによるGraphQL APIでコンテンツを提供します。表示側からの書き込みや非公開データの取得が必要な場合は、WordPress 5.6で追加されたアプリケーションパスワードを使って認証できます。権限は必要最小限のユーザーに発行してください。
ヘッドレス化では、WordPressのテーマやプラグインが担っていた次の機能を、表示側で作り直すことになります。移行の見積もりでは、ここを見落とさないことが重要です。
- 下書きのプレビュー(編集者が公開前に見た目を確認する仕組み)
- SEOのメタ情報、構造化データ、XMLサイトマップ、リダイレクト
- フォーム、コメント、検索、会員機能など、プラグインが画面を出力していた機能
- 記事の更新を表示側に反映する仕組み(再生成やキャッシュの破棄)
いきなり全体を移すのではなく、新しい特集ページだけを表示側アプリケーションで作り、残りは従来のWordPressのまま表示する、という置き換え方が安全です。リバースプロキシで特定のパスだけを新しいアプリケーションに振り分ければ、問題が起きたときに元に戻しやすくなります。この「少しずつ置き換える」進め方は、ストラングラーパターンと呼ばれます。
移行で失敗しないための準備
どの段階でも、作業前には本番のデータベースとファイルのバックアップを取り、ステージング環境で試してから本番に適用します。加えて、次の点を準備しておくと、分割後の運用で困りにくくなります。
- 各サービスの死活監視とエラーログの集約(どこで止まったかを一か所で追えるようにする)
- サービス間の認証情報を、コードではなく環境変数や秘密情報の管理機能に置く
- 切り出したサービスが止まったときの、WordPress側の振る舞い(検索だけ標準検索に戻すなど)を決めておく
- 分割前と後で、表示速度やサーバー負荷を同じ方法で計測して効果を確かめる
まとめ
- WordPressの「マイクロサービス化」は、本体の分解ではなく、ヘッドレス化か一部機能の切り出しを指すことが多い
- 遅さや負荷の悩みは、キャッシュやサーバー調整で解決することが多い。分割は目的が明確なときに検討する
- 効果の出やすい順に、WP-Cronとメール、メディアと検索、Webフックによる外部連携、表示側の分離と段階的に進める
- ヘッドレス化ではプレビュー、SEO、フォームなどを作り直す必要がある。特定のページから少しずつ置き換える
- どの段階でもバックアップとステージングでの検証を行い、監視と障害時の振る舞いを先に決めておく