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, значит пока все делаем верно:
Далее создадим папку для наших веб-проектов. Эта папка должна быть за пределами файловой системы 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/ и теперь мы должны увидеть нашу тестовую страницу:
Пока не забыли, большинству проектов требуется модуль 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:
На этом установка самого 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’
Чтобы решить эту ошибку, необходимо в терминале запустить поочередно следующие команды:
sudo mysql -p -u root
CREATE USER 'pmauser'@'localhost' IDENTIFIED BY 'ваш пароль';
GRANT ALL PRIVILEGES ON * . * TO 'pmauser'@'localhost';
FLUSH PRIVILEGES;
exit
Теперь попробуйте зайти еще раз http://localhost/phpmyadmin, в качестве логина используем уже pmauser и пароль, которые вы ввели в командах выше.
Устанавливаем Composer
Установка Композера в WSL очень простая, в системе уже установлена утилита curl, поэтому воспользуемся ею:
curl -sS https://getcomposer.org/installer | php
Вот и все Попробуйте узнать версию композера, выполнив команду:
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. Как только придумаю как сделать запуск автоматически, сразу дополню. Если кто-то знает как это решить, поделитесь.