Developer Advocate
Комплект LAMP — это набор программного обеспечения с открытым исходным кодом, которое обычно устанавливается в комплексе для размещения на сервере динамических сайтов и веб-приложений, написанных на PHP. Этот термин представляет собой аббревиатуру. Операционная система Linux используется с веб-сервером Apache. Данные сайта хранятся в базе данных MySQL, а за обработку динамического контента отвечает PHP.
В этом обучающем модуле мы выполним установку комплекта LAMP на сервере Ubuntu 20.04.
Для данного обучающего модуля вам потребуется сервер Ubuntu 20.04 с учетной записью пользователя без привилегий root и с привилегиями sudo
, а также базовым брандмауэром. Для настройки такого сервера воспользуйтесь нашим документом «Руководство по начальной настройке сервера Ubuntu 20.04».
Веб-сервер 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
Вывод будет выглядеть следующим образом:
OutputAvailable applications:
Apache
Apache Full
Apache Secure
OpenSSH
Вот что означает каждый из этих профилей:
80
(нормальный веб-трафик без шифрования).443
(трафик с шифрованием TLS/SSL).Сейчас лучше всего разрешить только соединения на порту 80
, поскольку мы только что установили Apache, и у нас еще нет сертификата TLS/SSL, настроенного для разрешения трафика HTTPS на нашем сервере.
Чтобы разрешить только трафик на порту 80
, используйте профиль Apache
:
- sudo ufw allow in "Apache"
Проверить изменения можно с помощью следующей команды:
- sudo ufw status
OutputStatus: 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-адрес вашего сервера, вы можете определить его с помощью нескольких способов. Обычно это адрес, который вы используете для подключения к серверу через SSH.
Существует несколько способов сделать это через командную строку. Во-первых, вы можете использовать инструменты iproute2
для получения IP-адреса с помощью следующей команды:
- ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
В результате будут выведены две или три строки. Все указанные адреса верные, но ваш компьютер может использовать только один из них, так что вы можете попробовать каждый.
Также можно использовать утилиту curl
для связи с внешним устройством. Вы увидите, как это устройство видит ваш сервер. Для этого нужно запросить ваш IP-адрес у конкретного сервера:
- curl http://icanhazip.com
Вне зависимости от метода получения IP-адреса введите его в адресную строку браузера для просмотра страницы Apache по умолчанию.
Мы запустили веб-сервер, и теперь нам нужно установить СУБД, которая может хранить данные вашего сайта и управлять ими. 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
при запуске данной команды. Результат должен выглядеть следующим образом:
OutputWelcome 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.
Мы установили 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
OutputPHP 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 для хранения файлов и папок вашего сайта. Мы сделаем это на следующем шаге.
При использовании веб-сервера 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
В результате будет создан новый пустой файл. Вставьте следующую пустую конфигурацию:
<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
Внесите в файл следующее:
<h1>It works!</h1>
<p>This is the landing page of <strong>your_domain</strong>.</p>
Откройте браузер и введите в адресную строку доменное имя вашего сервера или IP-адрес:
http://server_domain_or_IP
Страница будет выглядеть следующим образом:
Если вы видите эту страницу, это означает, что виртуальный хост 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
<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 на вашем сервере.
Мы указали персонализированное расположение для хостинга файлов и папок сайта и теперь можем создать тестовый скрипт PHP, чтобы подтвердить способность Apache обрабатывать запросы для файлов PHP.
Создайте новый файл с именем info.php
в корневой папке сайта:
- 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
:
- sudo rm /var/www/your_domain/info.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
:
<?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 готова к подключению и взаимодействию с вашим сервером MySQL.
С помощью этого руководства мы создали гибкую основу для обслуживания веб-сайтов PHP и приложений для ваших посетителей, используя Apache в качестве веб-сервера и MySQL в качестве СУБД.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
127.0.0.1 - it work http://mydomain.city - dont works. why?
$ sudo a2ensite mydomain.city Enabling site mydomain.city. To activate the new configuration, you need to run: systemctl reload apache2 $ sudo apache2ctl configtest AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ‘ServerName’ directive globally to suppress this message Syntax OK $ sudo systemctl reload apache2
*/etc/apache2/sites-available/mydomain.city.conf
<VirtualHost *:80> ServerName wolow.city ServerAlias www.wolow.city ServerAdmin webmaster@localhost DocumentRoot /var/www/wolow.city ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
WHY ??
Tell me what to do if other PCs cannot connect to my server?