Установка Nginx, PHP и MySQL/MariaDB на Debian 9 (Stretch)
Кратко: шаг за шагом разворачиваем стек LEMP на Debian 9: устанавливаем Nginx, настраиваем PHP через PHP-FPM, подключаем MySQL или MariaDB, включаем SSL (самоподписанный или Let’s Encrypt) и добавляем базовые меры безопасности и проверки. Подходит для локальных серверов и VPS. Порядок действий: обновление системы → установка Nginx → установка СУБД → PHP-FPM → настройка виртуального хоста → SSL → проверка и жёсткая настройка.
Важно: в примерах используется hostname server1.example.com и IP 192.168.1.100 — замените их на свои значения.
Определения в одну строку
- Nginx: высокопроизводительный HTTP-сервер и реверс-прокси.
- PHP-FPM: менеджер процессов PHP для работы через FastCGI.
- MySQL/MariaDB: сервера реляционных баз данных.
- LEMP: Linux + (e)nginx + MySQL/MariaDB + PHP.
Оглавление
- Предварительная заметка
- Обновление Debian
- Установка Nginx
- Установка MySQL или MariaDB
- Установка MySQL
- Установка MariaDB
- Установка PHP (PHP-FPM)
- Конфигурация Nginx для PHP
- Настройка PHP (php.ini и pool)
- Подключение MySQL/MariaDB к PHP
- Опционально: переключение на TCP для PHP-FPM
- Включение SSL и HTTP/2 (самоподписанный и Let’s Encrypt)
- Виртуальная машина (OVA/OVF)
- Рекомендации по безопасности и жёсткая настройка
- Тесты, сценарии приёмки, откат и отладка
- Чеклист развертывания (SOP)
- Альтернативные подходы и сценарии, где это не подойдёт
- Краткое резюме
- Ссылки
Предварительная заметка
В примерах используется hostname server1.example.com и IP 192.168.1.100. Эти значения нужно заменить на ваши. Предполагается работа на Debian 9 (Stretch) с привилегиями root или sudo.
Обновление Debian
Рекомендуется обновить списки пакетов и установить доступные обновления перед началом.
apt-get update
apt-get upgrade -yЕсли планируете редактировать конфигурационные файлы вручную, удобно установить nano:
apt-get -y install nanoСовет: работайте в консоли с доступом по SSH, убедитесь, что у вас резервная копия конфигураций перед изменением.
Установка Nginx
Nginx доступен в стандартных репозиториях Debian 9:
apt-get -y install nginxЗапустите службу:
systemctl start nginx.serviceОткройте в браузере http://192.168.1.100 (или ваш IP/домен) — вы увидите стартовую страницу Nginx.

Пояснение: корневая директория по умолчанию — /var/www/html.
Установка MySQL или MariaDB
Выберите один движок: MySQL или MariaDB. Устанавливать оба одновременно не стоит — это приведёт к конфликтам пакетов и сокетов.
Установка MySQL
Для MySQL рекомендуется подключить официальный репозиторий Oracle, чтобы получать актуальные пакеты:
cd /tmp
wget https://dev.mysql.com/get/mysql-apt-config_0.8.9-1_all.deb
dpkg -i mysql-apt-config_0.8.9-1_all.debВ процессе установки пакета репозитория выберите OK и укажите версию (в примере MySQL 5.7).

