--- source: https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-20-04-ru --- ## Введение Программный стек #LEMP — это комплекс программного обеспечения, используемый для обслуживания динамических веб-страниц и веб-приложений, написанных на #php. Аббревиатура LEMP обозначает операционную систему **L**inux с веб-сервером #nginx (произносится как «**э**нджинкс»). Данные серверной части хранятся в базе данных **M**ySQL, а динамическая обработка выполняется **P**HP. Это руководство рассказывает, как установить стек LEMP на сервер #Ubuntu 20.04. Операционная система Ubuntu обеспечивает выполнение первого требования. Далее мы расскажем, как настроить и запустить все остальные компоненты. ## Предварительные требования Для выполнения настоящего обучающего руководства вам понадобится доступ к серверу Ubuntu 20.04 в качестве обычного пользователя без прав root с привилегиями `sudo`, а на вашем сервере должен быть включен брандмауэр. Чтобы выполнить настройку, воспользуйтесь руководством по [первоначальной настройке сервера Ubuntu 20.04](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04). ## Шаг 1 — Установка веб-сервера Nginx Для демонстрации веб-страниц посетителям нашего сайта мы будем использовать современный и эффективный веб-сервер Nginx. Мы будем использовать диспетчер пакетов `apt` для получения этого программного обеспечения. Поскольку в этом сеансе мы будем использовать `apt` впервые, нужно обновить указатель пакетов вашего сервера. После этого вы можете использовать `apt install` для установки Nginx: При получении запроса введите `y` для подтверждения того, что вы хотите установить nginx. После завершения установки веб-сервер Nginx будет активирован и будет работать на вашем сервере Ubuntu 20.04. Если у вас включен брандмауэр `ufw`, как рекомендуется в руководстве по первоначальной настройке сервера, вам нужно разрешить подключение к Nginx. После установки Nginx регистрирует несколько разных профилей приложений #ufw. Чтобы проверить, какие из профилей ufw доступны, выполните команду: ```shell sudo ufw app list ``` ``` Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH ``` Рекомендуется применять самый ограничивающий профиль, который будет разрешать желаемый трафик. Поскольку в этом руководстве вы не настроили SSL для своего сервера, вам нужно будет только разрешить трафик на порту `80`. Для этого введите следующее: ```shell sudo ufw allow 'Nginx HTTP' ``` Для проверки изменения используйте команду: ```shell 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-адрес вашего сервера, вы можете найти его, введя в терминал следующую команду: ```shell ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//' ``` Команда выведет несколько IP-адресов. Вы можете попробовать каждый из них в своем браузере. Также вы можете проверить доступность IP-адреса из других мест в интернете: ```shell curl -4 icanhazip.com ``` Введите полученный адрес в браузер, и вы попадете на страницу Nginx по умолчанию: ``` http://server_domain_or_IP ``` ![[nginx_default.png]] Если вы видите эту страницу, значит, вы успешно установили Nginx и активировали трафик HTTP для вашего веб-сервера. ## Шаг 2 — Установка MySQL Мы запустили веб-сервер, и теперь нам нужно установить #СУБД, которая может хранить данные вашего сайта и управлять ими. #MySQL — популярная СУБД, используемая в средах PHP. Используйте `apt` для получения и установки этого программного обеспечения: ```shell sudo apt install mysql-server ``` Для подтверждения установки введите `Y`, а затем нажмите `ENTER`. После завершения установки рекомендуется запустить скрипт безопасности, предустановленный в MySQL. Этот скрипт будет удалять некоторые небезопасные настройки по умолчанию и блокировать доступ к системе управления базы данных. Для запуска интерактивного скрипта введите следующую команду: ```shell 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** в 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, набрав следующую команду: ```shell sudo mysql ``` В результате будет установлено подключение к серверу MySQL с помощью пользователя **root** базы данных с правами администратора, который логически выводится в результате использования `sudo` при запуске данной команды. Результат должен выглядеть следующим образом: ``` Welcome 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`. Это происходит, поскольку используемый по умолчанию метод аутентификации для пользователя MySQL с правами администратора — `unix_socket`, а не `password`. Хотя это может выглядеть как возможный источник проблем с безопасностью, на самом деле эти действия делают сервер базы данных более защищенным, поскольку единственные пользователи, которые могут выполнять вход в систему с правами доступа **root** для MySQL — это пользователи системы с привилегиями sudo, подключенные с использованием консоли или через приложение, использующее аналогичные привилегии. На практике это означает, что вы не сможете использовать пользователя **root** базы данных с правами администратора для подключения из вашего приложения PHP. Настройка пароля учетной записи **root** MySQL работает как гарантия, если метод аутентификации по умолчанию меняется с `unix_socket` на `password`. Для дополнительной безопасности рекомендуется иметь специальные учетные записи пользователей с менее обширными привилегиями, особенно если вы планируете использовать несколько баз данных на сервере. **Примечание.** На момент написания этого руководства родная библиотека MySQL PHP `mysqlnd` [не поддерживает](https://www.php.net/manual/en/ref.pdo-mysql.php) `caching_sha2_authentication`, метод аутентификации MySQL 8 по умолчанию. Поэтому при создании пользователей базы данных для приложений PHP на MySQL 8 вам нужно убедиться, что вместо этого пароля они настроены на использование `mysql_native_password`. Мы расскажем об этом в [шаге 6](https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-20-04-ru#step-6-%E2%80%94-testing-database-connection-from-php-(optional)). Теперь ваш сервер MySQL установлен и защищен. Далее мы выполним установку PHP, последнего компонента стека LEMP. ## Шаг 3 — Установка PHP Вы установили Nginx для обслуживания вашего контента и MySQL для хранения и управления данными. Теперь вы можете установить PHP для обработки кода и генерации динамического контента для веб-сервера. Хотя Apache встраивает интерпретатор PHP в каждый запрос, Nginx требуется внешняя программа для обработки PHP и организации моста между самим интерпретатором PHP и веб-сервером. Это позволяет обеспечить более высокую производительность на большинстве веб-сайтов на базе PHP, но для этого необходимо выполнить дополнительную настройку. Вы должны установить `php-fpm`, т. е. диспетчер процессов PHP #fastCGI, и указать Nginx на необходимость передачи запросов PHP данному программному обеспечению. Также вам потребуется `php-mysql`, модуль PHP, который позволяет PHP взаимодействовать с базами данных MySQL. Ключевые пакеты PHP автоматически будут установлены в качестве зависимостей. Для установки пакетов `php-fpm` и `php-mysql` воспользуйтесь следующей командой: При поступлении запроса введите `Y` и `ENTER` для подтверждения установки. Теперь вы установили компоненты PHP. Далее вы настроите Nginx для их использования. ## Шаг 4 — Настройка Nginx для использования процессора PHP При использовании веб-сервера Nginx вы можете создавать _блоки сервера_ (аналогичные виртуальным хостам в Apache) для инкапсуляции данных конфигурации и размещения на одном сервере нескольких доменов. В этом руководстве мы будем использовать **your_domain** в качестве примера доменного имени. Чтобы узнать больше о настройке доменного имени с помощью DigitalOcean, см. наше обучающее руководство [Введение в DigitalOcean DNS](https://www.digitalocean.com/docs/networking/dns/). В Nginx на Ubuntu 20.04 по умолчанию включен один серверный блок, настроенный для вывода документов из директории `/var/www/html`. Хотя это хорошо работает для отдельного сайта, при размещении нескольких сайтов это может доставлять неудобства. Вместо изменения `/var/www/html` мы создадим внутри `/var/www` структуру директорий для нашего сайта **your_domain**, оставив `/var/www/html​​​` в качестве директории по умолчанию для вывода в случае, если запросу клиента не соответствуют никакие другие сайты. Создайте корневую веб-директорию для **your_domain** следующим образом: ```shell sudo mkdir /var/www/your_domain ``` Затем необходимо назначить права владения для директории с помощью переменной среды $USER, которая будет использоваться для текущего системного пользователя: После этого откройте новый файл конфигурации в директории Nginx `sites-available` с помощью любого редактора командной строки. Мы будем использовать `nano`: В результате будет создан новый пустой файл. Вставьте следующую пустую конфигурацию: ``` 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/php7.4-fpm.sock; } location ~ /\.ht { deny all; } } ``` Ниже описано действие этих директив и блоков расположения: - `listen` — определяет, что будет прослушивать порт Nginx. В данном случае он будет прослушивать порт `80`, используемый по умолчанию для протокола HTTP. - `root` — определяет корневую директорию документа, где хранятся файлы, обслуживаемые этим сайтом. - `index` — задает для Nginx приоритет обслуживания файлов индекса для этого сайта. Довольно часто вы указываете файлы `index.html`, которые имеют высший приоритет по сравнению с файлами `index.php`, чтобы обеспечить быструю настройку начальной страницы в приложениях PHP. Вы можете менять эти настройки в зависимости от потребностей вашего приложения. - `server_name` — определяет, на какие доменные имена и/или IP-адреса должен реагировать ваш серверный блок. **Эта директива должна указывать на доменное имя или публичный IP-адрес вашего сервера.** - `location /` — первый блок расположения включает директиву `try_files`, которая проверяет наличие файлов или директорий, соответствующих запросу URI. Если Nginx не сможет найти соответствующий ресурс, будет возвращена ошибка 404. - `location ~ \.php$` — этот блок расположения отвечает за фактическую обработку PHP посредством указания Nginx на файл конфигурации `fastcgi-php.conf` и файл `php7.4-fpm.sock`, который объявляет, какой сокет ассоциирован с `php-fpm`. - `location ~ /\.ht` — последний блок расположения отвечает за файлы `.htaccess`, которые Nginx не обрабатывает. При добавлении директивы `deny all`, если любой из файлов `.htaccess` попадет в корневую директорию документа, они не будут выводиться посетителям. Когда вы закончите редактирование, сохраните и закройте файл. Если вы используете `nano`, можно ввести `CTRL+X`, а затем `y` и `ENTER` для подтверждения. Активируйте вашу конфигурацию посредством привязки к файлу конфигурации из директории Nginx `sites-enabled`: ```shell sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/ ``` Это укажет Nginx использовать эту конфигурацию в следующий раз при перезагрузке. Вы можете протестировать вашу конфигурацию на наличие ошибок синтаксиса с помощью команды: Если есть какие-либо ошибки, вернитесь в файл конфигурации и проверьте его содержание перед тем, как продолжить. Когда будете готовы, перезагрузите Nginx для внесения необходимых изменений: Теперь ваш новый веб-сайт активен, но корневая веб-директория `/var/www/your_domain` все еще пуста. Создайте файл `index.html` в этом расположении, чтобы убедиться, что веб-сервер работает, как ожидалось: Внесите в файл следующее: ```html your_domain website

