Как установить и настроить Linux, Nginx, MySQL, PHP (LEMP) на Ubuntu Server

11 января 2020 г.

Введение

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

В этой статье мы продемонстрируем процесс установки стека LEMP на сервер с Ubuntu 16.04 и более. Операционная система Ubuntu удовлетворяет первому требованию LEMP - это операционная система на базе Linux. Далее мы опишем процесс установки остальных компонентов стека LEMP.

Шаг 1 - Установка веб-сервера Nginx

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

Всё программное обеспечение, которое мы будем использовать, будет установлено из стандартных репозиториев Ubuntu. Это означает, что мы можем использовать пакетный менеджер apt для установки.

Поскольку мы собираемся использовать apt в первый раз в ходе этой сессии, начнём с обновления локального списка пакетов. Далее установим сервер:

$ sudo apt-get update

$ sudo apt-get install nginx

В Ubuntu 16.04 Nginx настроен для запуска сразу после установки.

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

Рекомендуется настраивать ufw таким образом, чтобы разрешать только тот трафик, который вы хотите разрешить в явном виде. Поскольку мы ещё не настроили SSL для нашего сервера, в этой статье мы разрешим трафик только для порта 80.

Сделать это можно следующей командой:

$ sudo ufw allow 'Nginx HTTP'

Вы можете проверить изменения введя команду:

$ sudo ufw status

В результате должен отобразиться вывод следующего вида:

Вывод

Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

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

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

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

В результате будет выведено несколько IP адресов. Попробуйте вставить каждый из них в браузер.

Другим способом определить свой IP адрес будет проверка, как ваш сервер виден из Интернета:

$ curl -4 <ваш домен>

Наберите полученный IP адрес в вашем веб-браузере. Вы должны увидеть страницу Nginx по умолчанию.

http://доменное_имя_или_IP_адрес

Страница Nginx по умолчанию

Если вы видите подобную страницу в своём браузере, вы успешно установили Nginx.

Шаг 2 - Установка MySQL для хранения данных сайта

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

Вы можете легко установить MySQL следующей командой:

$ sudo apt-get install mysql-server

В процессе установки вам будет предложено ввести рутовый пароль (пароль администратора) для MySQL.

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

$ sudo mysql_secure_installation

Скрипт запросит пароль, который вы только что задали для root пользователя в MySQL. Далее вам будет предложено сконфигурировать плагин валидации паролей (VALIDATE PASSWORD PLUGIN).

Примечание:
Если что-то пошло не так с рут-паролем загляните сюда

Внимание: решение включать плагин валидации паролей или нет носит субъективный характер. При включении все пароли, которые не удовлетворяют определённым критериям безопасности, будут отвергаться MySQL с сообщением об ошибке. Это может вызывать проблемы, если вы используете "слабые" пароли совместно с программным обеспечением, которое конфигурирует профили пользователей MySQL, например, пакеты Ubuntu для 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 или no:

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.

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

Как создать нового пользователя

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

Давайте начнем с создания нового пользователя из консоли MySQL:

CREATE USER '<span class="highlight">newuser</span>'@'localhost' IDENTIFIED BY '<span class="highlight">password</span>';

К сожалению, на данном этапе пользователь “newuser” не имеет прав делать что-либо с базами данных. На самом деле, даже если если пользователь “newuser” попробует залогиниться (с паролем “password”), он не попадет в консоль MySQL.

Таким образом, первое, что нам необходимо сделать, это предоставить пользователю доступ к информации, которая ему потребуется.

GRANT ALL PRIVILEGES ON * . * TO '<span class="highlight">newuser</span>'@'localhost';

Для MySQL8, возможно, понадобится такое:

GRANT ALL PRIVILEGES ON db . * TO '<span class="highlight">newuser</span>'@'localhost';

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

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

FLUSH PRIVILEGES;

Теперь ваши изменения вступят в силу.

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

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

Поскольку Nginx не имеет встроенной поддержки обработки PHP, как некоторые другие веб-серверы, нам необходимо установить php-fpm (означает "fastCGI process manager", менеджер процессов fastCGI). Мы настроим Nginx для передачи PHP запросов этому программному обеспечению для обработки.

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

$ sudo apt-get install php-fpm php-mysql

Настройка обработчика PHP

После установки компонентов PHP настроим их для повышения безопасности нашего веб-сервера.

Откроем конфигурационный файл php-fpm с привилегиями root:

$ sudo vim /etc/php/7.0/fpm/php.ini

Найдём в этом файле параметр cgi.fix_pathinfo. Он будет закомментирован точкой с запятой (;) и будет иметь значение "1" по умолчанию.

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

Мы можем предотвратить такое поведение раскомментировав эту строку и изменив её значение на "0":

/etc/php/7.0/fpm/php.ini

cgi.fix_pathinfo=0

Сохраните и закройте документ после внесения изменений.

Теперь нам осталось перезапустить обработчик PHP:

$ sudo systemctl restart php7.0-fpm

После перезапуска наши настройки вступят в силу.

Шаг 4 - Настройка Nginx для работы с обработчиком PHP

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

Мы сделаем это на уровне серверных блоков (серверные блоки являются приблизительным аналогом виртуальных хостов в Apache). Откроем серверный блок Nginx сервера по умолчанию командой:

$ sudo vim /etc/nginx/sites-available/default

Этот файл должен иметь примерно следующий вид:

/etc/nginx/sites-available/default

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.
  • Мы также раскомментируем код, отвечающий за работу с файлами .htaccess. Nginx не обрабатывает эти файлы. Если какие-то из этих файлов окажутся в корневой директории сайта, они не должны быть доступны пользователям.

Изменения, которые необходимо внести в этот файл помечены красным:

/etc/nginx/sites-available/default

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 доменное_имя_или_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;
    }
}

После внесения изменений сохраните и закройте файл.

Проверьте ваш файл конфигурации на наличие ошибок командой:

$ sudo nginx -t

Если в результате обнаружены какие-либо ошибки, откройте файл и исправьте их перед тем, как продолжить.

Когда всё готово, перезапустите Nginx для применения внесённых изменений:

$ sudo systemctl reload nginx

Шаг 5 - Создание файла PHP для проверки настроек

Теперь ваш стек LEMP должен быть полностью готов к работе. Мы можем проверить, что Nginx корректно передаёт .php файлы нашему обработчику PHP.

Для этого создадим тестовый PHP файл в корневой директории веб-сервера. Откройте файл с именем info.php в корневой директории веб-сервера с помощью текстового редактора:

$ sudo vim /var/www/html/info.php

Наберите или введите следующие строки в этот новый файл. Этот код PHP возвращает информацию о нашем сервере:

/var/www/html/info.php

<?php
phpinfo();
?>

После внесения изменений сохраните и закройте файл.

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

Откроем этот адрес:

localhost/info.php

Страница, на которую вы попадёте, должна выглядеть похожим образом:

страница PHPINFO

Если вы видите эту страницу, вы успешно настроили обработку PHP с помощью Nginx.

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

Удалим файл командой:

$ sudo rm /var/www/html/info.php

Заключение

Теперь у вас есть полностью настроенный стек LEMP на вашем сервере Ubuntu 16.04. Этот стек представляет собой прочный фундамент дальнейшей работы по предоставлению вашим пользователям веб-контента.

P.S.

Add the PPA

$ sudo add-apt-repository ppa:ondrej/php

Install your PHP Version

$ sudo apt-get update && sudo apt-get install php5.6

You can install php5.6 modules too for example

$ sudo apt-get install php5.6-mbstring php5.6-mcrypt php5.6-mysql php5.6-xml


Источник