Tutorial

Установка комплекта Linux, Apache, MySQL, PHP (LAMP) в Ubuntu 20.04

UbuntuMySQLApachePHPLAMP StackUbuntu 20.04

Введение

Комплект LAMP — это набор программного обеспечения с открытым исходным кодом, которое обычно устанавливается в комплексе для размещения на сервере динамических сайтов и веб-приложений, написанных на PHP. Этот термин представляет собой аббревиатуру. Операционная система Linux используется с веб-сервером Apache. Данные сайта хранятся в базе данных MySQL, а за обработку динамического контента отвечает PHP.

В этом обучающем модуле мы выполним установку комплекта LAMP на сервере Ubuntu 20.04.

Предварительные требования

Для данного обучающего модуля вам потребуется сервер Ubuntu 20.04 с учетной записью пользователя без привилегий root и с привилегиями sudo, а также базовым брандмауэром. Для настройки такого сервера воспользуйтесь нашим документом «Руководство по начальной настройке сервера Ubuntu 20.04».

Шаг 1 — Установка Apache и обновление брандмауэра

Веб-сервер Apache — один из самых популярных веб-серверов в мире. По нему имеется много документации и активное сообщество пользователей. Веб-сервер Apache широко использовался в течение большей части истории интернета, что делает его отличным стандартным выбором для размещения сайтов.

Установите Apache с помощью диспетчера пакетов apt в Ubuntu:

  • sudo apt update
  • sudo apt install apache2

Если это первое использование sudo в этом сеансе, вам нужно будет ввести пароль пользователя для подтверждения прав управления системными пакетами с помощью apt. Чтобы подтвердить установку Apache, нажмите Y, а затем ENTER.

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

  • sudo ufw app list

Вывод будет выглядеть следующим образом:

Output
Available applications: Apache Apache Full Apache Secure OpenSSH

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

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

Сейчас лучше всего разрешить только соединения на порту 80, поскольку мы только что установили Apache, и у нас еще нет сертификата TLS/SSL, настроенного для разрешения трафика HTTPS на нашем сервере.

Чтобы разрешить только трафик на порту 80, используйте профиль Apache:

  • sudo ufw allow in "Apache"

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

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

Теперь брандмауэр пропускает трафик порта 80.

Вы можете провести быструю проверку, открыв в браузере публичный IP-адрес вашего сервера (если вы не знаете свой публичный IP-адрес, следуйте указаниям примечания в следующем разделе):

http://your_server_ip

Вы увидите веб-страницу по умолчанию Ubuntu 20.04 Apache, предназначенную для информационных целей и целей тестирования. Она должна выглядеть следующим образом:

Страница Ubuntu 20.04 Apache по умолчанию

Если вы видите эту страницу, ваш веб-сервер правильно установлен и доступен через ваш брандмауэр.

Как определить публичный IP-адрес сервера

Если вы не знаете внешний IP-адрес вашего сервера, вы можете определить его с помощью нескольких способов. Обычно это адрес, который вы используете для подключения к серверу через SSH.

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

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

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

Также можно использовать утилиту curl для связи с внешним устройством. Вы увидите, как это устройство видит ваш сервер. Для этого нужно запросить ваш IP-адрес у конкретного сервера:

  • curl http://icanhazip.com

Вне зависимости от метода получения IP-адреса введите его в адресную строку браузера для просмотра страницы Apache по умолчанию.

Шаг 2 — Установка MySQL

Мы запустили веб-сервер, и теперь нам нужно установить СУБД, которая может хранить данные вашего сайта и управлять ими. MySQL — популярная СУБД, используемая в средах PHP.

Используйте apt для получения и установки этого программного обеспечения:

  • sudo apt install mysql-server

Для подтверждения установки введите Y, а затем нажмите ENTER.

После завершения установки рекомендуется запустить скрипт безопасности, предустановленный в 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:

Если вы ответите утвердительно, вам будет предложено выбрать уровень проверки пароля. Если вы укажете самый высокий уровень 2, система будет выводить сообщения об ошибке при попытке установки пароля, который не будет содержать цифры, буквы в верхнем и нижнем регистре и специальные символы, или будет содержать распространенные словарные слова.

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 user в MySQL. Не нужно путать его с системным пользователем root. Пользователь root базы данных — это пользователь с правами администратора, который имеет все права для работы с системой управления базы данных. Хотя в MySQL метод аутентификации пользователя root по умолчанию не требует использования пароля даже при его наличии, задайте надежный пароль для обеспечения дополнительной безопасности. Чуть дальше мы расскажем об этом подробнее.

Если вы включили использование паролей, вы увидите уровень надежности введенного пароля для пользователя root, и ваш сервер запросит у вас подтверждение дальнейшего использования этого пароля. Если вас устраивает текущий пароль, введите 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 базы данных с правами администратора, который логически выводится в результате использования sudo при запуске данной команды. Результат должен выглядеть следующим образом:

Output
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

Обратите внимание, что для подключения под именем пользователя root не требуется вводить пароль, хотя вы и задали его при запуске скрипта mysql_secure_installation. Это работает, поскольку используемый по умолчанию метод аутентификации для пользователя MariaDB с правами администратора — unix_socket, а не пароль. Хотя это может выглядеть как проблема безопасности, это делает сервер БД более безопасным, поскольку вход с правами root в MySQL доступен только системным пользователям с привилегиями sudo, которые подключаются через консоль или через приложение с тем же уровнем прав. На практике это означает, что вы не сможете использовать пользователя root базы данных с правами администратора для подключения из вашего приложения PHP. Настройка пароля учетной записи root MySQL работает как гарантия, если метод аутентификации по умолчанию меняется с unix_socket на password.

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

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

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

