最近、WordPressのJetpack連携が頻繁に切断されるようになり、Twitter(X)への自動共有などが機能しなくなっていました。
原因を調査したところ、Nginx側でのセキュリティ設定とプロキシヘッダーの不足に問題があることが判明しました。同様の環境(Nginx + PHP-FPM)でJetpackの接続に苦労している方向けに、対策をメモしておきます。
1. JetpackのIPアドレス変更に伴う「xmlrpc.php」の許可リスト更新
セキュリティ上の理由から、攻撃対象になりやすい xmlrpc.php へのアクセスをJetpackのサーバーからのみ許可するように制限していましたが、Jetpack側のIPアドレスが変更されていたことが原因でアクセス拒否(403等)が発生していました。
公式のIPアドレスリストを確認し、Nginxの geo ブロックを以下のように更新しました。
geo $remote_addr $allowd_IP {
default no;
# 新しいJetpack IPアドレスリスト(2022年時点)
122.248.245.244/32 yes;
54.217.201.243/32 yes;
54.232.116.4/32 yes;
192.0.80.0/20 yes;
192.0.96.0/20 yes;
192.0.112.0/20 yes;
195.234.108.0/22 yes;
# ループバックおよび自分自身
127.0.0.1 yes;
::1 yes;
}なお、Nginxの map モジュールではネットマスク(CIDR)による範囲指定が難しいため、私は GeoIP2 を組み合わせて管理しています。GeoIPからGeoIP2への移行については、こちらの過去記事を参考にしてください。
2. サイトヘルスで「想定外のサーバーポート値」エラーが出る対策
IPアドレスを許可しても接続が不安定な場合、WordPressの「ツール」→「サイトヘルス」を確認してみてください。Jetpackに関連して以下のエラーが出ていることがあります。
*** is not connected.: 200 Jetpack Jetpack サポートにお問い合わせください。 想定外のサーバーポート値です。Jetpack お使いの wp-config.php ファイルに次の記述を追加してみてください。define("JETPACK_SIGNATURE__HTTPS_PORT", **** );
これは、Nginxをリバースプロキシとして使用している際、バックエンドのPHP-FPMに正しいポート情報が伝わっていないために発生する署名検証のエラーです。
wp-config.php に定数を追加する方法もありますが、Nginx側の設定で X-Forwarded-Port を渡すようにするのがスマートです。
Nginxの設定変更
サーバーブロック( server { ... } )内のプロキシ設定箇所に、以下の1行を追記します。
server {
...
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 以下の1行を追加してポート情報を渡す
proxy_set_header X-Forwarded-Port $server_port;
...
}設定反映後、Nginxを再起動( systemctl restart nginx )してください。
接続確認とまとめ
設定完了後、Jetpack デバッグツールに自サイトのURLを入力し、すべてのチェックがパスすることを確認しました。
これまで「なぜか毎回再認証を求められるな……」と不思議に思っていたのですが、これらの設定を正しく行うことで接続が非常に安定するようになりました。同じ不具合でお困りの方は、ぜひNginxのヘッダー設定を見直してみてください。