Держать Linux-стенд на рабочем ноутбуке обычно означает виртуальную машину: образ, сеть, снапшоты, отдельное окно. Debian 12 в WSL2 решает ту же задачу дешевле — подсистема Windows запускает настоящий дистрибутив с настоящим ядром, а apt, nginx и php-fpm работают так же, как на сервере. Ниже — порядок из семи шагов: включить подсистему, поставить Debian, собрать LEMP-стек, пробросить порты и закрыть лишнее. И отдельно — то, о чём в инструкциях пишут одной строкой, а спотыкаются все: адрес WSL меняется.

debian 12 wsl2 windows 11 cover

TL;DR: семь шагов и одна ловушка

  1. Включить. Компоненты подсистемы и платформы виртуальной машины, затем wsl --update и wsl --set-default-version 2.
  2. Поставить Debian. wsl --install -d Debian, первый запуск, имя пользователя, sudo apt update && sudo apt upgrade -y.
  3. Стек. nginx, mariadb-server, php8.3-fpm с расширениями.
  4. Порты. netsh interface portproxy плюс правила брандмауэра для 80 и 443.
  5. Ловушка. Адрес WSL меняется после перезапуска — правила проброса нужно обновлять.
dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --update
wsl --set-default-version 2
wsl --install -d Debian

Проблема, которую это решает

Нужен Linux под руку: проверить конфигурацию nginx, собрать тестовый сайт, отладить скрипт, который на Windows ведёт себя иначе. Вариантов обычно три, и у каждого своя плата.

Виртуальная машина — честный Linux, но это отдельная операционная система: образ на десятки гигабайт, выделенная память, отдельная сеть, отдельное окно и своя церемония с обновлениями.

Контейнер — быстро, но на Windows это всё равно виртуальная машина под капотом, плюс вопрос доступа к файлам хоста и к портам.

Удалённый сервер — самый близкий к бою вариант, но требующий сети и, как правило, денег, и неудобный, когда нужно быстро посмотреть на файл.

WSL2 занимает промежуточное место: ядро Linux работает рядом с Windows, файловая система хоста доступна из /mnt, порты пробрасываются одной командой. Плата — нестандартная сеть (NAT) и связанные с ней сюрпризы, из которых главный — меняющийся адрес.

Что такое WSL2 и что именно мы развернём

flowchart TB
  NET["интернет: статический адрес"] --> WIN["Windows 11: брандмауэр и portproxy"]
  WIN --> WSL["WSL2: виртуальная сеть, свой адрес"]
  WSL --> NG["Debian 12: nginx на 80 и 443"]
  NG --> FPM["PHP-FPM 8.3"]
  FPM --> DB["MariaDB"]
  WIN -. изменение адреса WSL .-> WSL
Слой Что это
Хост Windows 11 Pro
Подсистема WSL2 с настоящим ядром Linux и виртуальной сетью
Дистрибутив Debian 12 (Bookworm)
Веб-сервер nginx, слушает 80 и 443
Приложение PHP 8.3 через FPM
База MariaDB
Доступ снаружи проброс портов Windows и правила брандмауэра

Это классический LEMP-стек — тот же, что ставится на сервер, только вместо физической машины подсистема. Отсюда и польза: команды, конфиги и поведение переносятся в бой без переписывания.

Возможности

Что даёт такая схема

Что Почему удобно
Настоящий Linux apt, systemd через настройку, привычные пути /etc
Файлы Windows из Linux каталог /mnt/c без настройки
Проброс портов сайт доступен снаружи по статическому адресу
Один хост не нужна вторая машина и её обслуживание
Быстрый перезапуск подсистема поднимается за секунды

Что понадобится

Требование Зачем
Виртуализация в BIOS без неё WSL2 не запустится
Windows 11 Pro WSL2 доступен, но Pro удобнее для правил брандмауэра
Статический внешний адрес только если нужен доступ из интернета
Права администратора компоненты, проброс портов, правила брандмауэра

Как это делается по шагам

flowchart LR
  S1["1 включить WSL2"] --> S2["2 поставить Debian 12"]
  S2 --> S3["3 nginx"]
  S3 --> S4["4 MariaDB"]
  S4 --> S5["5 PHP-FPM 8.3"]
  S5 --> S6["6 проброс портов"]
  S6 --> S7["7 безопасность"]

