【Xdebug】Windows 7のVagrant でリモートデバッグできない問題
初詣は1/4に川崎大師に行きましたが、人の多さを考えると1月下旬がよかったかな、といまさら思っているtanakaです。
Vagrant 活用してますか?いくつかのプロジェクトで導入しているもののまだまだ落とし穴があるな、と感じています。こういうフェーズで必要なのは積極的に罠を踏みにいく姿勢だと思います。今日はVagrant(VirtualBox)上のPHP開発環境でXdebugを使ったリモートデバッグがうまくできず試行錯誤して解決した方法をご紹介します。
結論
Windows 7のVagrantでXdebugを使ったリモートデバッグできない問題ですが、 いきなり結論をいうとWindowsファイアウォールでデバッグ用接続がブロックされてたのが問題でした。 以下、解決までにいろいろ試したことをご紹介します。 ちなみに同じ現象をWindows 8.1(Surface Pro 3)で試しても問題は発生しませんでした。
検証環境
- Windows 7 Professional 64bit
- Vagrant 1.7.2
- VirtualBox 4.3.20
- PhpStorm 8.0.2
- IPはホストOSが192.168.33.1, ゲストOSが192.168.33.10
まえがき
PHPStorm + Vagrant でのリモートデバッグの設定方法についてはPhpStorm から Vagrant VM の PHP アプリケーションをリモートデバッグする(Web & CLI) - Shin x blogでとても丁寧に解説されています。リモートデバッグが実現できる仕組みも解説してあるので自己解決するためには必読だと思います。この手順はWindowsでも一緒ですが、いざリモートデバッグを開始すると、IDEでブレークしませんし、ブラウザでのページ読み込みがずっと終わらない状態になりました。
Wiresharkでパケットを確認する
とりあえず、ホストOS(Windows)にパケットが届いてるのか確認しました。
上記の画像はネットワークインターフェイスでVirtualBox Host Only Networkをキャプチャした結果です。 No.37はHTTP Request,No38はそれに対するACKパケット(パケット受け取ったよ、という応答)でNo.39,42,43はゲストOSからホストOSの9000番ポートに届いたパケットであると読み取れます。(No42,43は、ACKパケットがこなかったから再送されたパケット)
上記の調査結果から、デバッグ用パケットが9000番に届いているので、問題の原因はホストOS側にありそうだと思いました。
Windows ファイアウォールの受信規則を追加する
社内サーバでリモートデバッグしてたときはこんなトラブル起きなかったのにVagrantだとなぜ起きるのかネットワークの設定を調べました。
その結果、ネットワークインターフェイスごとにWindowsファイアウォールのプロファイルが違っていて、社内サーバでは「ドメインネットワークもしくはプライベートネットワーク」のプロファイルが適用され、VirtualBox Host Only Networkでは「パブリックネットワーク」のプロファイルが適用されていることがわかりました。パブリックネットワークでは外部からの接続が厳しく制限されているようです。参考: Windows 7新時代:第9回 Windows 7のファイアウォール機能 (2/4) - @IT
今回は、192.168.33.0/24 から9000番ポートで受信するパケットを通すようにしてリモートデバッグできるようにします。まず、スタートメニューの「プログラムとファイルの検索」に「ファイアウォール」と入力します。すると「セキュリティが強化された Windows ファイアウォール」という項目がヒットしますので、それを選択します。
左サイドバーで「受信の規則」を選択後、右側のサイドバーで「新しい規則」を選択します。 ウィザード形式で規則を作成するウインドウが表示されますので、以下のように設定します。
- 規則の種類: カスタム
- プログラム: すべてのプログラム を選択します。 会社PCだとあまりないと思いますが、公衆無線LANに接続する可能性がある場合は「このプログラムのパス」を選択し、パケットを受け取るプログラムを限定しておいた方がよいです。
- プロトコルおよびポート
- プロトコルの種類: TCP
- ローカルポート: 「 特定のポート 」にして、下のテキストフィールドに「 9000 」と入力します。
- リモートポート: 「 すべてのポート 」にします。
- スコープ
- 画面下の方の「この規則を適用するリモートIPアドレスを選択してください」で「 これらのIPアドレス 」を選択、右側の追加ボタンが有効になるのでクリックし、表示されるダイアログで「 このIPアドレスまたはサブネット 」に 「 192.168.33.0/24 」と入力します。
- 操作: 「 接続を許可する 」がチェックされた状態にします。
- プロファイル: 「 パブリック 」のみをチェックし残りははずします。
- 名前: 「 Xdebugリモートデバッグ 」と入力します。
以上で完了ボタンを押します。ブレーク行を設定してスクリプト再読込するとリモートデバッグを開始することができるのではないかと思います。
あとがき
開発環境(Vagrantに限らず)を快適に保つために積極的に罠を踏んでいきましょう!