Поиск по сайту:

Как установить стек Linux, Apache, MySQL, PHP (LAMP) на Ubuntu 20.04


Введение

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

В этом руководстве вы настроите стек LAMP на сервере Ubuntu 20.04.

Предпосылки

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

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

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

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

  1. sudo apt update

Затем установите Apache с помощью:

  1. sudo apt install apache2

Вам также будет предложено подтвердить установку Apache, нажав Y, а затем ENTER.

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

  1. 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:

  1. sudo ufw allow in "Apache"

Вы можете проверить изменение с помощью:

  1. 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, предназначенную для информационных и тестовых целей. Это должно выглядеть примерно так:

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

Как найти общедоступный IP-адрес вашего сервера

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

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

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

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

Альтернативный метод — использовать утилиту curl для связи с внешней стороной, чтобы сообщить вам, как она видит ваш сервер. Это делается путем запроса определенного сервера, какой у вас IP-адрес:

  1. curl http://icanhazip.com

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

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

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

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

  1. sudo apt install mysql-server

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

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

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

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

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, набрав:

  1. 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, введите:

  1. exit

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

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

Примечание. На момент написания этой статьи встроенная PHP-библиотека MySQL mysqlnd Шаг 6.

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

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

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

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

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

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

  1. php -v
Output
PHP 7.4.3 (cli) (built: Jul 5 2021 15:13:35) ( 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 следующим образом:

  1. sudo mkdir /var/www/your_domain

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

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

Затем откройте новый файл конфигурации в каталоге Apache sites-available, используя предпочитаемый вами редактор командной строки. Здесь мы будем использовать nano:

  1. 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>

Сохраните и закройте файл, когда закончите. Если вы используете nano, вы можете сделать это, нажав CTRL+X, затем Y и ENTER.

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

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

  1. sudo a2ensite your_domain

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

  1. sudo a2dissite 000-default

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

  1. sudo apache2ctl configtest

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

  1. sudo systemctl reload apache2

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

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

Включите в этот файл следующее содержимое:

<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>your_domain</strong>.</p>
  </body>
</html>

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

http://server_domain_or_IP

Вы увидите такую страницу:

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

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

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

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

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

  1. sudo nano /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, чтобы изменения вступили в силу:

  1. sudo systemctl reload apache2

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

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

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

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

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

Это откроет пустой файл. Добавьте в файл следующий текст, который является действительным кодом PHP:

<?php
phpinfo();

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

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

http://server_domain_or_IP/info.php

Вы увидите страницу, подобную этой:

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

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

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

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

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

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

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

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

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

Сначала подключитесь к консоли MySQL, используя учетную запись root:

  1. sudo mysql

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

  1. CREATE DATABASE example_database;

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

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

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

Теперь нам нужно дать этому пользователю разрешение на доступ к базе данных example_database:

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

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

Теперь выйдите из оболочки MySQL с помощью:

  1. exit

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

  1. mysql -u example_user -p

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

  1. SHOW DATABASES;

Это даст вам следующий результат:

Output
+--------------------+ | Database | +--------------------+ | example_database | | information_schema | +--------------------+ 2 rows in set (0.000 sec)

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

  1. CREATE TABLE example_database.todo_list (
  2. item_id INT AUTO_INCREMENT,
  3. content VARCHAR(255),
  4. PRIMARY KEY(item_id)
  5. );

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

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

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

  1. 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:

  1. exit

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

  1. nano /var/www/your_domain/todo_list.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();
}

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

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

http://your_domain_or_IP/todo_list.php

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

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

Заключение

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

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