Шаг 1. Включение подсистемы

dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# перезагрузка
wsl --update
wsl --set-default-version 2

Проверка: wsl --status показывает версию по умолчанию 2. Если подсистема не включается командой, те же компоненты есть в панели: «Программы и компоненты» → «Включение или отключение компонентов Windows» → «Подсистема Windows для Linux» и «Платформа виртуальной машины».

Шаг 2. Установка Debian

wsl --install -d Debian

Первый запуск спросит имя пользователя и пароль; этот пользователь получает sudo. Дальше — обновление:

sudo apt update && sudo apt upgrade -y

Проверка: apt policy показывает, что репозитории Bookworm подключены, а lsb_release -a — версию 12.

Шаг 3. Nginx

sudo apt install nginx -y
sudo systemctl enable nginx
curl -I localhost

Проверка: ответ 200 или 301 на локальный адрес. Если curl не установлен, подойдёт wget --spider.

Шаг 4. MariaDB

sudo apt install mariadb-server -y
sudo mysql_secure_installation
sudo systemctl enable mariadb

Проверка: вход sudo mysql и запрос SELECT VERSION();.

Шаг 5. PHP 8.3 и FPM

sudo apt install php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl -y
sudo systemctl enable php8.3-fpm
sudo systemctl restart nginx

Проверка: php -v и systemctl status php8.3-fpm без ошибок.

Шаг 6. Проброс портов

flowchart TD
  REQ["запрос на 80 или 443"] --> FW["правило брандмауэра Windows"]
  FW --> PROXY["portproxy: адрес WSL"]
  PROXY --> SITE["сайт в Debian"]
  PROBE["адрес WSL меняется при перезапуске"] -.-> PROXY
# сначала узнать адрес WSL
wsl -d Debian hostname -I

# затем пробросить порты
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=80 connectaddress=<адрес-WSL> connectport=80
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=443 connectaddress=<адрес-WSL> connectport=443

# и открыть их в брандмауэре
netsh advfirewall firewall add rule name="WSL2 Nginx HTTP" dir=in action=allow protocol=TCP localport=80
netsh advfirewall firewall add rule name="WSL2 Nginx HTTPS" dir=in action=allow protocol=TCP localport=443

listenaddress=0.0.0.0 означает «все интерфейсы». Если нужен только внешний адрес или только локальная сеть, укажите конкретный адрес — это заметно безопаснее.

Шаг 7. Безопасность

sudo apt install ufw -y
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

На стороне Windows действует правило «по умолчанию закрыто»: всё, что не разрешено явно, не проходит. Дополнительно закройте неиспользуемые порты и проверьте, не блокирует ли нужные порты провайдер или роутер.

Замеры и цифры

Честно о том, что удалось и что нет.

Что Результат
Объём исходной статьи 34 259 знаков, 7 шагов
Попытка живого замера WSL не удалась: в среде прогона wsl.exe отвечает «The file cannot be accessed by the system»
Версия WSL, версия Debian, список дистрибутивов не проверены — по этой причине
Схема стека по документации, помечена как требующая проверки

Живой замер в этом прогоне не получился: команда wsl в окружении, где готовилась статья, недоступна — wsl.exe возвращает ошибку доступа к файлу. Поэтому ни версию подсистемы, ни список дистрибутивов, ни поведение проброса портов я не подтверждаю собственным прогоном: всё ниже — по документации и исходной статье, и это прямо помечено.

Что из этого следует практически: перед развёртыванием проверьте три вещи на своей машине — wsl --version, wsl -l -v и wsl --status. Если версия ниже 2 или дистрибутив не числится в списке, дальше идти нет смысла: шаги 3–7 предполагают уже работающую подсистему.

Debian 12 в WSL2: шаги, стек и что проверено
Debian 12 в WSL2: семь шагов, стек и границы проверки

Почему именно WSL2, а не виртуальная машина

Разница видна не на установке, а на повседневной работе.

Виртуальная машина живёт своей жизнью: ей нужны выделенные ядра и память, она занимает десятки гигабайт, и её файловая система изолирована. Чтобы поправить конфиг nginx, вы копируете файл через общую папку или монтируете каталог — и каждый раз это отдельное действие, которое хочется автоматизировать.