Шаг 3 — Установка PHP

Мы установили Apache для обслуживания вашего контента и MySQL для хранения и управления вашими данными. PHP — это элемент нашей настройки, который будет обрабатывать код для отображения динамического контента конечному пользователю. Помимо пакета php вам потребуется php-mysql, модуль PHP, который позволяет PHP взаимодействовать с базами данных MySQL. Также вам потребуется libapache2-mod-php для активации Apache для обработки файлов PHP. Ключевые пакеты PHP автоматически будут установлены в качестве зависимостей.

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

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

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

  • php -v
Output
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

Теперь комплект LAMP полностью работоспособен. Однако, прежде чем тестировать настройку с помощью скрипта PHP, лучше всего настроить виртуальный хост Apache для хранения файлов и папок вашего сайта. Мы сделаем это на следующем шаге.

Шаг 4 — Создание виртуального хоста для сайта

При использовании веб-сервера Apache вы можете создать виртуальные хосты (аналогичные серверным блокам в Nginx) для инкапсуляции данных конфигурации и размещения на одном сервере нескольких доменов. Мы настроим домен your_domain, но вы должны заменить это имя собственным доменным именем.

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

В Apache в Ubuntu 20.04 по умолчанию включен один серверный блок, настроенный на обслуживание документов из директории /var/www/html. Хотя это хорошо работает для отдельного сайта, при хостинге нескольких сайтов это неудобно. Вместо изменения /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

После этого откройте новый файл конфигурации в директории Apache sites-available с помощью любого редактора командной строки. Мы будем использовать nano:

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

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

/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 указывает Apache обслуживать your_domain, используя /var/www/your_domain в качестве корневого каталога. Если вы хотите протестировать Apache без доменного имени, вы можете удалить или закомментировать опции ServerName и ServerAlias, добавляя символ # в начале строк опций.

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

  • sudo a2ensite your_domain

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

  • sudo a2dissite 000-default

Чтобы убедиться в отсутствии ошибок синтаксиса в вашем файле конфигурации, выполните команду:

  • sudo apache2ctl configtest

В заключение перезагрузите Apache, чтобы эти изменения вступили в силу:

  • sudo systemctl reload apache2

Теперь ваш новый сайт активен, но корневой веб-каталог /var/www/your_domain все еще пуст. Создайте файл index.html в этом расположении, чтобы убедиться, что виртуальный хост работает, как ожидалось:

  • nano /var/www/your_domain/index.html

Внесите в файл следующее:

/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

Страница будет выглядеть следующим образом:

Тестирование виртуального хоста Apache

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

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

Примечание о DirectoryIndex в Apache

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

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

  • sudo nano /etc/apache2/mods-enabled/dir.conf
/etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
        DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

После сохранения и закрытия файла вам нужно будет перезагрузить Apache, чтобы изменения вступили в силу:

  • sudo systemctl reload apache2

На следующем шаге мы создадим скрипт PHP для тестирования правильности установки и настройки PHP на вашем сервере.

Шаг 5 — Тестирование обработки PHP на веб-сервере

Мы указали персонализированное расположение для хостинга файлов и папок сайта и теперь можем создать тестовый скрипт PHP, чтобы подтвердить способность Apache обрабатывать запросы для файлов PHP.

Создайте новый файл с именем info.php в корневой папке сайта:

  • nano /var/www/your_domain/info.php

В результате откроется пустой файл. Вставьте в файл следующий код PHP:

/var/www/your_domain/info.php
<?php
phpinfo();

После завершения редактирования сохраните и закройте файл.

Чтобы протестировать этот скрипт, откройте браузер и введите доменное имя или IP-адрес вашего сервера, а затем название скрипта, в данном случае info.php:

http://server_domain_or_IP/info.php

Вы увидите приблизительно следующую страницу:

Информация PHP в Ubuntu 20.04

На этой странице содержится информация о вашем сервере с точки зрения PHP. Эта информация полезна для отладки и обеспечения правильного применения настроек.

Если вы видите эту страницу в своем браузере, ваша система PHP работает надлежащим образом.

После проверки соответствующей информации о вашем сервере PHP с помощью данной страницы рекомендуется удалить созданный вами файл, поскольку он содержит конфиденциальную информацию о вашей среде PHP и о вашем сервере Ubuntu. Для этого можно использовать rm:

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

Если впоследствии вам снова потребуется эта информация, вы всегда можете воссоздать эту страницу.

Шаг 6 — Тестирование подключения к базе данных для PHP (необязательно)

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

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

Мы создадим базу данных с именем example_database и пользователя с именем example_user, но вы можете использовать и другие имена.

Вначале необходимо подключиться к консоли MySQL с помощью учетной записи 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_database:

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

В результате пользователь example_user получит полный набор привилегий для базы данных example_database, но не будет обладать возможностью создания или изменения других баз данных на сервере.

Теперь закройте оболочку MySQL:

  • exit

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

  • mysql -u example_user -p

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

  • SHOW DATABASES;

Результат будет выглядеть следующим образом:

Output
+--------------------+ | 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;

Вывод должен выглядеть так:

Output
+---------+--------------------------+ | 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:

  • nano /var/www/your_domain/todo_list.php

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

/var/www/your_domain/todo_list.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-адрес, настроенный для вашего сайта. После этого введите /todo_list.php:

http://your_domain/todo_list.php

Вы должны увидеть примерно следующую страницу, отображающую содержимое, которое вы добавили в тестовую таблицу:

Пример списка дел PHP

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

Заключение

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

Creative Commons License