Установка стека LAMP в Ubuntu 20.04

Стек LAMP – это группа открытых программ, которая позволяет серверу поддерживать динамические сайты и веб-приложения, написанные на PHP. LAMP – это акроним, он расшифровывается как Linux (операционная система), Apache (веб-сервер), MySQL (система управления базами данных) и PHP (язык сценариев для обработки динамического контента).

Первый компонент – операционная система Ubuntu, которая является дистрибутивом Linux – уже установлен. В мануале мы расскажем, как установить остальные компоненты стека.

Требования

Для работы вам понадобится сервер Ubuntu 20.04, настроенный согласно этому мануалу (включая пользователя с доступом к команде sudo и базовый брандмауэр).

1: Установка Apache и настройка брандмауэра

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

Установить Apache довольно просто, для этого вам нужен только пакетный менеджер apt:

sudo apt update
sudo apt install apache2

Если вы используете команду sudo впервые текущей сессии, вам нужно ввести пароль текущего пользователя. Также вам будет предложено подтвердить установку. Нажмите Y и Enter, чтобы продолжить.

После завершения установки нужно проверить настройки брандмауэра UFW. Скорее всего, сейчас он блокирует трафик HTTP и HTTPS. Брандмауэр регистрирует профили новых сервисов при их установке, с помощью таких профилей проще изменять его поведение. Просмотрите доступные профили UFW:

sudo ufw app list

В выводе вы увидите несколько профилей Apache, они и управляют трафиком веб-сервера:

Available applications:
Apache
Apache Full
Apache Secure
OpenSSH

Вот что делает каждый из них:

  • Apache: открывает только порт 80 (стандартный нешифрованный трафик).
  • Apache Full: открывает порты 80 и 443 (зашифрованный трафик TLS/SSL)
  • Apache Secure: открывает только зашифрованный трафик по порту 443.

Зашифрованный трафик надежнее, но в данный момент наш сервер еще не поддерживает сертификаты TLS/SSL (а вместе с этим и трафик HTTPS), потому мы можем включить только профиль Apache, который откроет порт 80.

Чтобы включить его, введите:

sudo ufw allow in "Apache"

Проверить изменения в настройках брандмауэра можно с помощью команды:

sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache                     ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache (v6)                ALLOW       Anywhere (v6)

Чтобы убедиться, что брандмауэр поддерживает входящий трафик по порту 80, посетите внешний IP своего сервера в браузере.

http://your_server_ip

На экране должна появиться стандартная страница Apache для Ubuntu 20.04:

It works!
This is the default welcome page used to test the correct operation of the Apache2 server after installation on Ubuntu systems. …

Как узнать внешний IP-адрес сервера

Существует несколько способов узнать внешний IP-адрес своего сервера из командной строки.

Во-первых, можно использовать инструменты iproute2:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

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

Также можно при помощи утилиты curl запросить свой адрес у третьей стороны.

curl http://icanhazip.com

2: Установка MySQL

Теперь, когда веб-сервер установлен, пришло время установить MySQL. MySQL – это популярная в средах PHP система управления базами данных. Она организует и обеспечивает доступ к БД, в которых сайт может хранить свою информацию.

Чтобы установить MySQL, введите:

sudo apt install mysql-server

Подтвердите установку.

После установки системе MySQL требуется настройка. Чтобы защитить ваш экземпляр, можно запустить простой встроенный скрипт безопасности, который удалит потенциально рискованные настройки. Запустите этот скрипт:

sudo mysql_secure_installation

Сценарий задаст ряд вопросов. Сначала он спросит, хотите ли вы включить VALIDATE PASSWORD PLUGIN.

Примечание: Этот плагин оценивает сложность вашего пароля MySQL. Если пароль недостаточно сложный, он не пройдет проверку и будет отклонен с ошибкой. В целом этот плагин можно не включать, но вы должны всегда использовать надежные и уникальные пароли для защиты своих данных.

Если хотите включить этот плагин, введите Y.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:

Если вы ответили yes, скрипт предложит вам выбрать уровень проверки. Самый высокий уровень – это 2. Если вы установите его, MySQL будет отклонять пароли, которые состоят из обычных  слов и не содержат цифр, букв в верхнем и нижнем регистре и специальных символов.

There are three levels of password validation policy:
LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Независимо от того, включили вы VALIDATE PASSWORD PLUGIN или нет, ваш сервер затем попросит вас выбрать и подтвердить пароль для пользователя root MySQL. Не путайте его с системным root. Root-пользователь базы данных – это администратор с полными привилегиями. Метод аутентификации root-пользователя MySQL по умолчанию не требует пароля, даже если пароль установлен; несмотря на это, вы должны определить здесь надежный пароль – в качестве дополнительной меры безопасности. Мы поговорим об этом чуть позже.

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

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

На остальные вопросы можно нажать Y и Enter. Это удалит анонимных пользователей и тестовые базы данных, отключит удалённый root логин и обновит текущие настройки MySQL.

После этого откройте командную строку MySQL в терминале:

sudo mysql

Вы подключитесь к серверу MySQL в качестве root пользователя базы данных. Вы должны увидеть примерно такой результат:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.19-0ubuntu5 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

Чтобы закрыть консоль MySQL, введите:

exit

Обратите внимание: вам не нужно было указывать пароль. Это потому, что метод аутентификации администратора по умолчанию в MySQL — unix_socket, а не password. Сначала такой метод может показаться проблемой безопасности, но он делает сервер базы данных более защищенным, поскольку войти в систему как пользователь root MySQL могут только системные пользователи с привилегиями sudo, подключающиеся из консоли или приложения с теми же привилегиями. Практически это значит, что вы не сможете использовать аккаунт администратора для подключения с вашего PHP-приложения.  Выбранный нами ранее root-пароль MySQL нужен на тот случай, если метод аутентификации unix_socket будет изменен на password.

Для повышения безопасности лучше иметь отдельные учетные записи с более узкими привилегиями для каждой базы данных (особенно если вы планируете разместить на своем сервере несколько БД).

Примечание: На момент написания этого мануала нативная PHP-библиотека MySQL mysqlnd не поддерживала caching_sha2_authentication, метод аутентификации по умолчанию для MySQL 8. Потому при создании пользователей базы данных для приложений PHP на MySQL 8 вам необходимо убедиться, что они используют mysql_native_password. Мы поговорим об этом в разделе 6.

Теперь ваш сервер MySQL защищен. Далее мы установим PHP, последний компонент в стеке LAMP.

3: Установка PHP

PHP – это серверный язык сценариев для написания динамических страниц. Он позволяет запускать сценарии, подключаться к БД MySQL и передавать обработанный контент в браузер для отображения.

PHP также можно установить с помощью менеджера apt. Вам также понадобятся вспомогательные пакеты php-mysql (для настройки взаимодействия PHP и MySQL) и libapache2-mod-php (который отвечает за работу Apache с PHP).

Чтобы установить все эти пакеты, введите команду:

sudo apt install php libapache2-mod-php php-mysql

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

php -v
PHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

Теперь стек полностью установлен. Но прежде чем ставить на него приложение, нужно создать виртуальный хост Apache, а затем протестировать и исправить возможные ошибки.

4: Создание виртуального хоста

Веб-сервер Apache по умолчанию предоставляет один включенный виртуальный хост, который обслуживает каталог /var/www/html. Этого хватит для обслуживания одного сайта, но если вы хотите разместить несколько сайтов, вам нужно создать новые виртуальные хосты.

Создайте структуру каталогов в  /var/www для сайта your_domain, а /var/www/html оставьте как каталог по умолчанию, который будет обслуживаться, если запрос клиента не соответствует другим сайтам.

Создайте корневой каталог your_domain:

sudo mkdir /var/www/your_domain

Затем определите права на каталог с помощью переменной $USER, которая ссылается на вашего текущего пользователя:

sudo chown -R $USER:$USER /var/www/your_domain