WSL2 устроен иначе: подсистема запускает постоянное окружение, которое останавливается, когда вы его закрываете, и поднимается за секунды. Каталоги Windows доступны по пути /mnt/c, поэтому файл конфигурации можно открыть редактором на Windows и тут же проверить nginx -t в Linux. Для отладки это удобнее, чем любые общие папки.

Есть и обратная сторона: сеть у WSL2 виртуальная, и наружу её нужно пробрасывать отдельно. Именно отсюда растёт главная сложность схемы — не установка пакетов, а доступ извне. Виртуальная машина в этом смысле проще: у неё можно сделать мост, и адрес останется постоянным.

Практический вывод: WSL2 — это стенд для разработки и отладки, а не способ поднять постоянный публичный сервис. Если сайт нужен стабильно и снаружи, правильнее взять отдельную машину или сервер. Если нужно «сегодня проверить и завтра забыть» — WSL2 дешевле и быстрее.

Как проверить, что всё работает, и что смотреть в первую очередь

Проверки в этом стеке стоит делать снизу вверх, иначе ошибка на нижнем уровне выглядит как ошибка на верхнем.

Первая проверка — подсистема. wsl -l -v должен показать дистрибутив с версией 2. Если там версия 1, дальше идти нет смысла: ядро другое, поведение сети другое.

Вторая — сам дистрибутив. lsb_release -a показывает версию, apt update проходит без ошибок репозиториев. Если обновление падает, все дальнейшие шаги бессмысленны: пакеты не встанут.

Третья — веб-сервер. Запрос к локальному адресу изнутри подсистемы должен вернуть ответ. Если он возвращает ответ, а снаружи ничего не открывается, проблема не в nginx, а в пробросе — и это самый частый случай.

Четвёртая — PHP. php -v и наличие пула FPM; если nginx отдаёт файл вместо выполнения, смотреть надо на связку fastcgi_pass и сокета пула.

Пятая — база. Вход в консоль и SELECT VERSION().

И только шестая — внешний доступ. Здесь проверяется вся цепочка: правило проброса, правило брандмауэра, роутер и провайдер. Ошибка на любом из уровней выглядит одинаково — «сайт не открывается», — поэтому идти надо по порядку и после каждого шага фиксировать, что именно подтверждено.

Отдельно про журналы: в такой схеме полезно держать под рукой journalctl -u nginx, journalctl -u php8.3-fpm и journalctl -u mariadb. Большинство проблем в стеке видно в одном из трёх.

Сильные стороны продукта

  • Настоящий дистрибутив. Не эмуляция и не «похожий на Linux» набор утилит: apt, /etc, службы.
  • Стек переносится на сервер. Конфигурация nginx и пула PHP-FPM совпадает с боевой.
  • Файлы Windows доступны. Каталог /mnt/c без настройки — удобно для правки конфигов.
  • Проброс портов — одна команда. Не нужен отдельный прокси-сервер.
  • Быстрый старт. Подсистема поднимается за секунды, а не за минуты, как виртуальная машина.
  • Ничего не стоит. Ни лицензии, ни отдельного железа.
  • Изоляция от Windows. Пакеты и службы живут в своём дереве.

Установка

Что Команда
Компоненты подсистемы dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
Платформа виртуальной машины dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
Обновление WSL wsl --update
Версия по умолчанию wsl --set-default-version 2
Дистрибутив wsl --install -d Debian
Запуск wsl -d Debian

После установки стоит сразу проверить wsl --status и wsl -l -v: если дистрибутив помечен версией 1, его нужно перевести на вторую командой wsl --set-version Debian 2.

Настройка

Что настроить Где
Версия по умолчанию wsl --set-default-version 2
Ресурсы подсистемы файл .wslconfig в профиле пользователя
Автозапуск служб systemctl enable внутри Debian
Правила проброса netsh interface portproxy
Правила брандмауэра netsh advfirewall или графический интерфейс
Обновление правил при смене адреса скрипт в планировщике заданий

Главное в настройке — не забыть про автоматизацию проброса. Адрес WSL меняется при перезапуске, и правила portproxy после этого указывают в никуда: сайт перестаёт открываться, хотя внутри подсистемы всё работает.

