How to setup PHP server (nextcloud) or python server or node js on WSL2 inside Windows10 (Build 18980) with remote debugging on VS Code using Extensions.

For ex: PHP Debug 1.13.0 extension is the XDebug adapter inside VSCode



Windows Subsystem for Linux is aimed to be a Linux (POSIX like runtime environment inside Windows10) In WSL1 it is a redirection of OS calls to underlying OS In WSL2 it is a Linux kernel , acting a VM inside hosting OS (W10) , localhost on Win10 redirects on the internal VNET address

Xdebug and VSCode

Please refer to this post on Nextcloud Debugging

Dynamic IP for WSL2 - Windows10 network bridge

to connect to the Windows hosted (inside VS Code) XDebug server , PHP server (php-fpm10) must contact the hosting windows. The IP is the nameserver inside /etc/resolv.conf

gui@SAGIS-09:~$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false

By default with a untouched php.ini setup , the log contains:

[11583] Log closed at 2019-09-17 14:54:46
[11583] E: Could not connect to client. :-(
[11583] W: Creating socket for '', poll success, but error: Operation now in progress (29).
[11583] I: Connecting to configured address/port:
[11583] Log opened at 2019-09-17 14:54:46

The solution is to configure php-fpm to get xdebug listening on bridge IP / windows side instead on localhost

gui@SAGIS-09:/$ sudo vi /etc/php/7.3/fpm/php.ini
xdebug.remote_log = /var/log/xdebug.log

Windows Defender and XDebug sockets

It could be mandatory to open firewall on windows 10

Xdebug could log this:

[11682] Log closed at 2019-09-17 14:57:03
[11682] E: Time-out connecting to client (Waited: 200 ms). :-(
[11678] I: Connecting to configured address/port:
[11678] Log opened at 2019-09-17 14:57:01

It is possible due to Firewall blocking VS Code , Xdebug server. So authorize program: code.exe to listen into Private

For other IDE , it could be time-saving to know what is the program:

Powershell command gives the Program listening on port 9009

Get-Process -Id (Get-NetTCPConnection -LocalPort 9009).OwningProcess

Dev workstation side (VS Code on windows10)

Because WSL2 is boxed, XDebug inside VS Code must listen on instead of default localhost. Open the configurations on DEBUG / PHP (the launch.json file)

    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit:
    "version": "0.2.0",
    "configurations": [
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "hostname": "", 
            "port": 9009,
            // server -> local
                "/var/www/html": "${workspaceRoot}/www",
//                "/app": "${workspaceRoot}/app",
                "/home/gui/nc": "${workspaceRoot}",
                "/apps": "${workspaceRoot}/apps",
                "/custom_apps": "${workspaceRoot}/custom_apps"                
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "hostname": "", 
            "port": 9009

Listening on the external public IP

PORT RELAY / PROXY of Windows 10 on WSL2 (internal VNET)

A server listening inside WLS2 could be accessed by localhost on Win10. https://localhost would bridge to the dynamic VNET IP address inside WSL2.

For being able to redirect external IP to this internal dynamic VNET IP address, Win10 provides Port Proxy :


netsh interface portproxy add v4tov4 listenaddress=<ip or dns> listenport=80 connectaddress=localhost connectport=80
netsh interface portproxy show all

Écouter sur ipv4 :             Connecter à ipv4 :

Adresse         Port        Adresse         Port
--------------- ----------  --------------- ----------
<ip or dns>             80          localhost       80

Remove the port proxy

netsh interface portproxy delete v4tov4 listenaddress=<ip> listenport=9000

more info: Docs from Microsoft