PhpStorm と Xdebug で AWS EC2 上の PHP をリモートデバッグする
PhpStorm と Xdebug を使って EC2 上の PHP アプリケーションをリモートデバッグする方法を、サーバー側の php.ini の設定から IDE のパスマッピングまで解説します。
PhpStorm と Xdebug によるリモートデバッグは、EC2 のステージング環境など、リモート環境でしか発生しない問題を調査する際に役立ちます。
パフォーマンスやセキュリティ上の問題を避けるため、本番環境で直接デバッグすることは避けてください。
構成
ブラウザーからのリクエストは、開発マシンから EC2 インスタンス上の Apache と PHP へ送られます。PHP の実行時に、Xdebug は反対方向の別の接続を開始し、TCP ポート 9000 を使って EC2 から PhpStorm へデバッグ情報を送ります。開発マシンがルーターの内側にある場合は、この着信接続を PhpStorm が動作するマシンへ転送する必要があります。
サーバー側の設定
php.ini ファイルに以下の Xdebug 設定を追加します。拡張機能のパスは Remi リポジトリからインストールした PHP 7.1 向けの例なので、対象環境に合わせて読み替えてください。
[xdebug]zend_extension="/opt/remi/php71/root/usr/lib64/php/modules/xdebug.so"xdebug.remote_enable = 1xdebug.remote_connect_back = 1xdebug.remote_host = "127.0.0.1"xdebug.idekey = "IDE_KEY"xdebug.remote_autostart=true変更を反映するため、Apache を再起動します。
sudo service httpd restartPhpStorm の設定
PhpStorm で Run > Edit Configurations... を開き、PHP Remote Debug を選択します。

Servers をクリックし、以下の設定で対象サーバーを追加します。
- Name: リモートホストのプライベート IP
- Host: リモートホストのパブリック IP
- Debugger: Xdebug
- Use path mappings: ON
- Absolute path:
/var/www/html/<YOUR_WEB_APP_ROOT>
パスマッピングはリモート側のパスと正確に一致させる必要があります。一致していない場合、接続には成功しても PhpStorm がブレークポイントで停止しません。

php.ini の xdebug.idekey で定義した IDE キーを設定します。

ポートフォワーディング
ローカルマシンがネットワークルーターの内側にある場合は、ポート 9000 への着信接続を許可し、ローカルマシンへ転送するようにポートフォワーディングを設定します。
デバッグの実行
- PHP コードの任意の位置にブレークポイントを設置する。
- PhpStorm で Listen for PHP Debug Connections モードを有効にする。
- リモートサーバーにアクセスする。
ブレークポイントに到達すると PhpStorm が実行を一時停止し、コードを確認しながらデバッグできます。

まとめ
EC2 インスタンスに Xdebug をセットアップし、PhpStorm で Remote Debug を設定すると、リモートのステージングサーバー上で動作する PHP コードにも、ローカルと同じようにブレークポイントを設定してステップ実行できます。重要なのは、xdebug.idekey の値を PhpStorm に設定した IDE キーと一致させることと、絶対パスマッピングで EC2 インスタンス上の正確な Web ルートを指定することです。
xdebug.remote_connect_back = 1 を設定すると、ローカル IP アドレスを固定しなくても Xdebug から IDE に接続できます。そのため、開発マシンを複数のネットワークで使用する場合に便利です。
ブレークポイントで停止しない場合は、まずパスマッピングを確認してください。また、デバッグセッションが終わったら xdebug.remote_autostart を無効に戻します。
Related posts
Session Manager で EC2 に接続する(SSH 不要)
Systems Manager の Session Manager を使い、SSH キーも踏み台サーバーもポート 22 の開放も不要な状態で EC2 インスタンスにシェルアクセスする方法を解説します。
SSH ポートフォワーディングで EC2 Windows インスタンスに安全にアクセスする
プライベートサブネット内の EC2 Windows インスタンスに SSH 踏み台ホスト経由でアクセスし、RDP をパブリックインターネットに公開しない方法を解説します。
EC2 上で Proxy.py を軽量 HTTP プロキシとして動かす
認証機構を持たない Proxy.py を EC2 インスタンス上で動かし、SSH トンネル経由で安全にアクセスします。
Cognito User Pools と OIDC で Slack サインインを実装する
Cognito user pool を OIDC 経由で Slack と連携させ、"Sign in with Slack" を Amplify で Next.js アプリケーションに組み込みます。
Lambda Web Adapter で FastAPI を AWS Lambda にデプロイする
FastAPI で書いた API バックエンドをコンテナ化し、Lambda Web Adapter と AWS CDK を使って単一の Lambda 関数へデプロイします。
