Установка стека LAMP в Debian 10

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

На вашем сервере уже установлен первый компонент – операционная система Debian, которая является дистрибутивом Linux. Этот мануал поможет установить остальные компоненты стека.

Требования

  • Сервер Debian 10.
  • Пользователь с доступом к команде sudo и базовый брандмауэр (все инструкции можно найти здесь).

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

Apache является одним из самых популярных веб-серверов в мире. Он хорошо документирован и широко используется в интернете почти с самого начала его существования. Установить Apache очень легко, пакеты этого веб-сервера доступны в стандартном репозитории. Для установки используйте пакетный менеджер apt:

sudo apt update
sudo apt install apache2

Чтобы запустить команды с правами sudo, нужно ввести пароль текущего пользователя.

Получив правильный пароль, менеджер apt сообщит, какие пакеты он собирается установить и сколько дискового пространства для этого потребуется. Нажмите Y и ENTER, чтобы продолжить.

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

Теперь нужно проверить настройки брандмауэра UFW. Он поставляется с профилями сервисов, с помощью которых проще изменять его поведение. Просмотрите доступные профили Apache:

sudo ufw app list

Профили WWW управляют трафиком веб-сервера:

Available applications:
. . .
WWW
WWW Cache
WWW Full
WWW Secure
. . .

Профиль WWW Full пропускает трафик на порты 80 и 443.

sudo ufw app info "WWW Full"
Profile: WWW Full
Title: Web Server (HTTP,HTTPS)
Description: Web Server (HTTP,HTTPS)
Ports:
80,443/tcp

Разрешите входящий трафик HTTP и HTTPS:

sudo ufw allow in "WWW Full"

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

http://your_server_ip

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

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

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

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

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

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

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

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

sudo apt install curl
curl http://icanhazip.com

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

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

MariaDB – это форк MySQL, разработанный сообществом. В Debian 10 метапакет mysql-server, который традиционно использовался для установки сервера MySQL, заменили пакетом default-mysql-server (это метапакет MariaDB)

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

Однако для более долгосрочной совместимости рекомендуется вместо метапакета MySQL установить MariaDB (через пакет mariadb-server).

Чтобы сделать это, введите:

sudo apt install mariadb-server

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

sudo mysql_secure_installation

Сценарий задаст ряд вопросов. Сначала нужно указать root-пароль MariaDB. Это учетная запись администратора MariaDB, которая имеет повышенные привилегии. Вы установили MariaDB только что и еще не внесли никаких изменений, этого пароля пока у вас нет, поэтому просто нажмите Enter.

В следующем запросе скрипт предложит настроить пароль root для базы данных. Введите N и нажмите клавишу Enter. В Debian учетная запись root MariaDB тесно связана с автоматизированным обслуживанием системы, поэтому изменять стандартные методы аутентификации этой учетной записи нельзя. Иначе при обновлении пакета БД может повредиться, а доступ к учетной записи root может быть утрачен. Позже мы рассмотрим, как настроить дополнительную учетную запись администратора, если аутентификация сокетов вам не подходит.

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

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

sudo mariadb

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

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 74
Server version: 10.3.15-MariaDB-1 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)]>

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

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

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

CREATE DATABASE example_database;

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

GRANT ALL ON example_database.* TO 'example_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Это предоставит пользователю example_user полные права доступа к БД example_database, в то же время запретив ему создавать или изменять другие базы данных на вашем сервере.

Сбросьте привилегии:

FLUSH PRIVILEGES;

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

exit

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

mariadb -u example_user -p

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

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

Чтобы выйти из оболочки MariaDB, введите:

exit

На данный момент СУБД настроена, вы можете перейти к установке PHP, последнего компонента стека LAMP.

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

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

PHP также можно установить с помощью менеджера apt. Чтобы установить PHP и несколько вспомогательных пакетов (для настройки взаимодействия с Apache и MariaDB), введите команду:

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

В большинстве случаев рекомендуется настроить обработку файлов Apache при запросе каталога. На данный момент Apache сначала обслуживает index.html. Чтобы веб-сервер обслуживал PHP-файлы первыми, нужно открыть файл dir.conf:

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

Файл выглядит так:

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

Как видите, файлы index.php находятся в конце строки, а значит, веб-сервер будет обслуживать их в последнюю очередь. Переместите index.php в начало строки DirectoryIndex:

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

Сохраните и закройте файл (Ctrl-X, Y, Enter).

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

sudo systemctl reload apache2

Проверьте состояние apache2 при помощи systemctl:

sudo systemctl status apache2
apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2019-07-08 12:58:31 UTC; 8s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 11948 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
Main PID: 11954 (apache2)
Tasks: 6 (limit: 4719)
Memory: 11.5M
CGroup: /system.slice/apache2.service
├─11954 /usr/sbin/apache2 -k start
├─11955 /usr/sbin/apache2 -k start
├─11956 /usr/sbin/apache2 -k start
├─11957 /usr/sbin/apache2 -k start
├─11958 /usr/sbin/apache2 -k start
└─11959 /usr/sbin/apache2 -k start

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

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

Веб-сервер Apache в Debian 9 по умолчанию предоставляет один включенный виртуальный хост, который обслуживает каталог /var/www/html. Это делается через конфигурационный файл /etc/apache2/sites-available/000-default.conf. Этого хватит для обслуживания одного сайта, но если вы хотите разместить несколько сайтов, вам нужно создать новые виртуальные хосты.

Создайте структуру каталогов в  /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 все еще пуст. Далее мы создадим PHP-скрипт, чтобы протестировать новый сайт.

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

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

Создайте этот файл:

nano /var/www/your_domain/info.php

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

<?php
phpinfo();

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

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

http://server_domain_or_IP/info.php

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

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

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

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

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

Сначала подключитесь к консоли MariaDB с помощью пользователя БД, которого вы создали в разделе 2 данного руководства:

mariadb -u example_user -p

Создайте таблицу по имени todo_list. В консоли MariaDB выполните следующую команду:

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)

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

exit

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

nano /var/www/your_domain/todo_list.php

Добавьте в PHP-скрипт следующее содержимое:

<?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();
}

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

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

http://your_domain/todo_list.php

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

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

Заключение

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

Например, вы можете зашифровать соединения с вашим сервером. Для этого нужно установить сертификат Let’s Encrypt. Следуя этому мануалу, вы получите бесплатный сертификат TLS/SSL для своего сервера, что позволит ему обслуживать контент через HTTPS.

Tags: , , , , ,