Установка стека LAMP в Debian 10
Debian, LAMP Stack | Комментировать запись
Стек 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: Apache, Debian, Debian 10, LAMP stack, MariaDB, PHP