LAMP стек на WSL

LAMP стек на WSL

Основная моя ОС для работы это Windows 10, в нем есть замечательный инструмент Windows Subsystem for Linux на котором можно легко настроить окружение для веб-разработки на PHP.

Зачем это надо когда есть Докер?

  • Докер под Windows все-таки работает медленно.
  • Раньше мне приходилось постоянно работать с разными версиями PHP, MySQL и постоянно переключаться между ними, но за последний год я работаю с одной и той же версией PHP и MariaDB, поэтому можно настроить LAMP один раз и забыть про него.

Что у нас получится в итоге:

  • Ubuntu 22.04
  • Apache
  • PHP 7.4 (или 8.1)
  • MariaDB
  • PhpMyAdmin
  • Composer

Установка Apache

Начнем с установки веб сервера Apache, но для начала обновим список пакетов. Выполним поочередно 3 команды:

sudo apt update

sudo apt upgrade

sudo apt install apache2

После установки, сразу попробуем запустить Апач и убедиться что все работает. Запускаем командой:

sudo service apache2 start

Далее переходим по адресу http://localhost/  и если видим приветственную страницу Apache, значит пока все делаем верно:

Приветственная страница веб-сервера Apache на Ubuntu

Далее создадим папку для наших веб-проектов. Эта папка должна быть за пределами файловой системы WSL. Например я создам ее по адресу d:\lamp-wsl, для этого выполним команду:

sudo mkdir /mnt/d/lamp-wsl

‎Создайте символьную ссылку на эту папку.‎

sudo ln -s /mnt/d/lamp-wsl /var/www/devroot

С помощью редактора Nano откроем файл конфигурации виртуального хоста Apache по умолчанию:‎

sudo nano /etc/apache2/sites-enabled/000-default.conf

И заменим его содержимое на:

<VirtualHost *:80>        
    ServerName localhost
    ServerAdmin webmaster@localhost
    DocumentRoot  /var/www/devroot      
    <Directory /var/www/>        
        Options Indexes FollowSymLinks        
        AllowOverride All        
        Require all granted      
    </Directory>        
    ErrorLog ${APACHE_LOG_DIR}/error.log        
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Чтобы в редакторе Nano вырезать весь текст до конца файла, нужно нажать сочетание клавиш Alt + Shift + T

Чтобы вставить текст из буфера, нажмите правую кнопку мыши.

Чтобы сохранить изменения и выйти из редактора Nano используйте сочетанием клавиш:

Ctrl+X

Если вы изменяли файл, то появится вопрос: «Save modified buffer (ANSWERING No Will DESTROY CHANGES)?». Нажмите клавишу y. Появится вопрос на ввод имени файла. Введите новое имя файла или просто нажмите Enter, если не хотите менять имя.

Теперь переходим в нашу папку для веб проектов, в моем случае d:\lamp-wsl и создадим файл для теста index.html:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Привет LAMP-WSL!</h1>
</body>
</html>

Теперь перезагружаем Apache командой:

sudo service apache2 restart

Обновляем http://localhost/  и теперь мы должны увидеть нашу тестовую страницу:

Тестовая страница LAMP на WSL

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

sudo a2enmod rewrite

И перезагрузим Апач

sudo service apache2 restart

Установка MariaDB

Можно вместо MariaDB установить MySQL, тем более она продолжает развиваться не смотря на те опасения, которые были, в результате чего и появилась MariaDB. Ниже я устанавливаю MariaDB из-за того, что про ее установку последнее время чаще спрашивают.

Итак, для установки выполним команду:

sudo apt install mariadb-server

После установки запустим MariaDB

sudo service mariadb start

И на последок выполнил скрипт для начальной настройки безопасности:

sudo mysql_secure_installation

На первый вопрос просто нажмите Enter

Следуйте инструкциям на экране, здесь важно установить root пароль. Когда будет вопрос «Set root password?» или  «Change the root password?» ответьте Y и нажмите Enter.

На все остальные вопросы просто нажимайте Enter.

Установка PHP

‎Я установлю PHP версии 7.4 и несколько модулей к нему. Выполним команду‎:

sudo apt install php7.4 libapache2-mod-php7.4 php7.4-mysql php-common php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-readline

Дополнение 30.06.2023

Чтобы установить PHP версии 8.1 на Ubuntu необходимо выполнить следующие команды:

sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg2

echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list

Далее:

wget -qO - https://packages.sury.org/php/apt.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/sury-keyring.gpg

sudo apt update

Устанавливаем PHP 8.1 с дополнениями:

sudo apt install php8.1 libapache2-mod-php8.1 php8.1-cli php8.1-fpm php8.1-pdo php8.1-mysql php8.1-zip php8.1-gd php8.1-mbstring php8.1-curl php8.1-xml php8.1-opcache

Перезагружаем Apache:

sudo service apache2 restart

