Всем привет! В этой небольшой статье я очень сжато расскажу, как правильно настроить WSL в Windows 11 для локальной разработки Laravel-приложения. Мы собираемся установить php, mysql, nginx и composer, а также отредактировать файл hosts в самом Windows. Заранее прошу не гневаться на меня поклонников Docker, здесь я рассказываю именно про WSL.

Итак, без лишних промедлений, приступим. И начнем с того, что, как мы предполагаем, у нас есть Windows и всё. Если WSL уже установлен, львиную часть статьи можно пропустить.

Убедитесь в том, что ваша версия Windows совместима с WSL.

Установка WSL

Открываем PowerShell от имени Администратора и пишем:

wsl.exe --install

Подождем, когда установятся все компоненты, перезапустим компьютер, после чего окно WSL откроется автоматически и сразу запустится Ubuntu (по умолчанию установится именно Ubuntu) система попросит вас указать имя пользователя и пароль для WSL.

Примерно такая картина у вас получится
Примерно такая картина у вас получится

Устновка PHP

Мы будем устанавливать php 8.3. Для этого пишем по очереди:

sudo apt-get update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt install openssl unzip php8.3-cli php8.3-bcmath php8.3-curl php8.3-mbstring php8.3-mysql php8.3-tokenizer php8.3-xml php8.3-zip php8.3-fpm

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

Установка Composer

Чтобы нам установить Composer проводим следующие операции:

cd ~
curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
HASH=`curl -sS https://composer.github.io/installer.sig`
php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer

Запустив команду composer -v мы должны будем получить примерно вот это:

Да, что-то вроде этого
Да, что-то вроде этого

Установка MySQL

Теперь установим БД:

sudo apt-get install mysql-server

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

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Пишем exit; и пробуем войти в БД с новым паролем. Должно всё получиться.

mysql -u root -p

Установка Laravel

Далее мы идем уже, скорее всего, по известному пути:

cd ~
mkdir dev
cd dev
composer create-project laravel/laravel test-app

Также для работы Laravel нам нужна БД, создаем и ее:

mysql -uroot -p -e "create database test"

Обязательно в самой папке приложения Laravel нам надо отредактировать .env файл, примерно так:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=password

Теперь устанавливаем в БД необходимые для Laravel таблицы с помощью artisan:

cd test-app
php artisan migrate

У нас должно получиться примерно вот это:

Установка и конфигурация NGINX

Последнее, что нам осталось сделать - установить вебсервер. Для этого пишем:

sudo apt-get install nginx

Теперь важный момент: если мы хотим обращаться к нашему приложению по какому-то определенному адресу, тогда мы должны сделать некоторые правки в файле C:\Windows\System32\drivers\etc\hosts. Запускаем, к примеру, Блокнот обязательно от имени Администратора и добавляем в конце файла следующую запись:

127.0.0.1 test.test

Теперь давайте создадим конфигурационный файл nginx:

sudo nano /etc/nginx/sites-available/test.test.conf

В этом файле мы пишем следующее:

server {
    listen 80;
    listen [::]:80;
    server_name test.test;
    root /home/nikolay/dev/test-app/public;
 
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
 
    index index.php;
 
    charset utf-8;
 
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
 
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
 
    error_page 404 /index.php;
 
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
 
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Поменяйте директивы server_name, root и, возможно, fastcgi_pass, если вы использовали другие пути и названия. После этого мы копируем созданный файл в директорию sites-enabled самого nginx.

sudo ln -s /etc/nginx/sites-available/test.test.conf /etc/nginx/sites-enabled/test.test.conf

Проверяем конфигурацию nginx:

sudo nginx -t
sudo nginx -s reload

Еще один важный момент: для того, чтобы у нас не было проблем с правами, мы должны немного изменить конфигурацию самого nginx:

sudo nano /etc/nginx/nginx.conf

Тут мы меняем самую верхнюю строчку, чтобы она совпадала с именем пользователя WSL (в моем случае - nikolay):

Также меняем группу пользователя и самого пользователя в fpm:

sudo nano /etc/php/8.3/fpm/pool.d/www.conf

Собственно и всё! Теперь остается только перезапустить fpm и nginx:

sudo service php8.3-fpm restart
sudo service nginx restart

И теперь если мы зайдем через любой браузер по адресу http://test.test мы увидим главную страницу свежеустановленного Laravel.

Спасибо за внимание, надеюсь, эта небольшая инструкция будет полезна.

P.S. Дорогие читатели, автор ни в коей мере не настаивает на такой реализации разработки под Windows. Данная статья писалась как решение конкретной задачи, а не как рекомендация к немедленному действию.

Комментарии (21)


  1. Breathe_the_pressure
    15.04.2024 15:04
    +1

    А зачем учитель рысования WSL? На Win это не живёт разве?


    1. nicolas_d
      15.04.2024 15:04
      +1

      Живет, вообще без проблем. WSL в топку, ИМХО. Лучше уж полноценную виртуальную машину поставить.


      1. gun_dose
        15.04.2024 15:04
        +7

        WSL для локальной веб-разработки лучше любой другой виртуалки. Просто поставил и всё, у тебя полноценный терминал Linux, плюс все инструменты винды: проводник, IDE и прочее практически бесшовно интегрировано с файловой системой WSL. Плюс интеграция с докером. И самое главное, вообще ничего не нужно настраивать - всё из коробки работает точно так же, как в линуксе, потому что WSL это и есть полноценный Linux запущенный в виртуалке.


      1. Fell-x27
        15.04.2024 15:04

        WSL2 это и есть виртуалка. На WSL1 они честно пытались играть в "wine наоборот", но проиграли.


        1. nicolas_d
          15.04.2024 15:04

          Согласен. Меня убивает жесткая привязка к hyper-v. По работе нужны разные виртуальные машины, в т.ч. с пробросом внешних устройств, а у hyper-v с этим проблемы.


    1. okneloper
      15.04.2024 15:04

      Деплоится будет на Линукс, соответственно и разработка должна вестись под линуксом.


  1. 2medic
    15.04.2024 15:04
    +1

    А не подскажет ли мне уважаемое сообщество, почему у меня wsl2 не видит интернет? Т.е. ни о каких sudo apt-get update речи даже не идёт.

    Распространённое решение с исправлением /etc/resolv.conf и /etc/wsl.conf не работает. Вычитал, что возможны проблемы, если установлен Virtual Box. Снёс, проверил что в сетевых адаптерах от него хвостов не осталось.

    Но вот нет выхода в интернет и всё тут.


    1. TimsTims
      15.04.2024 15:04

      Если тут не ответят, то попробуйте на https://qna.habr.com/


    1. STAR
      15.04.2024 15:04

      DNS имя не резолвится или даже нет пинга\роута по ip адресу?


      1. 2medic
        15.04.2024 15:04

        Нет даже пинга.


        1. SadFly
          15.04.2024 15:04

          VPN часом на винде не запущен? (у меня проблемы с wg были)


  1. dimsog
    15.04.2024 15:04

    А как там с производительностью fs, починили или все так же плохо?


    1. gun_dose
      15.04.2024 15:04

      С производительностью ФС там всё изначально было хорошо, если класть файлы не в винду, а в WSL.


    1. powernic
      15.04.2024 15:04

      Года 2 или 3 назад наблюдал проблему с производительностью файловой системы, нельзя было использовать GPU из wsl и разные мелкие проблемы. С год назад или больше работать стало почти также комфортно как в нативной ubuntu


    1. Annikangl
      15.04.2024 15:04

      Если не использовать файловую систему Windows (/mnt), то проблем никаких нет, ничего не тормозит. Если вы об этом


  1. andrejbestuzhev
    15.04.2024 15:04
    +5

    Вот это всё перечисленное надо делать сразу в docker. И не забываем положить файлики куда-нибудь вне /mnt/


  1. Sanes
    15.04.2024 15:04

    Чем Laragon не угодил? Там есть всё необходимое.


  1. Johan_Palych
    15.04.2024 15:04

    Много интересного и полезного:
    Use systemd to manage Linux services with WSL
    https://github.com/MicrosoftDocs/WSL/blob/main/WSL/systemd.md
    Systemd support lands in WSL – unleash the full power of Ubuntu today
    on 21 September 2022 https://ubuntu.com/blog/ubuntu-wsl-enable-systemd


  1. vasyakrg
    15.04.2024 15:04
    +1

    Ну а есть XAMPP. Не надо ни куда ничего подкладывать. Компоненты работают на винде.


  1. treppilk
    15.04.2024 15:04

    WSL имеет смысл использовать на винде, если работаешь через Laravel Sail. И опять же, зачем поднимать mysql-server, nginx, если есть замечательный Sail? А на винду недавно релизнулся Laravel Herd


  1. ArtPlotnikov
    15.04.2024 15:04

    Долгое время работал на винде, и с самого момента выхода WSL2 долго и успешно боролся с возникающими трудностями и глюками (Docker съедал всё дисковое пространство, зависания и проч). Софт был - Ubuntu22, Docker с образами сайтов и PhpStorm в Win10. Но перестал этим заниматься, когда нашёл, что винда не оптимально работает с диском в WSL2 (с Ubuntu22), что замедляет сборку проекта на nodeJs. В итоге поставил Ubuntu на отдельный SSD и стало всё хорошо. Просто рекомендация - работайте в чистом Ubuntu - это сэкономит много времени.