Установка Nginx, MySQL, PHP (LEMP) для CentOS 7

LEMP - это...

LEMP - представляет собой стек веб-технологий, который позволяет создать среду для работы, как слабо так и высоко нагруженных веб-приложений. LEMP является акронимом, каждая буква которого представляет следующие веб-технологии: L - Linux, E - Nginx, M - MySQL/MariaDB, P - PHP.

В данной статье рассмотрен пример установки LEMP-стека на VPS/VDS сервере под управлением операционной системы CentOS 7.

Перед началом установки стека LEMP рекомендуется обновить все ранее установленные пакеты приложений. 

sudo yum update -y

Шаг #1: Настройка файервола

По умолчанию в CentOS 7 80-порт, на котором работает http-сервер, фильтруется файерволом. Доступ к 80-порту можно получить с локального хоста, но никак не с внешнего. Для того, чтобы другие компьютеры могли подключаться к нашему серверу по 80-порту (т.е могли просматривать сайты) нам необходимо его открыть, добавив новое правило работы межсетевого экрана, с помощью утилиты firewall-cmd.

Для начала убедимся, что файервол у нас запущен и включен в автозапуск при перезагрузке сервера:

systemctl status firewalld;
systemctl is-enabled firewalld;

Если в результате выполнения команд вы видите такие слова как inactive и disabled соответственно, то это означает, что файевол у вас не работает и ваш сервер не защищен. Запустить файервол можно так:

sudo systemctl start firewalld;
sudo systemctl enable firewalld;

Убедившись, что файервол работает, создадим для него новое правило, которое добавляет сервисы http и https для работы на 80 и 443 портах соответственно в публичную зону (группа портов/сервисов, которые доступны для всех компьютеров).

sudo firewall-cmd --permanent --zone=public --add-service=http;
sudo firewall-cmd --permanent --zone=public --add-service=https;

Перезапустим службу firewalld для того, чтобы изменения вступили в силу.

sudo systemctl restart firewalld

Убедимся в том, что службы http и https добавлены в публичную зону.

sudo firewall-cmd --zone=public --list-services

В появившейся строке результата, должны быть указаны слова http и https.

[meliorem@centos7 ~]$ sudo firewall-cmd --zone=public --list-services
ssh dhcpv6-client http https

Теперь, при удачно выполненных предыдущих действиях, ваши будущие сайты будут доступны для всех.

Шаг #2: Установка веб-сервера Nginx

Nginx (энджин экс) можно установить как минимум двумя способами. 

Способ #1: Из репозитория EPEL-release

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

yum list installed | grep epel-release

или

ls /etc/yum.repos.d | grep epel.repo
Epel-release
Репозиторий Epel-release установлен

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

sudo yum install epel-release -y

Далее устанавливаем сам веб-сервер nginx

sudo yum install nginx -y

Минус данного способа в том, что часто в EPEL репозитории хранится устаревшая версия пакета Nginx. Установленную версию можно проверить следующей командой:

nginx -v

Способ #2: Из собственного репозитория Nginx

Данный способ позволит установить последнюю стабильную версию Nginx прямо с сайта http://nginx.org, который мы укажем в репозитории как источник пакета.

Для этого необходимо создать новый файл nginx.repo в каталоге /etc/yum.repos.d.

sudo vi /etc/yum.repos.d/nginx.repo

Файл нужно наполнить следующим содержимым:

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

sudo yum install nginx -y

Включим Nginx и добавим его в автозапуск при перезагрузке системы.

sudo systemctl start nginx;
sudo systemctl enable nginx;

Уже сейчас можно проверить работоспособность сервера. Наберите ip-адрес вашей машины в адресной строке браузера и вам будет выдана проверочная страница /usr/share/nginx/html/index.html.

Nginx работает!
Nginx запущен и исправно работает

Шаг #3: Настройка файла конфигурации Nginx

Настроим параметры в главном конфигурационном файле Nginx.

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

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_backup

Вы можете скачать представленный ниже Nginx конфиг следующей командой - sudo wget https://raw.githubusercontent.com/CharmingProjects/Conf-files/master/nginx.conf -O /etc/nginx/nginx.conf

Приступим к редактированию главного конфига Nginx.

sudo vi /etc/nginx/nginx.conf

После сохранения изменений, рекомендую всегда проверять конфиг на ошибки в синтаксисе.

sudo nginx -t
Изменения конфига Nginx прошли успешно
Проверка синтаксиса конфига Nginx

Шаг #4: Создание и настройка сервер-блоков Nginx

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

Создание директорий для сайта

По умолчанию, Nginx создает один сервер-блок настроенный для обработки файлов из директории /usr/share/nginx/html, однако для создания самостоятельных сервер-блоков для каждого отдельного домена рекомендуется использовать директорию /var/www. Внутри каталога /var/www создадим новый каталог с именем вашего домена, внутри которого  также добавим нужные подкаталоги - www, где будут хранится файлы сайта и log, где будут хранится логи работы веб-сервера.

sudo mkdir -p /var/www/example.ru/{www,log}

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

Установка веб-сервера в качестве владельца особенно важна при установки каких-либо CMS-систем, например WordPress. 

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

sudo chown -R nginx:nginx /var/www/example.ru/www

Также настроим права доступа для /var/www

sudo chmod -R 755 /var/www

Создание тестовой страницы.

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

touch /var/www/example.ru/www/index.html;
echo 'example.ru is working!' > /var/www/example.ru/www/index.html;

Создание сервер-блока

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