Далее в нашей папке d:\lamp-wsl и создадим файл info.php чтобы проверить работоспособность PHP, файл следующего содержания:

<?php
phpinfo();

Далее переходим по адресу http://localhost/info.php и, если не возникло никаких проблем, видим страницу с информацией о PHP:

Можем убедиться что PHP на WSL работает

На этом установка самого LAMP закончена, но добавим еще кое какие вещи для нашего удобства.

Устанавливаем phpMyAdmin

Выполняем команду:

sudo apt install phpmyadmin

Следуем указаниям:

На первом окне выбираем Apache (чтобы выбрать, нужно нажать пробел) и нажимаем Enter

На втором окне выбираем Yes и нажимаем Enter

Далее придумываем и вводим пароль для самого phpMyAdmin, кнопкой Tab выбираем Yes и нажимаем Enter

Установка завершена. Перезапускаем Apache

sudo service apache2 restart

Далее идем http://localhost/phpmyadmin/ и видим окно входа в phpMyAdmin

Возможная ошибка №1

Если вместо окна входа вы получили 404 ошибку, то скорее всего в первом шаге установки phpMyAdmin вы не выбрали Apache, исправить это можно следующими командами:

sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf

sudo a2enconf phpmyadmin

sudo systemctl reload apache2

Еще раз перезапустим Апач

sudo service apache2 restart

И пробуем еще раз зайти http://localhost/phpmyadmin/ , теперь должно сработать.

Возможная ошибка №2

Когда вы попытаетесь войти с логином root  и паролем, которые вы установили на шаге инсталляции phpMyAdmin, то возможно вы получите следующую ошибку mysqli_real_connect(): (HY000/1698): Access denied for user ‘root’@’localhost’

Ошибка mysqli_real_connect(): (HY000/1698): Access denied for user 'root'@'localhost'

Чтобы решить эту ошибку, необходимо в терминале запустить поочередно следующие команды:

sudo mysql -p -u root

CREATE USER 'pmauser'@'localhost' IDENTIFIED BY 'ваш пароль';

GRANT ALL PRIVILEGES ON * . * TO 'pmauser'@'localhost';

FLUSH PRIVILEGES;

exit

Решение ошибки mysqli_real_connect(): (HY000/1698): Access denied for user 'root'@'localhost'

Теперь попробуйте зайти еще раз http://localhost/phpmyadmin, в качестве логина используем уже pmauser и пароль, которые вы ввели в командах выше.

Устанавливаем Composer

Установка Композера в WSL очень простая, в системе уже установлена утилита curl, поэтому воспользуемся ею:

curl -sS https://getcomposer.org/installer | php

Вот и все smiley Попробуйте узнать версию композера, выполнив команду:

php composer.phar --version

Если хотите, чтобы Composer был установлен глобально нужно выполнить следующую команду:

sudo mv composer.phar /usr/local/bin/composer

Теперь версию можно посмотреть так:

composer --version

Создание тестовых доменов в WSL

Когда работаешь с несколькими проектами, удобней работать с ними использую отдельные домены типа http://myapp.loc/

Сейчас я покажу как такое организовать.

Для начала в нашей папке d:\lamp-wsl создадим каталог для проекта myapp. Это можно сделать или в обычном проводники или прямо из консоли WSL командой:

sudo mkdir /mnt/d/lamp-wsl/myapp

Далее с помощью редактора Nano добавим файл с настройкой виртуального хоста:

sudo nano /etc/apache2/sites-available/myapp.loc.conf

Добавим в него и сохраним следующее содержание:

<VirtualHost *:80>
	ServerName myapp.loc
	DocumentRoot /var/www/devroot/myapp
	<Directory /var/www/devroot/myapp/>
		Options Indexes FollowSymLinks
		AllowOverride All
		Require all granted
	</Directory>
	ErrorLog ${APACHE_LOG_DIR}/error.log        
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Далее для подключения виртуального хоста используем команду:

sudo a2ensite myapp.loc

И перезапустим Апач

sudo service apache2 restart

И последним действием надо добавить запись в файл hosts расположенный в папке c:\windows\system32\drivers\etc

127.0.0.1 myapp.loc

Пробуйем http://myapp.loc/ все должно работать.

UPD. Как выяснилось при добавлении в файл hosts просто строки

127.0.0.1 myapp.loc

не всегда делает работоспособным домен myapp.loc. После небольшого гугления нашел решение тут WSL 2 Linux host cannot be accessed by a custom domain name or 127.0.0.1

Чтобы все заработало вместо этой строчки добавить следующие 2 строки:

127.0.0.1 myapp.loc

::1 myapp.loc localhost

Что еще…

В принципе все готово, можно спокойно работать. Пока единственное неудобство то, что при запуске WSL приходится вручную запускать Apache и MariaDB. Как только придумаю как сделать запуск автоматически, сразу дополню. Если кто-то знает как это решить, поделитесь.

Хостинг для ваших проектов