LEMP — это группа программного обеспечения, которая используется для обслуживания динамических веб-страниц и веб-приложений, написанных на PHP. Это аббревиатура, которая описывает операционную систему Linux с веб-сервером Nginx (произносится как "Engine-X"), базу данных MySQL, и язык PHP для динамической обработки.
Для выполнения этого руководства вам понадобится доступ к серверу Ubuntu 20.04 в качестве обычного пользователя sudo, не являющегося пользователем root, и включенный брандмауэр на вашем сервере. Чтобы настроить его, вы можете следовать нашему руководству по первоначальной настройке сервера Ubuntu 20.04.
Установка веб-сервера Nginx
Для отображения веб-страниц посетителям сайта мы будем использовать Nginx, высокопроизводительный веб-сервер. Для получения этого программного обеспечения воспользуемся менеджером пакетов apt.
Поскольку вы впервые используете apt для этой сессии, начните с обновления индекса пакетов вашего сервера:
sudo apt update
После этого запустите apt install
для установки Nginx:
sudo apt install nginx
Когда появится запрос, нажмите Y и ENTER, чтобы подтвердить, что вы хотите установить Nginx. После завершения установки веб-сервер Nginx будет активен и запущен на вашем сервере Ubuntu 20.04.
Если у вас включен брандмауэр ufw, как рекомендуется в нашем руководстве по первоначальной настройке сервера, вам нужно разрешить соединения с Nginx. При установке Nginx регистрирует несколько различных профилей приложений UFW. Чтобы проверить, какие профили UFW доступны, выполните команду:
sudo ufw app list
Ожидаемый вывод:
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Рекомендуется включить самый ограничивающий профиль, который, тем не менее, будет разрешать необходимый вам трафик. Поскольку в этом руководстве вы не настраивали SSL для вашего сервера, вам нужно разрешить только обычный HTTP-трафик на порту 80.
Включите эту функцию, выполнив следующее:
sudo ufw allow 'Nginx HTTP'
Вы можете проверить изменение, проверив статус:
sudo ufw status
Этот вывод показывает, что HTTP-трафик теперь разрешен:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Добавив новое правило брандмауэра, вы можете проверить работоспособность сервера, зайдя на доменное имя или публичный IP-адрес вашего сервера в веб-браузере.
Если у вас нет доменного имени, указывающего на ваш сервер, и вы не знаете публичный IP-адрес вашего сервера или просто хотите сэкономить время на его поиски, вы можете найти его, выполнив одну из следующих команд:
ip addr show
hostname -I
Это выведет несколько IP-адресов. Вы можете попробовать каждый из них по очереди в своем веб-браузере.
Напишите полученный адрес в своем веб-браузере, и он приведет вас на целевую страницу Nginx по умолчанию:
http://server_domain_or_IP
Если вы получили эту страницу, это означает, что вы успешно установили Nginx и включили HTTP-трафик для вашего веб-сервера.
Установка MySQL
Теперь, когда веб-сервер запущен, необходимо установить систему баз данных для хранения и управления данными вашего сайта. MySQL — это популярная система управления базами данных, используемая в среде PHP.
Опять же, используйте apt для установки:
sudo apt install mysql-server
Когда появится запрос, подтвердите установку, нажав Y, а затем ENTER.
После завершения установки рекомендуется запустить сценарий безопасности, который поставляется вместе с MySQL. Этот сценарий удалит некоторые небезопасные настройки по умолчанию и заблокирует доступ к вашей системе баз данных. Запустите интерактивный сценарий, выполнив следующую команду:
sudo mysql_secure_installation
Вам будет предложен вопрос, хотите ли вы настроить VALIDATE PASSWORD PLUGIN.
Если эта функция включена, пароли, не соответствующие заданным критериям, будут отклонены MySQL с ошибкой. Безопасно оставлять проверку отключенной, но вы всегда должны использовать надежные, уникальные пароли для учетных данных базы данных.
Ответьте Y для подтверждения или что-нибудь еще, чтобы продолжить без включения:
VALIDATE PASSWORD COMPONENT 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 component?
Press y|Y for Yes, any other key for No:
Если вы ответите Yes, вам будет предложено выбрать уровень проверки пароля. Имейте в виду, что если вы введете 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 или нет, ваш сервер попросит вас выбрать и подтвердить пароль для корневого пользователя MySQL. Корневой пользователь базы данных — это административный пользователь с полными привилегиями в системе баз данных. Несмотря на то, что метод аутентификации по умолчанию для корневого пользователя MySQL не предусматривает использование пароля, даже если он установлен, в качестве дополнительной меры безопасности вам следует задать надежный пароль.
Если вы включили проверку пароля, вам будет показана степень надёжности для введенного вами пароля 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 при выполнении этой команды. Вы должны получить следующий результат:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
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
Для повышения безопасности лучше всего иметь специальные учетные записи пользователей с менее широкими привилегиями, установленные для каждой базы данных, особенно если вы планируете иметь несколько баз данных, размещенных на вашем сервере.
Установка PHP
У вас установлен Nginx для обработки входящих, исходящих запросов и MySQL для хранения и управления данными. Теперь вы можете установить PHP для обработки кода и создания динамического контента для веб-сервера.
В то время как Apache встраивает интерпретатор PHP в каждый запрос, Nginx требует внешней программы для обработки PHP и выступает в качестве моста между самим интерпретатором PHP и веб-сервером. Это позволяет повысить общую производительность большинства веб-сайтов на базе PHP, но требует дополнительной настройки. Вам нужно установить php8.1-fpm, который расшифровывается как "PHP fastCGI process manager" и использует текущую версию PHP (на момент написания статьи), чтобы указать Nginx передавать PHP-запросы на обработку этой программе. Кроме того, вам понадобится php-mysql, модуль PHP, который позволяет PHP взаимодействовать с базами данных на основе MySQL. Основные пакеты PHP будут автоматически установлены в качестве зависимостей.
Чтобы установить пакеты php8.1-fpm и php-mysql, выполните команды:
sudo apt install software-properties-common && sudo add-apt-repository ppa:ondrej/php -y
sudo apt install php8.1-fpm php-mysql
Когда появится запрос, нажмите Y и ENTER для подтверждения установки.
Теперь у вас установлены компоненты PHP. Далее вы настроите Nginx для их использования.
Настройка Nginx
При использовании веб-сервера Nginx мы можем создавать серверные блоки (аналогично виртуальным хостам в Apache) для инкапсуляции деталей конфигурации и размещения более одного домена на одном сервере. В этом руководстве мы будем использовать your_domain в качестве примера доменного имени.
В Ubuntu 20.04 в Nginx по умолчанию включен один серверный блок, который настроен на обслуживание документов из каталога /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
Затем откройте новый конфигурационный файл в каталоге sites-available
Nginx с помощью предпочитаемого редактора командной строки. Здесь мы будем использовать nano
:
sudo nano /etc/nginx/sites-available/your_domain
Это создаст новый пустой файл. Вставьте следующую пустую конфигурацию:
server {
listen 80;
server_name your_domain www.your_domain;
root /var/www/your_domain;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Вот что делает каждая из этих директив и блоков расположения:
- listen — определяет, какой порт будет прослушивать Nginx. В данном случае он будет прослушивать порт 80, порт по умолчанию для HTTP;
- root — определяет корень документа, в котором хранятся файлы, обслуживаемые этим сайтом;
- index — определяет, в каком порядке Nginx будет отдавать приоритет индексным файлам для этого сайта. Обычно файлы
index.html
имеют более высокий приоритет, чем файлыindex.php
, чтобы обеспечить быструю настройку целевой страницы в PHP-приложениях. Вы можете изменить эти настройки, чтобы они лучше соответствовали потребностям вашего приложения; - server_name — определяет, на какие доменные имена и/или IP-адреса должен отвечать данный серверный блок. Укажите эту директиву на доменное имя вашего сервера или публичный IP-адрес;
- location / — первый блок location включает директиву try_files, которая проверяет существование файлов или каталогов, соответствующих запросу URL. Если Nginx не может найти соответствующий ресурс, он возвращает ошибку 404;
- location ~ \.php$ — этот блок location выполняет фактическую обработку PHP, указывая Nginx на конфигурационный файл
fastcgi-php.conf
и файлphp8.1-fpm.sock
, который определяет, какой сокет связан с php8.1-fpm; - location ~ /\.ht — последний блок location имеет дело с файлами
.htaccess
, которые Nginx не обрабатывает. Добавив директиву deny all, если какие-либо файлы.htaccess
случайно попадут в корень документа, они не будут обслуживаться посетителями.
Когда вы закончите редактирование, сохраните и закройте файл. Если вы используете nano, вы можете сделать это, нажав CTRL+X, а затем Y и ENTER для подтверждения.
Активируйте вашу конфигурацию путем ссылки на файл конфигурации из каталога Nginx sites-enabled
:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
Затем удалите файл конфигурации по умолчанию из каталога /sites-enabled/
:
sudo unlink /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
Это укажет Nginx использовать эту конфигурацию при следующей перезагрузке. Вы можете проверить свою конфигурацию на наличие синтаксических ошибок, выполнив следующее:
sudo nginx -t
Если сообщается о каких-либо ошибках, вернитесь к файлу конфигурации и просмотрите его содержимое, прежде чем продолжить.
Когда вы будете готовы, перезагрузите Nginx, чтобы применить изменения:
sudo systemctl reload nginx
Добавьте в этот файл следующее содержимое:
<html>
<head>
<title>Your website</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
Теперь перейдите в браузер и зайдите на доменное имя или IP-адрес вашего сервера, указанный в директиве server_name в файле конфигурации вашего серверного блока.
Вы получите страницу, подобную следующей:
Если вы получаете эту страницу, это означает, что ваш серверный блок Nginx работает так, как ожидалось.
Вы можете оставить этот файл в качестве временной целевой страницы для вашего приложения, пока не установите файл index.php
вместо него. Как только вы это сделаете, не забудьте удалить или переименовать файл index.html
из корня документа, так как по умолчанию он будет иметь приоритет над файлом index.php
.
Тестирование PHP
Теперь ваш стек LEMP должен быть полностью настроен. Вы можете протестировать его, чтобы убедиться, что Nginx может правильно передавать .php
файлы вашему PHP интерпритатору.
Это можно сделать, создав тестовый PHP-файл в корне документа. Откройте новый файл info.php
в корне документа в удобном для вас текстовом редакторе:
nano /var/www/your_domain/info.php
Добавьте следующие строки в новый файл. Это действительный PHP-код, который будет возвращать информацию о вашем сервере:
<?php
phpinfo();
Сохраните и закройте файл.
Теперь вы можете получить доступ к этой странице в своем веб-браузере, посетив доменное имя или публичный IP-адрес, который вы задали в конфигурационном файле Nginx, а затем /info.php
:
http://server_domain_or_IP/info.php
Вы получите веб-страницу, содержащую подробную информацию о вашем сервере:
После проверки соответствующей информации о вашем PHP-сервере через эту страницу, лучше всего удалить созданный вами файл, поскольку он содержит конфиденциальную информацию о вашей среде PHP и вашем сервере Ubuntu. Вы можете использовать rm
для удаления этого файла:
sudo rm /var/www/your_domain/info.php