Затем обновите индекс пакетов и установите сервер и клиент:
apt-get update
apt-get -y install mysql-community-client mysql-community-serverИнсталлятор запросит пароль для пользователя root в MySQL — задайте длинный и надёжный пароль.
Установка MariaDB
Если вы предпочитаете MariaDB (форк MySQL с открытой моделью разработки), установите так:
apt-get -y install mariadb-server mariadb-clientMariaDB не задаёт пароль root при установке. Запустите скрипт для базовой защиты:
mysql_secure_installationПример ответов:
Change the root password? [Y/n] y
New password: <введите пароль>
Re-enter new password: <повтор>
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Примечание: если вы планируете использовать удалённые подключения к СУБД, вместо запрета внешних подключений настройте firewall и отдельного DB-пользователя с нужными привилегиями.
Установка PHP (PHP-FPM)
Для работы PHP с Nginx используется PHP-FPM — рекомендуемый способ.
apt-get -y install php7.0-fpmPHP-FPM запускается как systemd-сервис php7.0-fpm.service и по умолчанию слушает unix-сокет /var/run/php/php7.0-fpm.sock.
Конфигурация Nginx для PHP
Откройте главный конфиг (или правьте сайт в sites-available):
nano /etc/nginx/nginx.confРекомендуется установить keepalive_timeout на небольшое значение, например 2 секунды:
[...]
keepalive_timeout 2;
[...]Далее правим виртуальный хост по умолчанию:
nano /etc/nginx/sites-available/defaultПример файла (с добавленной поддержкой PHP):
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 _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}Обратите внимание на строку fastcgi_pass — оставьте unix-сокет для лучшей производительности, если нет необходимости в TCP.
Примените изменения:
systemctl reload nginx.serviceНастройка PHP (php.ini и pool)
Откройте конфигурацию php.ini для FPM:
nano /etc/php/7.0/fpm/php.iniОсновные параметры, которые стоит изменить:
- Отключаем cgi.fix_pathinfo, чтобы предотвратить возможные проблемы с обработкой путей:
cgi.fix_pathinfo=0- Увеличьте лимиты для загрузки файлов при необходимости:
post_max_size = 25M
upload_max_filesize = 20MM означает мегабайты. Для больших загрузок увеличьте до 500M или больше, но помните про доступную память и дисковое пространство.
- Установите локальную временную зону:
date.timezone = 'Europe/Berlin'Перезагрузите PHP-FPM:
systemctl reload php7.0-fpm.serviceСоздайте тестовую страницу в корне документации:
nano /var/www/html/info.phpВставьте:
Откройте в браузере http://192.168.1.100/info.php — вы должны увидеть страницу с информацией о PHP и строкой Server API, которая должна содержать FPM/FastCGI.

Если MySQL не отображается в списке модулей, необходимо установить соответствующие расширения.
Подключение MySQL/MariaDB к PHP
Установите драйвер MySQL для PHP и другие нужные модули:
apt-cache search php7.0Затем установите выбранные модули, пример большого набора популярных расширений:
apt-get -y install php7.0-mysqlnd php7.0-curl php7.0-gd php7.0-intl php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xslПерезагрузите PHP-FPM:
systemctl reload php7.0-fpm.serviceОбновите страницу info.php — в разделе модулей должны появиться MySQLi и mysqlnd.

Переключение PHP-FPM на TCP (опционально)
По умолчанию unix-сокеты быстрее и безопаснее. Но если нужно, чтобы PHP-FPM слушал TCP-порт (например, при распределении нагрузки или контейнеризации), измените pool-конфигурацию:
nano /etc/php/7.0/fpm/pool.d/www.confИзмените listen:
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000Перезагрузите сервис:
systemctl reload php7.0-fpm.serviceИ в nginx замените fastcgi_pass на TCP:
fastcgi_pass 127.0.0.1:9000;Затем:
systemctl reload nginx.serviceЗамечание: при использовании TCP учитывайте брандмауэр и ограничения на открытые порты.
Включение SSL и HTTP/2 в Nginx
Сегодня почти все сайты требуют HTTPS. Вы можете использовать самоподписанный сертификат для внутренних систем или получить бесплатный сертификат от Let’s Encrypt для публичных доменов.
Общее правило: если у вас нет публичного домена — используйте самоподписанный сертификат; если домен есть и DNS указывает на сервер — используйте Let’s Encrypt.
Самоподписанный сертификат
Создайте приватный ключ:
openssl genrsa -out /etc/ssl/private/nginx.key 4096Создайте самоподписанный сертификат (команда запросит данные для сертификата):
openssl req -new -x509 -key /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.pem -days 3650
Добавьте в конфигурацию nginx секцию для SSL (пример для /etc/nginx/sites-available/default):
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
ssl on;
ssl_certificate_key /etc/ssl/private/nginx.key;
ssl_certificate /etc/ssl/certs/nginx.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:...:!DSS';
ssl_prefer_server_ciphers on;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / { try_files $uri $uri/ =404; }
location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; }
location ~ /\.ht { deny all; }
}Перезапустите nginx:
systemctl restart nginx.serviceПри обращении по HTTPS браузер покажет предупреждение о самоподписанном сертификате — это ожидаемо.

