LEMP - это аббревиатура, обозначающая следующий стек программного обеспечения: ядро Linux, веб-сервер Nginx, база данных MariaDB (или MySQL) и язык программирования PHP на стороне сервера. Это программное обеспечение сегодня широко используется на серверах в Интернете для создания динамических веб-сайтов или интерактивных веб-приложений.
Nginx - это современный и ресурсоэффективный веб-сервер, который активно развивается и является вторым по использованию веб-сервером в Интернете после HTTP-сервера Apache. Он особенно быстр, поскольку использует асинхронный, событийно-ориентированный подход к обработке запросов.
В этом руководстве показано, как установить и настроить стек LEMP (Nginx с MariaDB и PHP ) на последней версии Debian.
ТРЕБОВАНИЯ
- Последняя версия операционной системы Debian , которую можно получить по следующей ссылке https://www.debian.org/CD/http-ftp/, установленная с нуля на VPS, виртуальной машине или непосредственно на выделенной машине.
- Прямой доступ к консоли сервера или удаленное SSH-соединение.
- Сетевой интерфейс, настроенный на статический IP-адрес машины.
- Зарегистрированное публичное доменное имя с записями A и CNAME (www) DNS, настроенными на стороне сервера имен. В данном руководстве в качестве примера мы используем домен example.com.
Шаг 1: Начальная конфигурация
Первым шагом будет вход в систему с правами root или пользователя с правами root в вашей системе и обновление компонентов Debian 10 (обновление ядра, обновление пакетов и исправления безопасности), выполнив следующие команды.
1 2 3 | sudo apt update sudo apt upgrade sudo apt dist-upgrade |
Далее необходимо добавить описательное имя для имени хоста вашей машины, выполнив следующую команду. Затем необходимо перезагрузить систему, чтобы применить новое имя хоста.
1 | sudo hostnamectl set-hostname hostname.yourdomain.com |
1 | sudo init 6 |
Далее установите утилиты net-tools wget, curl и bash-completion, чтобы использовать их в дальнейшем для простого администрирования вашего сервера Debian.
1 | sudo apt install net-tools sudo wget curl bash-completion |
Шаг 2: Установка веб-сервер Nginx
Nginx - это современный и ресурсоэффективный веб-сервер, используемый для отображения веб-страниц посетителям в интернете. Установите веб-сервер Nginx из репозитория Debian 10, выполнив следующую команду в консоли вашего сервера.
1 | sudo apt-get install nginx |
Как показано на изображении выше, менеджер пакетов apt проверит дополнительные зависимости для пакета и спросит вас, согласны ли вы продолжить процесс установки. Ответьте "да" (y), чтобы установить Nginx.
Далее выполните команду netstat для отображения сетевых сокетов в вашей системе и проверьте, прослушивает ли демон nginx порт 80/TCP. В качестве альтернативы можно выполнить команду systemctl, чтобы проверить состояние демона nginx, как показано на рисунке ниже.
1 2 3 | sudo netstat -tlp sudo netstat -tlpn sudo systemctl status nginx.service |
После того как сервер nginx запущен и работает в вашей системе, введите команду ifconfig, чтобы отобразить информацию о сетевых интерфейсах и список IP-адресов вашей машины. Затем откройте браузер и посетите веб-страницу Nginx по умолчанию по протоколу HTTP, добавив IP-адрес в браузер. В окне браузера должно появиться сообщение "Wellcome to Nginx!".
http://www.example.com или IP адрес машины.
Шаг 3: Включение протокола HTTP/2.0 в Nginx
По умолчанию последние версии двоичных файлов Nginx, предоставляемые репозиториями Debian, построены с использованием протокола HTTP/2.0. HTTP/2.0 интегрирован с протоколами TSL/SSL и может улучшить скорость загрузки веб-страниц благодаря защищённым транзакциям.
Все современные браузеры, такие как Chrome или Firefox, должны поддерживать этот протокол по умолчанию. Однако обратите внимание, что браузеры Microsoft Internet Explorer и Microsoft Edge пока не могут анализировать протокол http2.
Чтобы включить протокол HTTP/2.0 в Nginx на Debian 10, необходимо внести некоторые изменения в стандартный файл конфигурации Nginx или создать новый файл конфигурации и добавить блок кода TLS для серверов 443. Для этого сначала создайте резервную копию стандартной конфигурации Nginx sites-available, выполнив следующую команду. Убедитесь, что резервное копирование прошло успешно, просмотрев содержимое каталога sites-available.
1 | sudo cp /etc/nginx/sites-available/default{,.backup} |
1 | ls /etc/nginx/sites-available/ |
Далее создайте файл конфигурации Nginx TLS с помощью текстового редактора и добавьте в него следующее содержимое.
1 | sudo nano /etc/nginx/sites-available/default-ssl |
содержимое файла default-ssl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; #server_name www.domain.tld; server_name _; root /var/www/html; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; #SSL Certificates ssl_certificate "/etc/nginx/ssl/cert.pem"; ssl_certificate_key "/etc/nginx/ssl/privekey.pem"; ssl_dhparam /etc/nginx/ssl/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=31536000; #includeSubDomains" always; location / { index index.php index.html index.htm; try_files $uri $uri/ /index.php?$args $uri/ =404; } set $cache_uri $request_uri; location ~ /.well-known { allow all; } location ~ \.php$ { include snippets/fastcgi-php.conf; # # With php-fpm (or other unix sockets): fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } |
Параметр, разрешающий использование протокола HTTP/2.0, представлено словом http2 из приведенной ниже строки.
1 | listen 443 ssl http2 default_server; |
Если браузеры ваших посетителей не поддерживают протокол HTTP2, удалите слово http2 из конфигурации вашего сервера, чтобы отключить протокол, и перезапустите службу nginx для применения изменений.
Если у вас есть зарегистрированный домен или вы используете виртуальный хостинг на основе IP-адресов, вам следует добавить ваше доменное имя или IP-адрес после директивы server_name, как показано в примере ниже.
1 | server_name www.example.com example.com; |
Настройка SSL в Nginx
В приведенном выше файле конфигурации TSL для nginx мы указали путь для сертификата и ключа TLS. Поскольку мы еще не установили ключи в вашей системе, введите следующую команду для генерации файла самоподписанного SSL сертификата и ключа. Во время генерации SSL-сертификата вам будет задан ряд вопросов. Введите двухзначный код вашей страны, штата или провинции, название вашего города, название вашей организации, название подразделения вашей организации, общее имя вашего сервера и действительный адрес электронной почты. Вы должны убедиться, что Общее имя совпадает с FQDN-записью вашего компьютера с DNS-сервера или IP-адресом вашего сервера, используемого для доступа к веб-сайту. Сертификат и ключ хранятся в новом каталоге в каталоге nginx под названием ssl, как показано на следующем снимке экрана.
1 | sudo mkdir /etc/nginx/ssl |
1 | sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/nginx/ssl/privekey.pem -out /etc/nginx/ssl/cert.pem |
1 | ls /etc/nginx/ssl/ |
Также создайте новый сильный шифр Диффи-Хеллмана, который можно найти в вышеуказанном конфигурационном файле в строке оператора ssl_dhparam, выполнив следующую команду:
1 | sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096 |
Наконец, после генерации ключа Диффи-Хеллмана активируйте файл конфигурации TLS, создав символическую ссылку для файла конфигурации default-ssl из каталога sites-available в каталог sites-enabled, выполнив следующую команду.
1 | sudo ln -s /etc/nginx/sites-available/default-ssl /etc/nginx/sites-enabled/ |
Далее проверьте конфигурационный файл Nginx на синтаксические ошибки и, если все в порядке, перезапустите демон Nginx, чтобы применить все изменения, выполнив следующие команды.
1 | sudo nginx -t |
1 | sudo systemctl restart nginx.service |
Проверка успешности конфигурации SSL
Чтобы убедиться, что веб-сервер Nginx привязан к SSL-порту, выполните команду netstat и проверьте, отображается ли порт 443 в режиме прослушивания.
1 | sudo netstat -tlpn | grep nginx |
Приведенный ниже скриншот иллюстрирует описанные выше шаги.
Затем перейдите на доменное имя или IP-адрес вашего сервера по протоколу HTTP в браузере, чтобы отобразить страницу nginx по умолчанию. Поскольку вы используете самоподписанные сертификаты, в браузере должна появиться ошибка. Подтвердите ошибку, чтобы перейти на главную страницу nginx по умолчанию.
Если Nginx не предоставляет страницу index.html по умолчанию в каталоге webroot, выполните следующую команду для создания индексной страницы.
1 | echo "test page" | sudo tee /var/www/html/index.html |
Чтобы подтвердить наличие протокола HTTP/2.0, рекламируемого Nginx, выполните следующую команду. Ищите слово h2 в протоколах, используемых сервером.
1 | openssl s_client -connect localhost:443 -nextprotoneg ' ' |
Вы также можете проверить состояние соединения и используется ли протокол http2 сервером Nginx из браузера Chrome, нажав функциональную клавишу F12 и запросив страницу. Для того чтобы показать протокол, используемый запросом, перейдите на вкладку Сеть, щелкните правой кнопкой мыши на меню Тип и отметьте пункт Протокол. Протокол HTTP2 должен отображаться как h2 в столбце Текущий протокол.
Шаг 4: Установка PHP
Веб-сервер Nginx может обслуживать динамический веб-контент с помощью интерпретатора языка программирования PHP через менеджер процессов PHP FastCGI, которому Nginx передает запросы для обработки. Менеджер процессов FastCGI можно получить, установив предварительно скомпилированный пакет php-fpm, предлагаемый официальными репозиториями Debian.
Чтобы установить менеджер процессов php-fpm и интерпретатор PHP в систему вместе с дополнительными пакетами, которые позволят PHP взаимодействовать с веб-сервером Nginx, выполните следующую команду на консоли вашего сервера:
1 | sudo apt install php php-fpm php-curl php-gd |
Запуск PHP-FPM
После успешной установки интерпретатора PHP 7.4 в системе запустите и проверьте демон php7.4-fpm, выполнив следующую команду:
1 2 | sudo systemctl start php7.4-fpm sudo systemctl status php7.4-fpm |
В приведенном выше файле конфигурации TLS Nginx мы уже добавили блок конфигурации для менеджера процессов PHP FastCGI, чтобы обслуживать динамический контент. Блок кода, позволяющий Nginx использовать интерпретатор PHP, показан в приведенной ниже выдержке, поэтому дальнейшие шаги по изменению конфигурационного файла TSL Nginx не требуются. Знак хэштега # в начале строк на скриншоте ниже - это комментарии. Закомментированные строки из конфигурационных файлов по умолчанию игнорируются веб-сервером Nginx.
1 2 3 4 | location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; } |
Тестовая конфигурация PHP
Для того чтобы протестировать и проверить, может ли Nginx корректно передавать php-файлы процессору PHP, создайте тестовый конфигурационный файл PHP info.php, выполнив следующую команду
1 | sudo su -c 'echo "<?php phpinfo(); ?>" > /var/www/html/info.php' |
Затем посетите страницу php info в вашем веб-браузере, перейдя на доменное имя вашего сервера или публичный IP-адрес, а затем /info.php, как показано на изображении ниже.
https://www.example.com/info.php
или
http://[ip адерс сервера]/info.php
Вы также можете проверить, рекламируется ли протокол HTTP/2.0 на сервере, найдя строку $_SERVER['SERVER_PROTOCOL'] в переменных PHP.
Чтобы установить другие модули PHP, выполните команду apt search php, чтобы найти конкретный модуль PHP и установить его. Если вы планируете установить систему управления контентом, например, WordPress, то установите эти дополнительные модули:
1 | sudo apt install php-mbstring |
Однако вновь установленные модули PHP не включены по умолчанию в вашей системе. Чтобы активировать их, перезапустите службу PHP-FPM.
1 | sudo systemctl restart php7.4-fpm.service |
Шаг 5: Установите базу данных MariaDB
Наконец, последний кусочек головоломки стека LAMP - база данных. Компонент LEMP базы данных MariaDB используется для хранения записей в таблицах и столбцах. Он будет динамически управлять данными веб-приложения. Чтобы установить MariaDB, выполните следующую команду в консоли вашего сервера. Затем перезапустите демон PHP FPM, чтобы включить модуль PHP-MySQL, который необходим для доступа к базе данных.
1 | sudo apt install mariadb-server mariadb-client php-mysql |
1 | sudo systemctl restart php7.4-fpm.service |
По умолчанию учетная запись root системы или пользователи с привилегиями root могут получить доступ к базе данных без ввода пароля. Чтобы изменить это поведение, чтобы MySQL запрашивала пароль каждый раз, когда системный пользователь пытается получить доступ к базе данных, войдите в базу данных MySQL с помощью интерфейса командной строки с привилегиями root и выполните следующие команды в консоли MySQL:
1 | sudo mysql -u root |
1 2 3 4 | use mysql; update user set plugin='' where User='root'; flush privileges; exit; |
Установите пароль root в MariaDB
На следующем этапе убедитесь, что вы защитили MariaDB, выполнив сценарий безопасности mysql_secure_installation. Он поставляется в установочном пакете из репозиториев Debian. Во время выполнения скрипт задаст ряд вопросов, предназначенных для обеспечения безопасности базы данных MariaDB. Такие как: изменить пароль MySQL root, удалить анонимных пользователей, отключить удаленные логины root, удалить тестовую базу данных. Выполните скрипт, введя приведенную ниже команду. Ответьте "да" на все заданные вопросы, чтобы полностью обезопасить демон MySQL. Используйте приведенный ниже вывод скрипта только в качестве руководства.
1 | sudo mysql_secure_installation |
1 2 3 4 5 6 7 8 9 10 11 12 | Switch to unix_socket authentication [Y/n] <strong>Y</strong> Change the root password? [Y/n] <strong>Y</strong> New password: Remove anonymous users? [Y/n] <strong>Y</strong> Disallow root login remotely? [Y/n] <strong>Y</strong> Remove test database and access to it? [Y/n] <strong>Y</strong> Reload privilege tables now? [Y/n] <strong>Y</strong> |
Заключение
Вот и все! Веб-сервер Nginx, база данных MariaDB и язык программирования PHP установлены на вашей машине Debian. Теперь вы можете начать создавать динамические веб-сайты или веб-приложения для своих посетителей.