Среда, 10 марта 2021 19:00

Установка web-сервера (LEMP) в WSL2

Россия
Оцените материал
(0 голосов)

В этой статье -  мы рассмотрели установку Debian в WSL2 под Windows 10.

Сегодня мы установим в Debian web-сервер LEMP – Linux, Nginx, MariaDB, PHP.

Я везде использую Nginx, так как он более производителен и занимает меньше оперативной памяти по сравнению с Apache.

Использование консоли Debian

Запустим Debian через меню Пуск. Далее мы будем работать в этой консоли.

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

Чтобы скопировать текст из консоли выделите его мышкой и нажмите Enter.

Обновление списка пакетов

Прежде чем устанавливать новое ПО, нужно обновить список пакетов apt запустим:

sudo apt update
sudo apt -y upgrade

Установка Nginx

Запустим установку Nginx

sudo apt -y install nginx curl mc

Будут скачаны и установлены необходимые пакеты.

Использование mc

Запустите mc

sudo mc

Так проще править файлы конфигурации

Нажав

Ctrl+o

Вы можете скрыть панели и перейти в режим консоли, повторное нажатие возвращает панели с файлами назад.

Запуск сервера Nginx

Запустим сервер:

sudo service nginx start
[ ok ] Starting nginx: nginx.

Проверяем доступность сервера

В браузере откроем ссылку:

http://127.0.0.1

2021-03-08_11-21-41_2.png

Установка PHP

Существует множество версий PHP мы же будем использовать стабильную версию 7.4

Репозитории Debian не содержат свежих сборок PHP 7.4, поэтому ставить php мы будем из sury.org

Для начала установим дополнительные пакеты:

sudo apt -y install apt-transport-https ca-certificates lsb-release wget

Загрузим сертификаты:

sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

Добавим новый репозиторий в apt:

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

Проверим результат:

cat /etc/apt/sources.list.d/php.list
deb https://packages.sury.org/php/ buster main

Всё в порядке файл создан.

Запустим обновление apt: 

sudo apt update 

Это необходимо, так как список репозиториев пакетов изменился и появились новые пакеты.

Запустим обновление установленных пакетов: 

sudo apt -y upgrade

Запустим установку php 7.4 

sudo apt-get -y install php7.4

Сам php установлен, давайте установим дополнительные пакеты:

sudo apt -y install php7.4-fpm php7.4-gd php7.4-mbstring php7.4-mysql php7.4-zip php7.4-bz2 php7.4-bcmath php7.4-intl

Настройка php-fpm

Для того, чтобы Nginx мог работать с PHP мы установили PHP-FPM. Внесем изменения в его конфигурацию:

mcedit /etc/php/7.4/fpm/pool.d/www.conf

Найдите строку

listen = /run/php/php7.4-fpm.sock

и измените её на:

127.0.0.1:9000

Сохраните файл – F2 и закройте его Esc.

Запустим PHP-fpm:

sudo service php7.4-fpm start

Проверим его статус:

service php7.4-fpm status
[ ok ] php-fpm7.4 is running.

Всё в порядке – сервис запущен.

Настройка nginx для работы c php

Чтобы nginx мог работать с php-страницами изменим файл конфигурации: 

sudo mcedit /etc/nginx/sites-enabled/default

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

server {
        listen 80 default_server;
        listen [::]:80 default_server;


        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        # pass PHP scripts to FastCGI server
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass 127.0.0.1:9000;
        }
}

Перед перезапуском сервера всегда проверяйте конфигурацию: 

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Перезапустим nginx:

sudo service nginx restart
[ ok ] Restarting nginx: nginx.

Создадим файл /var/www/html/index.php

touch /var/www/html/index.php
echo "<?php echo phpinfo(); ?>" >> /var/www/html/index.php

Обновим страницу в браузере и получим:

2021-03-08_12-33-05_2.png 

Nginx и PHP работают. Осталось установить и настроить MariaDB.

Установка MariaDB

Запустим установку MariaDB

sudo apt -y install mariadb-server

После окончания установки запустим сервер, под WSL2 работает только эта команда:

sudo service mysql start
[ ok ] Starting MariaDB database server: mysqld.

Запустим настройку MariaDB: 

sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):

Просто нажмите Enter 

OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n]

Нажмите y

Введите пароль, в рамках моих статей я буду использовать пароль:

Pa$$w0rd

Пароль нужно ввести 2 раза! 

New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]

Нажмите y

... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]

Так как мы настраиваем машину для разработки нажмите n 

... skipping.

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]

Нажмите y 

- Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]

Нажмите y 

... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Вот и всё, осталось проверить доступность MariaDB, введем в консоли:

mysql -u root --password=Pa$$w0rd

 

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 59
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Введите:

select user from mysql.user;

Результат:

+------+
| user |
+------+
| root |
+------+
1 row in set (0.000 sec)

Введите

quit

Вот и всё, мы настроили MariaDB.

Получение доступа к файловой системе Debian в WSL2

А теперь рассмотрим, как залить файлы в папку нашего сайта.

Это очень просто, откройте проводник и введите адрес:

\\wsl$\

Здесь вы увидите список всех установленных виртуальных машин в WSL2.

Обратите внимание! Вы должны сначала запустить Debian с ярлыка из меню Пуск, иначе окно останется пустым и более того, даже если вы просто откроете ссылку

\\wsl$\Debian\

Вы не сможете ничего записать в папки!

2021-03-08_12-57-42.png

Откройте путь 

\\wsl$\Debian\var\www\html

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

Так же вы можете получить доступ к каталогу из Far manager:

cd \\wsl$\Debian\var\www\html

Проверка подключения к MariaDB из php-скрипта.

Давайте проверим соединение к базе данных MariaDB из php-скрипта.

Заменим содержимое файла