Let’s Encrypt (бесплатный, для публичных доменов)
Установите Certbot и плагин для nginx:
apt-get -y install certbot python-certbot-nginxВ конфигурации сайта укажите real domain:
server_name example.com www.example.com;Запрос сертификата (пример):
certbot --nginx -d example.com -d www.example.comЕсли предпочитаете webroot-метод:
certbot certonly --webroot -w /var/www/html -d example.com -d www.example.comСледуйте подсказкам Certbot: укажите email для уведомлений о продлении, согласитесь с условиями.
После получения сертификата укажите пути в nginx-конфиге:
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;Перезапустите nginx:
systemctl restart nginx.serviceВажно: Let’s Encrypt выпускает сертификаты на 90 дней — настройте автоматическое продление (certbot renew) через cron/systemd timer.
Виртуальная машина (OVA/OVF)
Автор оригинального руководства предоставляет OVA/OVF образ для подписчиков. Этот раздел описывает основные логины и параметры образа:
SSH логин:
- Username: administrator
- Password: howtoforge
Для получения root:
su
# ввод пароля howtoforgeMySQL логин:
- Username: root
- Password: howtoforge
Изображение использует статический IP 192.168.1.100; изменение производится в файле /etc/network/interfaces.
Из соображений безопасности смените пароли сразу после первого запуска.
Рекомендации по безопасности и жёсткая настройка
Этот раздел даёт практические рекомендации по защите сервера после базовой установки.
Обновления и патчинг
- Регулярно выполняйте apt-get update && apt-get upgrade.
- Для критичных систем рассмотрите автоматические обновления безопасности для пакетов безопасности.
Пользователи и доступ
- Отключите root-доступ по SSH, используйте sudo.
- Настройте аутентификацию по ключам SSH и запретите парольную аутентификацию.
Брандмауэр
- Используйте UFW/iptables для открытия только необходимых портов (обычно 22, 80, 443).
- При использовании TCP-подключения PHP-FPM убедитесь, что порт 9000 доступен только локально (127.0.0.1) или в пределах защищённой сети.
Ограничения PHP-FPM
- В pool-конфигурациях (/etc/php/7.0/fpm/pool.d/*.conf) установите pm.max_children, pm.start_servers, pm.max_requests в соответствии с ресурсами сервера.
SSL/TLS
- Отключите устаревшие протоколы и шифры (оставляйте TLSv1.2 и выше).
- Проверяйте конфигурацию через внешние тесты (например, Qualys SSL Labs) для публичных сайтов.
Окружающая безопасность
- Ограничьте права файлов для /var/www/html (используйте www-data как владельца и минимальные права).
- Храните приватные ключи в /etc/ssl/private с правами 600.
Логи и мониторинг
- Настройте ротацию логов (logrotate).
- Подключите мониторинг (например, Prometheus, Zabbix) и оповещения о падениях сервисов.
Базы данных
- Используйте отдельного пользователя БД с минимальными привилегиями для приложений.
- Не используйте root-пользователя БД в приложениях.
Тесты, сценарии приёмки и откат
Критерии приёмки (минимум):
- Nginx служба активна и отвечает на порт 80 (curl http://IP должен вернуть HTTP 200).
- PHP-FPM отвечает через указанный сокет/порт и phpinfo() показывает FPM.
- Модули MySQL/МariaDB подключены к PHP (MySQLi/mysqlnd видны в phpinfo).
- HTTPS сайт корректно отдает сертификат; для Let’s Encrypt — certbot renew проходит в тестовом режиме.
Тестовые сценарии (пример):
- Проверка HTTP: curl -I http://127.0.0.1 → ожидать 200 OK.
- Проверка PHP: curl http://127.0.0.1/info.php → наличие строки “PHP Version” и “FPM/FastCGI”.
- Проверка DB: выполнить простой PHP-скрипт, который подключается к базе и делает SELECT 1.
- Проверка SSL: openssl s_client -connect example.com:443 -showcerts → проверить цепочку.
Откат изменений (общая методика):
Перед правками делайте резервные копии файлов конфигурации:
cp /etc/nginx/sites-available/default /root/default.bak
cp /etc/php/7.0/fpm/php.ini /root/php.ini.bakЕсли nginx перестал стартовать после правок, проверьте конфигурацию:
nginx -t
systemctl restart nginx.service
Если не стартует — восстановите конфиг из бекапа и перезапустите.Для отката SSL-замените пути сертификатов на рабочие и перезапустите nginx.
Чеклист развёртывания (SOP)
- Обновить систему: apt-get update && apt-get upgrade -y.
- Установить nginx: apt-get -y install nginx.
- Установить СУБД (MySQL или MariaDB) и выполнить mysql_secure_installation.
- Установить php7.0-fpm и необходимые расширения.
- Настроить nginx vhost и включить обработку .php через fastcgi_pass.
- Настроить php.ini (cgi.fix_pathinfo=0, timezone, лимиты).
- Перезагрузить службы: systemctl reload php7.0-fpm.service && systemctl reload nginx.service.
- Установить SSL (самоподписанный или Let’s Encrypt) и тестировать HTTPS.
- Настроить firewall и SSH (ключи, запрет root).
- Настроить мониторинг и бэкапы.
Рассмотрите автоматизацию через Ansible/Terraform для повторяемости.
Альтернативы и случаи, где это не подходит
Когда этот подход не подойдёт:
- Если требуется классический LAMP с .htaccess и модульным Apache — используйте Apache вместо Nginx.
- Для быстрого тестирования нескольких сайтов или изолированных окружений удобнее использовать контейнеры (Docker) и готовые образы.
- На очень ограниченных по ресурсам системах иногда проще использовать лёгкие языки и серверы (например, Caddy или небольшой статический сервер).
Альтернативные подходы:
- LAMP (Linux + Apache + MySQL + PHP) — если нужны .htaccess и mod_php.
- Docker-compose с сервисами nginx, php-fpm и mariadb — удобно для CI/CD.
- Использовать управляемые БД (RDS/Cloud SQL) и управляемый CDN/SSL в облаке.
Ментальные модели и эвристики
- Минимальная поверхность атаки: меньше сервисов = меньше точек входа.
- Unix-сокет лучше TCP, если все службы на одном хосте.
- Разделение обязанностей: Nginx — статический контент и прокси, PHP-FPM — интерпретация PHP, БД — хранение данных.
- Принцип наименьшей привилегии: никогда не давать приложению больше прав, чем нужно.
Факт-бокс: ключевые параметры
- Порты: HTTP 80, HTTPS 443, SSH 22, PHP-FPM (по умолчанию unix-сокет или 127.0.0.1:9000).
- Размер сертификата: RSA 2048+ (рекомендуется 4096 для самоподписанных ключей).
- Сертификаты Let’s Encrypt: срок 90 дней, автоматическое продление рекомендуется.
- PHP-FPM сокет: /var/run/php/php7.0-fpm.sock.
Совместимость и миграция
- При переходе с Apache убедитесь, что все правила .htaccess переведены в синтаксис nginx (rewrite, try_files).
- При обновлении PHP (7.0 → 7.1/7.2 и выше) проверьте совместимость расширений и синтаксис кода.
- Для миграции базы — используйте дамп (mysqldump) и импорт в целевую СУБД.
Краткое объявление для команды (100–200 слов)
Мы развернули стандартный стек LEMP на Debian 9: Nginx + PHP-FPM + MySQL/MariaDB. Сервер отвечает по HTTP и HTTPS, PHP работает через FPM, подключение к базе протестировано. Для публичных доменов применён Let’s Encrypt; для локальных окружений можно использовать самоподписанный сертификат. В настройках включены базовые меры безопасности: cgi.fix_pathinfo отключён, лимиты upload/post настроены, доступ по SSH по ключам рекомендуется. Перед изменением конфигурации делайте резервные копии и тестируйте nginx -t. Для автоматизации развертывания рекомендую создать Ansible playbook, включающий установку пакетов, создание пользователей и настройку firewall.
Краткое резюме
- Nginx и PHP-FPM — производительное сочетание для PHP-приложений.
- Используйте unix-сокет для локального взаимодействия, TCP — при распределении нагрузки.
- Настройте SSL: Let’s Encrypt для публичных доменов, самоподписанный — для тестовых сред.
- Внедрите базовую безопасность: SSH-ключи, firewall, обновления, правильные права на файлы.
Ссылки
- nginx: https://nginx.net/
- PHP: http://www.php.net/
- MySQL: https://www.mysql.com/
- MariaDB: https://mariadb.org/
- Debian: https://www.debian.org/
Важное
- Перед применением конфигураций на проде сделайте тестирование на стенде и резервирование конфигураций.
- Если у вас сложная среда (балансировщики, CDN, облачные базы), адаптируйте конфигурации под архитектуру.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента