ローカルホストは、https://localhost:8000/ 経由でアクセスすると WSL2 への接続を拒否しますが、内部 WSL IP アドレスを使用すると機能します。質問する

ローカルホストは、https://localhost:8000/ 経由でアクセスすると WSL2 への接続を拒否しますが、内部 WSL IP アドレスを使用すると機能します。質問する
私が達成しようとしていること

Symfony Web アプリの開発中に、ローカル マシンから localhost にアクセスします。

私の環境
  • Windows 10 で動作する WSL2
  • Linux、Apache2、MySQL、PHP-7.4 スタック (Xdebug3 がインストール済み)
  • デビアン10
  • Symfony 5.4 (ただし、この問題に関連しているかどうかは不明)
私がとったステップ
#!/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 -Ilocalhost をこの IP に置き換えて使用しています (ポート 8000 のまま)。これはアプリを使用するための適切な回避策ですが、新しい接続を設定せずに MySQL Workbench 経由でデータベースとやり取りすることはできません。そのため、localhost を使用できる修正が非常に役立ちます。
  • (コメントに基づく) symfony serve -dApache と 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 ( ) アドレスを明示的に使用するか、両方のアドレスをリッスンするようにサービスを構成することで、問題を解決できる可能性があります。::1localhost

おすすめ記事