/var/www/html/index.php

следующим кодом:

<?php 

$dbname = 'mysql';
$dbuser = 'root';
$dbpass = 'Pa$$w0rd';
$dbhost = '127.0.0.1';

$connect = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);

if (!$connect) {
    echo "Ошибка: Невозможно установить соединение с MySQL<br>" . PHP_EOL;
    echo "Код ошибки errno: " . mysqli_connect_errno() . "<br>" . PHP_EOL;
    echo "Текст ошибки error: " . mysqli_connect_error() . "<br>" . PHP_EOL;
    exit;
}

echo "Соединение: ". mysqli_get_host_info($connect)."<br>";
echo "Таблицы: <br>";

$test_query = "SHOW TABLES FROM $dbname";
$result = mysqli_query($connect,$test_query);

$tblCnt = 0;
while($tbl = mysqli_fetch_array($result)) {
  $tblCnt++;
  echo $tbl[0]."<br />\n";
}

if (!$tblCnt) {
  echo "Нет таблиц<br />\n";
} else {
  echo "Есть $tblCnt таблиц<br />\n";
}

Обновим сайт в браузере и получим сообщение: 

Ошибка: Невозможно установить соединение с MySQL
Код ошибки errno: 1698
Текст ошибки error: Access denied for user 'root'@'localhost'

Очень странно. Запустим в консоли mysql: 

mysql -u root --password=Pa$$w0rd

Введем команды:

USE mysql;
SELECT User, Host, plugin FROM mysql.user;

Результат:

MariaDB [(none)]> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> SELECT User, Host, plugin FROM mysql.user;
+------+-----------+-------------+
| User | Host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket |
+------+-----------+-------------+
1 row in set (0.000 sec)

Всё дело в том, что по умолчанию новые версии MariaDB и Mysql используют авторизацию по unix_socket, что не дает нам соединяться используя IP-адрес.

Давайте это исправим, введем команды: 

update user set plugin='mysql_native_password' where user='root';
FLUSH PRIVILEGES;
quit

Обновите содержимое страницы:

2021-03-08_13-31-05_2.png 

Теперь у нас есть доступ к серверу MariaDB.

Запуск LEMP сервера

Если вы сейчас перезагрузите ПК, после загрузки сайт перестанет быть доступным.

Если мы зайдем в консоль Debian, то обнаружим, что ни один сервис не запущен:

[email protected]~$ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ssl    0:00 /init
   34 tty1     Ss     0:00 /init
   35 tty1     S      0:00 -bash
   37 tty1     R      0:00 ps ax

Всё дело в том, что WSL2 значительно отличается от обычного linux сервера.

Если вы попробуете запустить сервис таким образом:

systemctl start mysql

System has not been booted with systemd as init system (PID 1). Can't operate.

Failed to connect to bus: Host is down

У вас ничего не выйдет. Поэтому и сервисы не стартуют при запуске ПК.

В принципе нам это и не нужно, LEMP нам нужен на время разработки сайта. Держать его постоянно запущенным бессмысленно.

Давайте добавим скрипт, который будет запускать LEMP с ярлыка рабочего стола.

Запуск команд через WSL2

Вы можете запустить любую программу установленную на Debian размещенный на WSL2!

Попробуем это на примере htop - это аналог Диспетчера задач под Linux.

Установим программу:

sudo apt install htop

Запустим cmd.exe

 Введем в нём:

wsl htop

2021-03-09_20-52-53.png

Обратите внимание, что Debian имеет доступ к части оперативной памяти ПК, у меня установлено 16 GB RAM и при запущенном LEMP сервер потребляет всего 151 Мб памяти!

Основная проблема, которая мешает нам запустить сервисы одним файлом - авторизация.

Каждый раз, когда вы вызываете строку вида:

wsl sudo service mysql start

Система попросит у вас пароль пользователя:

2021-03-09_20-57-06.png

Нас это не устраивает. Давайте уменьшим количество вводов пароля до одного.

Конечно, есть способ чтобы вообще не вводить пароль - разрешить сервисам запускаться без пароля через sudo, но я считаю такой подход небезопасным.

Нам потребуется два файла:

Файл start_lemp.sh

#!/bin/bash
sudo service nginx start
sudo service php7.4-fpm start
sudo service mysql start

Файл start.sh

#!/bin/bash
sudo bash /home/user/start_lemp.sh

Оба файла создайте в домашней папке пользователя, использованного при установке Debian, в моем случае это - user и его папка:

/home/user

Обратите внимание вы должны быть под обычным пользователем!

Приглашение консоли должно выглядеть так:

[email protected]:~$

Если оно выглядит так:

[email protected]:~$

Наберите в консоли 

exit

Из консоли Debian запустим:

cd ~
chmod +x start.sh start_lemp.sh 

Откроем новую консоль cmd.exe

Запустим:

wsl /home/user/start.sh

 2021-03-09_21-20-13.png

Все работает. Теперь вы можете создать .cmd или .bat файл и поместить ярлык на рабочий стол. И каждый раз, перед началом разработки просто запускать его.

Заключение

Сегодня мы рассмотрели настройку и установку LEMP сервера на Debian сервер под WSL2.

Мы установили Nginx и проверили его доступность.

Был установлен php, настроен для работы с nginx и после этого настроен nginx для обработки php скриптов.

Мы проверили работу nginx и php с помощью функции php – php_info()

После установки MariaDB мы настроили авторизацию по паролю и проверили доступ к базе данных с помощью тестового скрипта.

Научились запускать программы размещенные в Debian из Windows.

Написали скрипт для запуска LEMP сервера перед началом разработки.

В следующей части мы добавим поддержку PHP и MySQL в VSCode.

Прочитано 1448 раз Последнее изменение Среда, 10 марта 2021 19:44