Hello World!

This is the landing page of your_domain.

``` Теперь откройте браузер и получите доступ к доменному имени сервера или IP-адресу, как указано в директиве `server_name` в файле конфигурации вашего серверного блока: ``` http://server_domain_or_IP ``` Страница будет выглядеть следующим образом: ![[landing_page.png]] Если вы видите эту страницу, это означает, что ваш серверный блок Nginx работает, как и ожидалось. Вы можете оставить этот файл в качестве временной начальной страницы для вашего приложения, пока не настроите файл `index.php` для его замены. Как только вы сделаете это, не забудьте удалить или переименовать файл `index.html` из корневой директории документов, так как он будет иметь приоритет перед фалом `index.php` по умолчанию. Теперь ваш стек LEMP полностью настроен. В следующем шаге мы создадим скрипт PHP для проверки способности Nginx обрабатывать файлы `.php` на вашем недавно настроенном веб-сайте. ## Шаг 5 — Тестирование PHP с помощью Nginx Теперь набор LEMP должен быть полностью настроен. Вы можете протестировать его, чтобы убедиться, что Nginx может правильно передавать файлы `.php` на процессор PHP. Вы можете сделать это, создав тестовый файл PHP в корневой директории документов. Откройте в своем текстовом редакторе новый файл с именем `info.php` внутри корневой директории документов: Введите или вставьте следующие строки в новый файл. Это корректный код PHP, который будет возвращать информацию о вашем сервере: ```php TODO
    "; foreach($db->query("SELECT content FROM $table") as $row) { echo "
  1. " . $row['content'] . "
  2. "; } echo "
"; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "
"; die(); } ``` Сохраните и закройте файл после завершения редактирования. Теперь вы можете получить доступ к этой странице в веб-браузере, посетив доменное имя или публичный IP-адрес, настроенный для вашего веб-сайта, добавив `/todo_list.php` в конце: ``` http://server_domain_or_IP/todo_list.php ``` Вы должны увидеть примерно следующую страницу, отображающую содержимое, которое вы добавили в тестовую таблицу: ![[todo_list.png]] Это означает, что ваша среда PHP готова к подключению и взаимодействию с вашим сервером MySQL. ## Заключение С помощью этого руководства мы создали гибкую основу для обслуживания веб-сайтов PHP и приложений для ваших посетителей, используя Nginx в качестве веб-сервера и MySQL в качестве системы управления базы данных. Теперь можно выполнить ряд последующих шагов. Например, вы можете проверить защищенность соединений с вашим сервером. Для этого вы можете [обеспечить безопасность установки Nginx с помощью Let’s Encrypt](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04). Следуя указаниям настоящего руководства, вы получите бесплатный сертификат TLS/SSL для вашего сервера, который позволит ему обслуживать контент через протокол HTTPS. ### Want to learn more? Join the DigitalOcean Community! Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in our Questions & Answers section, find tutorials and tools that will help you grow as a developer and scale your project or business, and subscribe to topics of interest. [Sign up](https://www.digitalocean.com/api/dynamic-content/v1/login?success_redirect=https%3A%2F%2Fwww.digitalocean.com%2Fcommunity%2Ftutorials%2Fhow-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-20-04-ru&error_redirect=https%3A%2F%2Fwww.digitalocean.com%2Fauth_error)