PhpStormでXdebugのリモートデバッグを設定したがwaiting for incoming connection with ide keyのまま動かない場合の対処

QuarkA

今日は雑記のような内容なのですが開発者ブログということで大目にみてもらって。

現在はテレワークの問題もあり、自宅で作業している人も増えていると思います。そこでタイトルのままなのですが、下手にググってはまったので対処をメモしておきます。きっとこれでほとんどの人が解決するのではないかと思います。

サーバーとPC間の通信の問題

リモートのXdebugの設定もちゃんとしてあって、Validateも通っているのにwaiting for incoming connection with ide keyが出てうまくデバッグが動いてくれないならば、たぶん、あなたのPCとサーバー間通信の問題です。

どこかで通信が断絶しています。でもwating…というメッセージをみて、たぶんそれは予測されていますよね。

まずこちらの親切なサイトで、Xdebugのremote debugはサーバーからもあなたのPCに直接アクセスしてコネクションをはる必要があるということを押さえましょう。

多くの人の環境で直接通信は不可能

当然、プロバイダとの契約次第になりますが、多くの人のPC環境では外部からグローバルIPで直接ポートをあけるなんて設定はしていないはずです。従って、そもそもXdebugのリモートデバッグ設定は無理です。

しかし、そのための対処としてsshトンネルという手法が使えます。

sshトンネル(ポートフォワード)を使う

sshトンネル(ポートフォワード)とは、サーバーと自宅PCを通常通信ができるssh(port22)でつなぎ、通信確立後、ローカルPC、サーバー共に任意のポートに転送する仕組みです。こうすることで、途中のルーターやファイアーウォールに邪魔されずにデバッグ通信が可能になります。

ローカルのPCに仮想環境を構築せず、AWSやさくらVPSなどで検証サーバーを構築し、リモートデバッグしたい方は、どうしてもプロバイダ経由のインターネット通信を挟みますから、ほぼこのsshトンネルを使うことになると思います。

sshトンネルの設定方法

詳しい設定方法は下記PhpStormの公式サイトに記載があります。

SSHトンネル経由のリモートデバッグ

macの場合はターミナルで実行します。

ssh -R 127.0.0.1:9000:127.0.0.1:9000 user@example.com

上記コマンドを実行すると、example.comにssh接続され、パスワードを要求されます(パスワード認証の場合)。一旦接続が確立されればトンネルが完成します。

上記コードの意味は、サーバー(example.com)のlocalhost:9000番ポートをローカルPCのlocalhost:9000番ポートに割り当てる(フォワード:転送する)という意味です。2つのポートがssh通信を介してリンクする(同一になる)ようなイメージです。

-RはリモートのRで、下記のようにも書けます。

ssh user@example.com -R localhost:9000:localhost:9000

-Rの後ろは一緒で <サーバーIP>:<転送ポート>:<ローカルIP>:<受信ポート>という構成です。こっちの方がわかりやすいかも知れません。

ポートフォワードについて、詳しくはこの方の記事がわかりやすいと思います。
SSHポートフォワード(SSHトンネル)【ローカル・リモート・ダイナミック総集編】

サーバー側で xdebug.remote_host = localhost などを設定

sshトンネルを設定したら、サーバー側の/etc/php.d/15-xdebug.iniファイル内で下記を設定します。(コンフィグファイルは違う場合もあります)

xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=localhost
xdebug.remote_port=9000

上記により、サーバー側にアクセスがあるとデバッグセッションが始まります。その時サーバーはlocalhost(自分)の9000番ポートに接続します。そうすると、sshトンネルを介してあなたのPCの9000番ポートにそのまま情報が届きます。

PhpStormが正しく設定されていれば、その9000番ポートを待ち受けているはずですので、デバッグセッションが正しく開始されると思います。

それでもダメならファイアウォールなどを疑いましょう。有名な通信パケット閲覧ソフトであるWIRE SHARKを使えば、どんな通信が届いているのか確認できますので、トラブルシューティングに役立つと思います。

以上、今日は細かい話ですが、共有でした。