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

TL;DR: семь шагов и одна ловушка
- Включить. Компоненты подсистемы и платформы виртуальной машины, затем
wsl --updateиwsl --set-default-version 2. - Поставить Debian.
wsl --install -d Debian, первый запуск, имя пользователя,sudo apt update && sudo apt upgrade -y. - Стек.
nginx,mariadb-server,php8.3-fpmс расширениями. - Порты.
netsh interface portproxyплюс правила брандмауэра для 80 и 443. - Ловушка. Адрес 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 предполагают уже работающую подсистему.

Почему именно 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 в среде подготовки статьи недоступен, поэтому все числа и версии в материале взяты из документации и требуют проверки на вашей машине.
Цитата: Стенд на своём ноутбуке полезен ровно до того момента, когда забыли обновить проброс портов, — поэтому автоматизация здесь не роскошь.
Связанные материалы
- Bash WP-CLI Update: обслуживание парка WordPress — обслуживание Linux-сайтов скриптом.
- Cert Unifier 3.1.1 — работа с сертификатами, которая понадобится для HTTPS.
- Fornex Control: панель для DNS-зон — если стенду нужен домен.
- HTML.PHP: шаблонизатор PHP в одном файле — что проверить на свежем PHP 8.3.
- CF7 Spam Checker Pro: защита формы — пример стека, который удобно отлаживать на таком стенде.
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 правила проброса обновляются автоматически.