Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Localhost refused to connect on WSL2 when accessed via https://localhost:8000/ but works when using internal WSL IP adress

What I'm Trying to Achieve

To access localhost from my local machine during the development of a Symfony web app.

My Environment
  • WSL2 running on Windows 10
  • Linux, Apache2, MySQL, PHP-7.4 stack (with Xdebug3 intalled)
  • Debian 10
  • Symfony 5.4 (although not sure on if relevant to this problem)
Steps I've Taken
  • Set up WSL2 according to this Microsoft WSL2 tutorial
  • Set up LAMP stack according to this Digital Ocean tutorial
  • Set up Symfony according to this Symfony tutorial
  • Run the following bash script on startup to start my services and set the host to the virtual WSL IP in my xdebug.ini file
#!/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  
  • Run my Symfony project on the development server using symfony serve -d (Symfony then tells me "The Web server is using PHP FPM 7.4.23 https://127.0.0.1:8000")
  • Go to https://localhost:8000/ in Chrome where the app is running
What I Expect to Happen
  • My Symfony web app to be running on https://localhost:8000/ when I visit the URL in my Chrome browser
What Actually Happens
  • I get "This site can't be reached localhost refused to connect." in the Chrome browser
What I've Tried
  • This used to happen less frequently and I would give my laptop a restart, repeat the process above, and I could connect via https://localhost:8000/. However, it refuses to connect more regularly now (like 8/10 times I start up for the day)
  • Connecting to https://127.0.0.1:8000 yields the same result.
  • Connecting to the site using the internal WSL IP address, found using hostname -I and replacing localhost with this IP (still on port 8000). This is an adequate workaround to use my app, however I am unable to interact with my database via MySQL Workbench without having to set up a new connection, therefore a fix where I can use localhost would be very helpful!
  • (Based off comments) Only ran symfony serve -d without starting apache and PHP services separately - still sometimes allows connections to localhost but sometimes doesn't work.
Conclusion

The behaviour is odd as it works sometimes but other times it doesn't when the exact same steps are carried out. I am unsure where else to look for answers and I can't seem to find anything online with this same problem. Please let me know if any config files, etc would be helpful. Thank you so much for your help! :)

like image 975
Lushawn Avatar asked Sep 12 '25 01:09

Lushawn


2 Answers

When it's working normally, as you are clearly aware, the "localhost forwarding" feature of WSL2 means that you can access services running inside WSL2 using the "localhost" address of the Windows host.

Sometimes, however, that feature breaks down. This is known to happen when you either:

  • Hibernate
  • Have the Windows "Fast Startup" feature enabled (and it is the default). Fast Startup is a pseudo-hibernation which triggers the same problem.

Typically the best solution is to disable Hibernation and Fast Startup. However, if you do need these features, you can reset the WSL localhost feature by:

  • Exiting any WSL instances
  • Issuing wsl --shutdown
  • Restarting your instance

It's my experience that localhost forwarding will work after that. However, if it doesn't, thanks to @lwohlhart in the comments for mentioning that another thing to try is disabling IPv6 on WSL2, since (I believe) there's a possibility that the application is listening on IPv6 while the Windows->WSL2 connection localhost connection is being attempted on IPv6.

You can disable IPv6 on WSL2 per this Github comment by creating or editing .wslconfig in your Windows user profile directory with the following:

[wsl2]
kernelCommandLine=ipv6.disable=1

A wsl --shutdown and restart will be necessary to complete the changes.

If you find that this works, it may be possible to solve the issue by making sure to either use the IPv4 (127.0.0.1) or IPv6 (::1) address specifically in place of localhost on the Windows side, or by configuring the service to listen on both addresses.

like image 99
NotTheDr01ds Avatar answered Sep 14 '25 15:09

NotTheDr01ds


You may try "Mirrored Mode" of WSL2

As explained in https://superuser.com/a/1732513

To enable Mirrored mode:

Add the following to your <windows_user_profile>/.wslconfig:

[wsl2]
networkingMode=mirrored

Exit your WSL distribution

Run wsl --shutdown from command prompt then restart WSL

This helped me in the scenario of running my .net core API server on windows which is being access by NextJs Route Handler (running on wsl)

like image 25
Tejasvi Hegde Avatar answered Sep 14 '25 15:09

Tejasvi Hegde