Затем создайте новый файл в каталоге sites-available с помощью nano или другого текстового редактора:

sudo nano /etc/apache2/sites-available/your_domain.conf

Вставьте в пустой файл эту базовую конфигурацию:

<VirtualHost *:80>
ServerName your_domain
ServerAlias www.your_domain
ServerAdmin webmaster@localhost
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

В этой конфигурации VirtualHost мы сообщаем, что your_domain нужно обслуживать, используя /var/www/your_domain в качестве корневого каталога сайта. Если вы хотите протестировать Apache без доменного имени, вы можете удалить или закомментировать параметры ServerName и ServerAlias, добавив символ # в начале каждого параметра.

Теперь вы можете использовать a2ensite для включения этого виртуального хоста:

sudo a2ensite your_domain

Возможно, вы захотите отключить веб-сайт по умолчанию, который устанавливается вместе с Apache. Это необходимо, если вы не используете пользовательский домен, потому что в этом случае конфигурация Apache по умолчанию перезапишет ваш виртуальный хост. Чтобы отключить веб-сайт Apache по умолчанию, введите:

sudo a2dissite 000-default

Проверьте ошибки в конфигурации:

sudo apache2ctl configtest

Если ошибок нет, команда вернет:

Syntax OK

Перезапустите Apache, чтобы обновить настройки:

sudo systemctl reload apache2

Теперь Apache обслуживает домен вашего нового сайта. Но пока что каталог /var/www/your_domain все еще пуст. Давайте мы создадим файл index.html, чтобы протестировать новый сайт.

nano /var/www/your_domain/index.html

Вставьте в файл такие строки:

<h1>It works!</h1>
<p>This is the landing page of <strong>your_domain</strong>.</p>

Откройте браузер и посетите домен или IP вашего сервера:

http://server_domain_or_IP

Вы должны увидеть такое сообщение:

It works!
This is the landing page of your_domain

Если вы видите эту страницу, ваш виртуальный хост Apache работает должным образом.

Вы можете оставить этот файл как временную посадочную страницу приложения, пока не установите другой файл index.php для его замены. Как только вы это сделаете, не забудьте удалить файл index.html из корневого каталога или переименовать его, так как он будет иметь приоритет над новым файлом index.php по умолчанию.

Кратко о параметре DirectoryIndex

При стандартных настройках DirectoryIndex в Apache файл index.html всегда будет иметь приоритет над файлом index.php. В приложениях PHP это полезно для настройки страниц обслуживания – это позволяет создать временный файл index.html, содержащий сообщение для посетителей. Поскольку эта страница будет иметь приоритет над страницей index.php, она станет посадочной страницей приложения. Поэтому после завершения технических работ файл index.html переименовывается или удаляется из корневого каталога, чтобы вернуть на место обычную посадочную страницу страницу приложения.

Если вы хотите изменить это поведение, вам нужно отредактировать файл /etc/apache2/mods-enabled/dir.conf и изменить порядок файлов в директиве DirectoryIndex. Откройте файл.

sudo nano /etc/apache2/mods-enabled/dir.conf

Поставьте index.php перед index.html:

<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

Сохраните файл, а затем перезапустите веб-сервер:

sudo systemctl reload apache2

5: Тестирование стека LAMP

Сейчас нужно убедиться в том, что веб-сервер взаимодействует с PHP. Для этого нужно создать простой сценарий PHP, info.php.

Создайте этот файл в корневом каталоге веб-сервера:

nano /var/www/your_domain/info.php

На экране появится пустой файл. Поместите в него такой код:

<?php
phpinfo();

Сохраните и закройте файл.

Теперь попробуйте открыть его в браузере:

http://server_domain_or_IP/info.php

На экране появится веб-страница, содержащая информацию о сервере (она также может пригодиться вам при отладке). Если такая страница появилась, веб-сервер обслуживает файлы PHP.

Важно! После проверки обязательно удалите этот файл, иначе любой пользователь сможет получить доступ к конфиденциальным данным о среде PHP и о вашем сервере Ubuntu.

