Стек LEMP – это группа программ, предназначенная для обслуживания динамических веб-страниц и веб-приложений. Этот акроним расшифровывается как Linux (операционная система), Nginx (веб-сервер), MySQL (система управления базами данных) и PHP (серверный язык сценариев для обработки динамического контента).
Данный мануал научит устанавливать все компоненты стека LEMP на сервер Ubuntu 18.04. Поскольку сервер использует операционную систему Ubuntu, первый компонент уже установлен. Мануал поможет вам установить остальное.
Требования
Для работы вам понадобится сервер Ubuntu 18.04, настроенный по этому мануалу.
1: Установка Nginx
Для отображения веб-страниц в этом стеке используется современный и производительный веб-сервер Nginx.
Все программное обеспечение, необходимое для установки веб-сервера, находится в стандартных репозиториях системы.
Поскольку это первое взаимодействие с системой пакетирования apt в текущей сессии, нужно обновить индекс пакетов. После этого можно установить Nginx
sudo apt update
sudo apt install nginx
В системе Ubuntu 18.04 веб-сервер Nginx запускается автоматически после установки.
Если ране вы настроили брандмауэр, нужно разрешить соединения сервиса Nginx. Во время установки Nginx регистрируется как сервис в ufw, потому разрешить трафик веб-сервера очень просто.
Рекомендуется выбрать наиболее строгий профиль веб-сервера. Однако, поскольку на сервере ещё не настроен SSL, мы можем настроить только порт 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 eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
Команда вернёт несколько строк. Проверьте каждый адрес в браузере.
Также можно узнать, как видят ваш IP-адрес другие точки в сети.
curl -4 icanhazip.com
Узнав вой IP, введите его в браузер, чтобы убедиться, что веб-сервер работает должным образом.
http://server_domain_or_IP
На экране должна появиться стандартная посадочная страница Nginx:
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
2: Установка MySQL
Теперь нужно установить MySQL, систему управления базами данных, которая будет хранить и систематизировать данные сайта.
Чтобы установить MySQL, введите:
sudo apt install mysql-server-5.7
После установки MySQL требует настройки.
Чтобы защитить установку, можно запустить простой скрипт безопасности, который удалит потенциально рискованные настройки. Инициируйте скрипт:
sudo mysql_secure_installation
Система предложит ввести root пароль MySQL. Затем она предложит настроить VALIDATE PASSWORD PLUGIN.
Важно! Если этот параметр включен, пароли, которые не соответствуют указанным критериям, будет отклонены системой MySQL как ошибка. Это вызовет проблемы, если вы используете слабый пароль в программах, которые автоматически настраивают учетные данные пользователя MySQL (например PhpMyAdmin). Безопаснее отключить этот параметр и использовать надёжные уникальные пароли.
Чтобы принять настройки по умолчанию, нажмите 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
Если валидация паролей включена, программа покажет надёжность текущего root пароля и предложит изменить его. Если вас устраивает ваш пароль, введите n.
Using existing password for root.
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
На остальные вопросы можно нажать Y и Enter. Это удалит анонимных пользователей и тестовые базы данных, отключит удалённый root логин и обновит текущие настройки MySQL.
3: Установка PHP
PHP – это серверный язык сценариев для создания динамических страниц.
Nginx не поставляется с поддержкой PHP, в отличие от других веб-серверов. Потому нужно установить php-fpm (fastCGI process manager). Так Nginx сможет передавать PHP-запросы на обработку.
Установите модуль и вспомогательный пакет, необходимый для взаимодействия PHP с БД.
sudo apt install php-fpm php-mysql
Установив компоненты PHP, нужно защитить программу.
Откройте главный конфигурационный файл php-fpm с привилегиями root.
sudo nano /etc/php/7.2/fpm/php.ini
Найдите в файле параметр cgi.fix_pathinfo; по умолчанию он закомментирован при помощи точки с запятой и имеет значение 1.
Это значение крайне опасно, поскольку в случае если запрашиваемый файл не найден, PHP будет пытаться выполнить ближайший к нему файл. Таким образом, злоумышленник может создать вредоносный запрос, который выполнит запрещённый сценарий.
Раскомментируйте параметр и измените его значение на 0.
cgi.fix_pathinfo=0
Сохраните и закройте файл. Перезапустите PHP:
sudo systemctl restart php7.2-fpm
4: Настройка Nginx для поддержки PHP
Все компоненты стека установлены. Теперь нужно настроить взаимодействие Nginx и PHP.
Для этого нужно отредактировать блок server (виртуальный хост).
sudo nano /etc/nginx/sites-available/default
Стандартный блок Nginx выглядит так (закомментированные строки опущены):
. . .
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
. . .
Нужно внести следующие изменения:
- Для начала добавьте index.php как первое значение директивы index, чтобы файлы index.php обслуживались первыми.
- Затем отредактируйте значение директивы server_name. Укажите здесь доменное имя или IP.
- Чтобы настроить обработку PHP, нужно просто раскомментировать сегмент файла, отвечающий за обслуживание запросов PHP. Это блок location ~\.php$, фрагмент fastcgi-php.conf и сокет для php-fpm.
- Также нужно раскомментировать блок location для файлов .htaccess. Сервер Nginx не обрабатывает эти файлы; если один из этих файлов попадёт в document root, его нельзя отображать клиентам.
Учитывая внесенные изменения, файл имеет такой вид:
. . .
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name your_server_domain_or_IP;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
. . .
Кроме того, в имени файла, на который ссылается директива fastcgi_pass в блоке location ~ \.php$, может быть несоответствие. Вы должны убедиться, что имя этого файла совпадает с тем, что на самом деле хранится в каталоге /run/php сервера. Чтобы проверить это, сохраните файл и закройте текстовый редактор, а затем выполните следующую команду:
ls /run/php/
php7.2-fpm.pid php7.2-fpm.sock
В этом примере файл, о котором идет речь, на самом деле называется php7.2-fpm.sock, а не php7.0-fpm.sock, как указано в директиве location ~ \.php$. Если на вашем сервере есть аналогичная несогласованность, еще раз откройте файл /etc/nginx/sites-available/default и обновите директиву fastcgi_pass:
sudo nano /etc/nginx/sites-available/default
. . .
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
. . .
Сохраните и закройте файл, а затем проверьте в нем ошибки:
sudo nginx -t
Исправьте ошибки и перезагрузите Nginx:
sudo systemctl reload nginx
5: Тестирование установки
Теперь установка стека LEMP полностью завершена. Убедитесь, что веб-сервер успешно обслуживает файлы PHP.
Для этого нужно создать тестовый файл info.php в каталоге document root.
sudo nano /var/www/html/info.php
Вставьте в него следующий код:
<?php
phpinfo();
Сохраните и закройте файл.
Теперь попробуйте открыть его в браузере:
http://your_server_domain_or_IP/info.php
На экране появится страница, содержащая информацию о сервере. Если такая страница появилась, Nginx правильно обслуживает файлы PHP.
После проверки обязательно удалите этот файл, иначе любой пользователь сможет получить доступ к конфиденциальным данным о сервере.
sudo rm /var/www/html/info.php
Заключение
Теперь на сервере Ubuntu 16.04 установлен программный стек LEMP – надёжная и гибкая платформа для развёртывания сайта или приложения.
На этом этапе можно приступать к дальнейшей настойке сервера. Например, вы можете защитить соединения с вашим сервером. Для этого можно зашифровать установку Nginx с помощью сертификата Let’s Encrypt. Следуя этому мануалу, вы получите бесплатный сертификат TLS/SSL для своего сервера, что позволит ему обслуживать контент через HTTPS.