$wsl_ip = (wsl hostname -I).Trim().Split(" ")[0]
netsh interface portproxy set v4tov4 listenaddress=0.0.0.0 listenport=80  connectaddress=$wsl_ip connectport=80
netsh interface portproxy set v4tov4 listenaddress=0.0.0.0 listenport=443 connectaddress=$wsl_ip connectport=443

Этот скрипт добавляется в планировщик заданий с триггером «при входе в систему» и запуском от администратора. Альтернатива — каждый раз сбрасывать правила через netsh interface portproxy reset и добавлять заново.

Что было в старой инструкции и что изменилось

Исходник был пошаговым руководством на 34 259 знаков: семь шагов, команды, пояснения. Как инструкция он работал, но был написан в жанре «делай так» — без разбора того, где схема ломается и где заканчивается её применимость.

Было Стало
шаги без предупреждений отдельный разбор главной ловушки со сменой адреса
команды без проверок после каждого шага указано, что должно быть на выходе
«проброс портов» одной строкой цепочка брандмауэр → portproxy → роутер и порядок диагностики
нет границ применимости сказано прямо: стенд для отладки, а не постоянный публичный сервис

Главное добавление — скептицизм к собственным числам. В этом прогоне живого замера не получилось, и вместо того чтобы писать «проверено», в статье прямо сказано, что версии и поведение требуют проверки. Инструкция, которая честно говорит о границах проверки, полезнее той, что звучит уверенно без оснований.

Что стоит сделать сразу после установки

Три вещи, которые занимают десять минут и экономят часы позже.

Первая — снимок состояния. Записать версию подсистемы, версию дистрибутива, версии nginx, PHP и MariaDB в один файл. Через месяц этот файл отвечает на вопрос «а что у меня было?» без раскопок.

Вторая — скрипт обновления проброса. Это не «на будущее», а насущное: адрес меняется при каждом перезапуске, и без скрипта вы будете чинить доступ руками. Скрипт кладётся в планировщик заданий, запускается от администратора и переписывает правила на актуальный адрес.

Третья — минимальный набор проверок в одну строку, который можно запускать за секунду: nginx -t, systemctl is-active для трёх служб, curl -I localhost. Если все три отвечают ожидаемо, а сайт снаружи не открывается — проблема точно в сети, а не в стеке. Такой набор удобно держать отдельным скриптом и запускать после каждой правки конфигурации, а не вспоминать команды заново.

Отдельно про резервные копии: стенд на ноутбуке кажется одноразовым, но конфигурации nginx и пула PHP пишутся руками и в них накапливается знание. Держать их в репозитории — дешевле, чем восстанавливать по памяти. Тот же довод работает и для набора команд установки: если он записан в файл, пересобрать стенд после переустановки Windows можно за полчаса, а не за вечер поисков в истории консоли.

Про HTTPS на таком стенде

Отдельная тема, которую в инструкциях обычно обходят одной строкой. Схема с пробросом портов сама HTTPS не даёт: сертификат — это отдельная сущность, и в этой архитектуре он живёт внутри Debian, а не на Windows.

Два пути. Первый и более понятный: терминировать TLS в nginx внутри подсистемы. Для этого сертификат и ключ копируются в каталог, доступный только root, в конфигурации указываются listen 443 ssl, ssl_certificate, ssl_certificate_key, а порт 443 пробрасывается так же, как 80. Плюс к этому — переадресация с 80 на 443, иначе половина внешних ссылок будет открываться без шифрования.

Второй путь — терминировать TLS на стороне Windows, а внутрь передавать открытый HTTP. Выглядит проще, но добавляет зависимость: сертификат и продление живут в Windows, а логика сайта — в Linux, и при переустановке одной части ломается другая.

Для стенда я всегда выбираю первый вариант: он ближе к тому, что стоит на сервере, поэтому переход с ноутбука в бой не требует новых решений. Второй оправдан, когда подсистема используется только как рабочая копия, а домен и сертификаты уже обслуживаются отдельно.