sudo rm /var/www/your_domain/info.php

В случае необходимости вы сможете быстро создать эту страницу снова.

6: Тестирование соединения базы данных с PHP (опционально)

Если вы хотите проверить, может ли PHP подключаться к MySQL и выполнять запросы к базе данных, вы можете создать тестовую таблицу с фиктивными данными и запросить ее содержимое из сценария PHP.

Сначала нам нужно создать тестовую базу данных и пользователя для доступа к ней.

На момент написания этого мануала mysqlnd (PHP-библиотека для MySQL) не поддерживает caching_sha2_authentication, стандартный метод аутентификации MySQL 8. Нам нужно создать нового пользователя с аутентификацией mysql_native_password, чтобы иметь возможность подключиться к БД MySQL из PHP.

Давайте создадим базу данных example_database и пользователя example_user (вы можете заменить эти имена другими значениями).

Чтобы создать новую базу данных, войдите в СУБД как root:

sudo mysql

И выполните следующую команду из консоли MySQL:

CREATE DATABASE example_database;

Теперь можно создать нового пользователя и предоставить ему полные права на новую базу данных.

Следующая команда создаст пользователя example_user, который поддерживает аутентификацию по методу mysql_native_password. Также команда определяет условный пароль этого пользователя (password), который вы должны заменить безопасным паролем.

CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Эта команда предоставит пользователю example_user полные права доступа к БД example_database:

GRANT ALL ON example_database.* TO 'example_user'@'%';

В то же время она запретит ему создавать или изменять другие базы данных на вашем сервере.

После этого выйдите из оболочки MySQL:

exit

Вы можете убедиться, что у нового пользователя есть соответствующие права доступа. Снова войдите в консоль MySQL, на этот раз с помощью новых учетных данных:

mysql -u example_user -p

Обратите внимание на флаг -p в этой команде, он запрашивает пароль, который вы указали при создании пользователя example_user. После входа в консоль MySQL убедитесь, что у вас есть доступ к базе данных example_database:

SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

Теперь создайте таблицу по имени todo_list. Для этого в консоли MySQL выполните следующую команду:

CREATE TABLE example_database.todo_list (
item_id INT AUTO_INCREMENT,
content VARCHAR(255),
PRIMARY KEY(item_id)
);

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

INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

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

SELECT * FROM example_database.todo_list;

Вы увидите следующий вывод:

+---------+--------------------------+
| item_id | content                  |
+---------+--------------------------+
|       1 | My first important item  |
|       2 | My second important item |
|       3 | My third important item  |
|       4 | and this one more thing  |
+---------+--------------------------+
4 rows in set (0.000 sec)

Убедившись, что в тестовой таблице есть данные, вы можете выйти из консоли MySQL:

exit

Теперь можно создать PHP-скрипт, который будет подключаться к MySQL и запрашивать контент. Создайте новый PHP-файл в корневом каталоге приложения.

nano /var/www/your_domain/todo_list.php

Добавьте в PHP-скрипт следующие строки. Такой скрипт PHP подключается к базе данных MySQL и запрашивает содержимое таблицы todo_list, отображая результаты на экране в виде списка. Если у вас есть проблема с подключением к базе данных, он выдаст исключение.

<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";
try {
$db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
echo "<h2>TODO</h2><ol>";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "<li>" . $row['content'] . "</li>";
}
echo "</ol>";
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}

Сохраните и закройте файл, когда закончите редактирование.

Теперь вы можете получить доступ к этой странице в своем веб-браузере, посетив домен, который вы указали в конфигурации веб-сервера. К нему нужно добавить секцию /todo_list.php:

http://your_domain/todo_list.php

Вы должны увидеть свой контент, который вы добавили в тестовую таблицу.

Это означает, что среда PHP может подключаться и взаимодействовать с вашим сервером MySQL.

Заключение

Теперь на вашем сервере установлен программный стек LEMP – надёжная и гибкая платформа для развёртывания сайта или приложения.

Tags: , , , , ,