Создадим необходимые для работы каталоги и файл для настроек сервер-блока:

sudo mkdir /etc/nginx/{sites-available,sites-enabled};
sudo vi /etc/nginx/sites-available/example.ru.conf;

Файл /etc/nginx/sites-available/example.ru.conf может содержать следующие настройки:

Включение сервер-блоков

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

sudo ln -s /etc/nginx/sites-available/example.ru.conf /etc/nginx/sites-enabled/example.ru.conf

Убедитесь, что все конфигурационные файлы, для каждого домена, подключены в главном конфиге Nginx. Для этого в файле /etc/nginx/main.conf должна присутствовать следующая строка.

include /etc/nginx/sites-enabled/*.conf;

Теперь, если все предыдущие этапы выполнены без ошибок, то вы можете зайти на страницу сайта, введя имя домена в адресную строку, в моем случае это example.ru.

Сайт работает!
Nginx выдал страницу для сайта example.ru

Шаг #5: Установка и настройка MariaDB

MariaDB - это популярный форк MySQL, отличающийся большей производительностью и функциональностью по сравнению с обычным MySQL.

Установим основной пакет MariaDB, который подтянет все необходимые зависимости.

sudo yum install mariadb-server -y

Запустим MariaDB для дальнейшей работы.

systemctl start mariadb;
systemctl enable mariadb;

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

sudo mysql_secure_installation

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

Если вам не предложили создать пароль во время загрузки сервера, то жмем enter и создаем сейчас.

Enter current password for root (enter for none):

Далее запрещаем анонимный доступ:

Remove anonymous users? [Y/n] y

Запрещаем удаленный доступ:

Disallow root login remotely? [Y/n] y

Удаляем ненужные тестовые базы данных:

Remove test database and access to it? [Y/n] y

Применяем только что выставленные настройки:

Reload privilege tables now? [Y/n] y

Настройка файла конфигурации MariaDB

В файле /etc/my.cnf хранятся все главные настройки для сервера баз данных. 

Грамотно настроенная СУБД MariaDB будет производительнее работать и потреблять меньше оперативной памяти, что, например, для VPS/VDS серверов с памятью в 512мб является очень важным. Так как для своих проектов я арендую виртуальный выделенный сервер именно с 512мб памяти, то предлагаю вашему вниманию соответствующий файл конфига для MariaDB (/etc/my.cnf).

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

Теперь MariaDB готова к работе и созданию баз данных.

Шаг #6: Установка и настройка php-fpm

В отличии, например от Apache, Nginx самостоятельно работает только со статикой, если в запросе к нему попадается php код, то Nginx сам его не обрабатывает, а проксирует (передает) на специальный php-обработчик, в роли которого выступает один из php модулей - php-fpm (fastCGI process manager).

На момент написания статьи php-fpm последней версии 7.1 нельзя установить из стандартных репозиториев, поэтому в наш список репозиториев (/etc/yum.repos.d) нужно добавить два дополнительных репозитория: EPEL-release и remirepo, а затем уже установить пакет php71w-fpm, а также несколько других нужных модулей. Так установка EPEL-release описана ранее в шаге по установке Nginx, то сейчас коснемся только установки remirepo.

Установим репозиторий от remirepo.com:

sudo rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm

Установим дополнительные инструменты для активации дополнительного репозитория remi-php71:

sudo yum install yum-utils;
sudo yum-config-manager --enable remi-php71;

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

  • php-fpm           - обработчик php кода для Nginx
  • php-mysqlnd  - содержит функции для работы с БД
  • php-mbstring - содержит функции для работы со строками
  • php-cli             - позволяет запускать php код прямо в консоли
sudo yum install php-mysqlnd php-fpm php-mbstring php-cli -y

Запустим php-fpm.

systemctl start php-fpm;
systemctl enable php-fpm;

Настройка файла конфигурации php-fpm

Откроем главный конфиг php - /etc/php.ini:

sudo vi /etc/php.ini

На данный момент нас интересует одна директива - cgi.fix_path_info, которая "говорит" php, чтобы он выполнил любой ближайший файл, если изначально запрашиваемый файл не был найден.

Существует опасность в том, что пользователь может создавать вредоносные запросы на сервер, которые будут беспрепятственно выполнены, чего допустить никак нельзя. Чтобы этого не случилось, найдем директиву cgi.fix_path_info, раскоментируем и отключим, установив ее параметр в значение - 0.

cgi.fix_path_info = 0

Также откройте для редактирования файл конфигурации php-fpm - /etc/php-fpm.d/www.conf и измените в нем имя пользователя и группы (по умолчанию установлен пользователь apache). Это позволит избежать проблем с правами на запись файлов сайта.

user = nginx
group = nginx

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

php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_flag[display_errors] = on
php_flag[display_startup_errors] = on

После правки всех конфигов, перезапустим php-fpm.

systemctl restart php-fpm

Проверка работы php-скриптов

Создайте тестовый файл для сайта, например /var/www/example.ru/www/test.php, и вставьте в него следующий код:

<?php phpinfo(); ?>

Далее в браузере перейдите по адресу example.ru/test.php, если на полученной странице отобразится результат выполнения функции phpinfo(), то это значит, что php-код успешно обрабатывается и на этом установка LEMP-стека завершена.

PHP работает!
Проверка работы PHP

Теперь файл /var/www/example.ru/www/test.php нужно удалить.

Заключение

Выполнив все шаги установки LEMP-стека вы получаете полноценную рабочую среду для ваших проектов.