И честная оговорка: на локальном стенде сертификат нужен редко — чаще достаточно открытого HTTP на локальном адресе. Заводить его стоит тогда, когда проверяете именно поведение сайта под HTTPS: смешанный контент, редиректы, HSTS и заголовки безопасности ведут себя иначе, и на HTTP их не увидеть.

Подводные камни

  • Адрес WSL меняется. Главная грабля: после перезапуска подсистемы или Windows правила проброса устаревают. Нужен скрипт в планировщике или ручное обновление.
  • 0.0.0.0 — это все интерфейсы. Проброс на все адреса вместе с открытым портом в брандмауэре означает «доступно из интернета». Если внешний доступ не нужен, слушайте только локальный адрес.
  • Провайдер и роутер. Порты 80 и 443 могут быть закрыты выше Windows; проверять нужно всю цепочку, а не только брандмауэр.
  • HTTPS отдельная история. Сертификат нужно поставить внутри Debian и указать пути в конфигурации nginx; проброс порта сам его не создаёт.
  • Виртуализация в BIOS. Без неё подсистема не стартует, и сообщение об ошибке будет не про BIOS.
  • Службы и автозапуск. В WSL systemd работает не всегда «из коробки»; если systemctl ругается, включите системный менеджер в настройках подсистемы.
  • mysql_secure_installation спрашивает про root. На Debian root в MariaDB авторизуется через unix-socket, поэтому пароль может не спрашиваться — это нормально.
  • Смешение версий дистрибутива. wsl --install -d Debian ставит текущую стабильную версию; через год это будет уже другой выпуск, и команды установки пакетов могут отличаться.
  • Порт занят на Windows. Если на 80 или 443 слушает служба Windows, проброс не заработает: сначала освободите порт.
  • Файлы в /mnt/c медленнее. Работа с большим числом файлов из Windows-каталога заметно медленнее, чем внутри файловой системы Linux.

Чек-лист

  • [ ] Проверить, что виртуализация включена в BIOS.
  • [ ] Включить компоненты подсистемы и платформы виртуальной машины.
  • [ ] Выполнить wsl --update и wsl --set-default-version 2.
  • [ ] Установить Debian 12 и создать пользователя.
  • [ ] Обновить пакеты до актуального состояния.
  • [ ] Поставить nginx и проверить ответ на локальный адрес.
  • [ ] Поставить MariaDB и пройти первичную настройку.
  • [ ] Поставить PHP-FPM 8.3 с нужными расширениями и связать с nginx.
  • [ ] Настроить проброс портов и правила брандмауэра.
  • [ ] Автоматизировать обновление правил при смене адреса WSL.
  • [ ] Настроить ufw внутри Debian и закрыть лишние порты.
  • [ ] Проверить доступ снаружи по адресу или домену.

FAQ

Нужен ли Windows 11 Pro?

WSL2 работает и на домашней редакции, но управление брандмауэром и часть сетевых настроек удобнее в Pro. Если внешний доступ не нужен, разницы почти нет.

Почему сайт не открывается снаружи?

В девяти случаях из десяти адрес WSL изменился, а правила portproxy остались старыми. Проверьте wsl hostname -I и сравните с тем, что указано в правилах.

Можно ли обойтись без проброса портов?

Да, если сайт нужен только с этой машины: тогда достаточно localhost внутри WSL. Проброс нужен только для доступа извне.

Как поставить HTTPS?

Установить сертификат внутри Debian, указать пути в конфигурации nginx и открыть 443. Проброс порта эту задачу не решает.

Что делать при ошибке виртуализации?

Проверить включение виртуализации в BIOS и компонент «Платформа виртуальной машины». Иногда помогает wsl --shutdown и повторный запуск.

Как обновить Debian внутри WSL?

Обычным apt update && apt upgrade. Переход на следующий крупный выпуск — это отдельная процедура, как и на обычном сервере.

Итог

WSL2 даёт рабочий LEMP-стек без виртуальной машины: настоящий Debian, привычные apt и systemctl, конфигурация nginx и пула PHP-FPM как на сервере. Семь шагов проходятся за час, если не спотыкаться на сети. Главная сложность — не установка пакетов, а проброс: адрес подсистемы меняется, и правила нужно обновлять автоматически. В этом прогоне живой замер сделать не удалось — wsl.exe в среде подготовки статьи недоступен, поэтому все числа и версии в материале взяты из документации и требуют проверки на вашей машине.

