私が達成しようとしていること
Symfony Web アプリの開発中に、ローカル マシンから localhost にアクセスします。
私の環境
- Windows 10 で動作する WSL2
- Linux、Apache2、MySQL、PHP-7.4 スタック (Xdebug3 がインストール済み)
- デビアン10
- Symfony 5.4 (ただし、この問題に関連しているかどうかは不明)
私がとったステップ
- これに従ってWSL2を設定するMicrosoft WSL2 チュートリアル
- これに従ってLAMPスタックを設定するデジタルオーシャンチュートリアル
- これに従ってSymfonyを設定しますSymfony チュートリアル
- 起動時に次のbashスクリプトを実行してサービスを開始し、xdebug.iniファイルでホストを仮想WSL IPに設定します。
#!/bin/sh
REMOTEIP=`cat /etc/resolv.conf | grep nameserver | sed 's/nameserver\s//'`
sed -i -E "s/client_host=[0-9\.]+/client_host=$REMOTEIP/g" /etc/php/7.4/mods-available/xdebug.ini
service php7.4-fpm start
service apache2 start
service mysql start
- 開発サーバーでSymfonyプロジェクトを実行します
symfony serve -d
(Symfonyは「WebサーバーはPHP FPM 7.4.23を使用しています」と表示します。https://127.0.0.1:8000") - アプリが動作しているChromeでhttps://localhost:8000/にアクセスします。
私が期待していること
- ChromeブラウザでURLにアクセスすると、Symfonyウェブアプリがhttps://localhost:8000/で実行される
実際に何が起こるか
- Chrome ブラウザで「このサイトにアクセスできません。localhost が接続を拒否しました。」というメッセージが表示される
私が試したこと
- 以前は、このようなことはそれほど頻繁には起こらず、ラップトップを再起動して上記の手順を繰り返すと、https://localhost:8000/ 経由で接続できました。しかし、今では頻繁に接続を拒否するようになりました (1 日に起動する 10 回のうち 8 回程度)。
- 接続中https://127.0.0.1:8000同じ結果が得られます。
- 内部 WSL IP アドレスを使用してサイトに接続し、
hostname -I
localhost をこの IP に置き換えて使用しています (ポート 8000 のまま)。これはアプリを使用するための適切な回避策ですが、新しい接続を設定せずに MySQL Workbench 経由でデータベースとやり取りすることはできません。そのため、localhost を使用できる修正が非常に役立ちます。 - (コメントに基づく)
symfony serve -d
Apache と PHP サービスを個別に起動せずにのみ実行しました - ローカルホストへの接続が許可される場合もあれば、機能しない場合もあります。
結論
まったく同じ手順を実行しても、うまくいくときもあればうまくいかないときもあるので、動作が奇妙です。他にどこで答えを探せばいいのかわかりませんし、同じ問題に関するオンラインの情報も見つからないようです。設定ファイルなどが役立つかどうか教えてください。ご協力ありがとうございます! :)
ベストアンサー1
正常に動作している場合、ご存じのとおり、WSL2 の「localhost 転送」機能により、Windows ホストの「localhost」アドレスを使用して、WSL2 内で実行されているサービスにアクセスできます。
ただし、その機能が機能しなくなる場合もあります。これは、次のいずれかの場合に発生することが知られています。
- 休止状態
- Windows の「高速スタートアップ」機能を有効にします (これがデフォルトです)。高速スタートアップは疑似休止状態であり、同じ問題を引き起こします。
通常、最善の解決策は、休止状態と高速スタートアップを無効にすることです。ただし、これらの機能が必要な場合は、次の方法で WSL ローカルホスト機能をリセットできます。
- WSLインスタンスを終了する
- 発行
wsl --shutdown
- インスタンスの再起動
私の経験では、その後はlocalhost転送が機能するはずです。しかし、もし機能しない場合は、フォローコメントで、WSL2 で IPv6 を無効にすることも試してみる必要があると述べられています。これは、Windows -> WSL2 接続が IPv6localhost
で試行されている間に、アプリケーションが IPv6 でリッスンしている可能性があるからです (と私は考えています)。
WSL2でIPv6を無効にするには、このGithubコメント作成または編集することで.wslconfig
あなたのウィンドウズユーザープロファイルディレクトリ以下の通り:
[wsl2]
kernelCommandLine=ipv6.disable=1
wsl --shutdown
変更を完了するには、再起動が必要になります。
これが機能する場合は、Windows 側で の代わりにIPv4 ( 127.0.0.1
) または IPv6 ( ) アドレスを明示的に使用するか、両方のアドレスをリッスンするようにサービスを構成することで、問題を解決できる可能性があります。::1
localhost