Цитата: Стенд на своём ноутбуке полезен ровно до того момента, когда забыли обновить проброс портов, — поэтому автоматизация здесь не роскошь.

Связанные материалы

LLM Summary

  • Тема: развёртывание Debian 12 в WSL2 на Windows 11 с LEMP-стеком: nginx, MariaDB, PHP 8.3-FPM.
  • Порядок шагов: включить компоненты подсистемы и платформы виртуальной машины → wsl --update и --set-default-version 2 → wsl --install -d Debian → apt update && upgrade → nginx → MariaDB → PHP-FPM → проброс портов → безопасность.
  • Проброс: netsh interface portproxy add v4tov4 для 80 и 443 плюс правила netsh advfirewall; listenaddress=0.0.0.0 слушает все интерфейсы, конкретный адрес безопаснее.
  • Главная ловушка: адрес WSL меняется при перезапуске, правила portproxy устаревают; решение — скрипт в планировщике заданий с триггером «при входе».
  • HTTPS: сертификат ставится внутри Debian и указывается в конфигурации nginx; проброс порта сам по себе HTTPS не даёт.
  • Что проверено в этом прогоне: ничего из живого контура — wsl.exe в среде подготовки статьи отвечал ошибкой «The file cannot be accessed by the system». Числа (34 259 знаков исходной статьи, 7 шагов) — по исходнику, версии WSL и Debian не подтверждены.
  • Что проверить перед началом: виртуализация в BIOS, wsl --version, wsl -l -v, wsl --status.
  • Ограничения схемы: сайт доступен снаружи только при статическом адресе и открытых портах у провайдера; работа с файлами в /mnt/c медленнее, чем внутри Linux.
  • Ссылки: https://sysadministrator.ru/debian-12-wsl2-windows-11/

Промт для агента (установка и настройка)

Готовый промт: скопируйте блок целиком. Файла AGENTS.md у этой задачи нет — это не репозиторий, поэтому опора на проверки после каждого шага.

Задача: развернуть Debian 12 в WSL2 на Windows 11 с nginx, MariaDB и PHP 8.3-FPM и открыть сайт снаружи.

Шаг 1. Проверить предпосылки: виртуализация в BIOS, права администратора, wsl --status.
Шаг 2. Включить компоненты: dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart и то же для VirtualMachinePlatform; перезагрузить.
Шаг 3. wsl --update; wsl --set-default-version 2; проверить wsl -l -v (у дистрибутива должна быть версия 2).
Шаг 4. wsl --install -d Debian; первый запуск, имя пользователя и пароль.
Шаг 5. sudo apt update && sudo apt upgrade -y; проверить lsb_release -a.
Шаг 6. nginx: apt install nginx; systemctl enable nginx; curl -I localhost — ожидается 200 или 301.
Шаг 7. MariaDB: apt install mariadb-server; mysql_secure_installation; проверить SELECT VERSION().
Шаг 8. PHP: apt install php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl; systemctl enable php8.3-fpm; перезапустить nginx.
Шаг 9. Проброс: wsl -d Debian hostname -I; netsh interface portproxy add v4tov4 для 80 и 443; правила netsh advfirewall.
Шаг 10. Автоматизация: скрипт с netsh interface portproxy set по актуальному адресу, запуск в планировщике при входе в систему.
Шаг 11. Безопасность: ufw allow 22/80/443, ufw enable; закрыть лишние порты на Windows.

Запрещено:
- ставить listenaddress=0.0.0.0, если внешний доступ не нужен;
- считать, что правила portproxy живут после перезапуска WSL: адрес меняется;
- проверять доступ только с localhost: снаружи путь длиннее на брандмауэр и роутер;
- ожидать HTTPS без установленного сертификата в Debian;
- путать ошибку виртуализации с ошибкой установки пакетов;
- выдавать шаги из этого промта за проверенные: в среде подготовки статьи wsl.exe был недоступен.

Что считать успехом: wsl -l -v показывает Debian версии 2; curl -I localhost из WSL отвечает 200/301; php -v даёт 8.3; сайт открывается по внешнему адресу; после перезапуска WSL правила проброса обновляются автоматически.