Гид по технологиям

Установка Nginx, PHP и MySQL/MariaDB на Debian 9 (Stretch)

• 10 min read • Серверы • Обновлено 28 Nov 2025
Nginx + PHP + MySQL на Debian 9 — руководство
Nginx + PHP + MySQL на Debian 9 — руководство

Кратко: шаг за шагом разворачиваем стек 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.

Стартовая страница 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).

Выбор стабильной версии MySQL

Затем обновите индекс пакетов и установите сервер и клиент:

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-client

MariaDB не задаёт пароль 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-fpm

PHP-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 = 20M

M означает мегабайты. Для больших загрузок увеличьте до 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.

Информация PHP-FPM

Если 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 с поддержкой MySQL

Переключение 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

Создание SSL сертификата OpenSSL

Добавьте в конфигурацию 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
# ввод пароля howtoforge

MySQL логин:

  • Username: root
  • Password: howtoforge

Изображение использует статический IP 192.168.1.100; изменение производится в файле /etc/network/interfaces.

Из соображений безопасности смените пароли сразу после первого запуска.

Рекомендации по безопасности и жёсткая настройка

Этот раздел даёт практические рекомендации по защите сервера после базовой установки.

  1. Обновления и патчинг

    • Регулярно выполняйте apt-get update && apt-get upgrade.
    • Для критичных систем рассмотрите автоматические обновления безопасности для пакетов безопасности.
  2. Пользователи и доступ

    • Отключите root-доступ по SSH, используйте sudo.
    • Настройте аутентификацию по ключам SSH и запретите парольную аутентификацию.
  3. Брандмауэр

    • Используйте UFW/iptables для открытия только необходимых портов (обычно 22, 80, 443).
    • При использовании TCP-подключения PHP-FPM убедитесь, что порт 9000 доступен только локально (127.0.0.1) или в пределах защищённой сети.
  4. Ограничения PHP-FPM

    • В pool-конфигурациях (/etc/php/7.0/fpm/pool.d/*.conf) установите pm.max_children, pm.start_servers, pm.max_requests в соответствии с ресурсами сервера.
  5. SSL/TLS

    • Отключите устаревшие протоколы и шифры (оставляйте TLSv1.2 и выше).
    • Проверяйте конфигурацию через внешние тесты (например, Qualys SSL Labs) для публичных сайтов.
  6. Окружающая безопасность

    • Ограничьте права файлов для /var/www/html (используйте www-data как владельца и минимальные права).
    • Храните приватные ключи в /etc/ssl/private с правами 600.
  7. Логи и мониторинг

    • Настройте ротацию логов (logrotate).
    • Подключите мониторинг (например, Prometheus, Zabbix) и оповещения о падениях сервисов.
  8. Базы данных

    • Используйте отдельного пользователя БД с минимальными привилегиями для приложений.
    • Не используйте root-пользователя БД в приложениях.

Тесты, сценарии приёмки и откат

Критерии приёмки (минимум):

  • Nginx служба активна и отвечает на порт 80 (curl http://IP должен вернуть HTTP 200).
  • PHP-FPM отвечает через указанный сокет/порт и phpinfo() показывает FPM.
  • Модули MySQL/МariaDB подключены к PHP (MySQLi/mysqlnd видны в phpinfo).
  • HTTPS сайт корректно отдает сертификат; для Let’s Encrypt — certbot renew проходит в тестовом режиме.

Тестовые сценарии (пример):

  1. Проверка HTTP: curl -I http://127.0.0.1 → ожидать 200 OK.
  2. Проверка PHP: curl http://127.0.0.1/info.php → наличие строки “PHP Version” и “FPM/FastCGI”.
  3. Проверка DB: выполнить простой PHP-скрипт, который подключается к базе и делает SELECT 1.
  4. Проверка 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)

  1. Обновить систему: apt-get update && apt-get upgrade -y.
  2. Установить nginx: apt-get -y install nginx.
  3. Установить СУБД (MySQL или MariaDB) и выполнить mysql_secure_installation.
  4. Установить php7.0-fpm и необходимые расширения.
  5. Настроить nginx vhost и включить обработку .php через fastcgi_pass.
  6. Настроить php.ini (cgi.fix_pathinfo=0, timezone, лимиты).
  7. Перезагрузить службы: systemctl reload php7.0-fpm.service && systemctl reload nginx.service.
  8. Установить SSL (самоподписанный или Let’s Encrypt) и тестировать HTTPS.
  9. Настроить firewall и SSH (ключи, запрет root).
  10. Настроить мониторинг и бэкапы.

Рассмотрите автоматизацию через 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, обновления, правильные права на файлы.

Ссылки


Важное

  • Перед применением конфигураций на проде сделайте тестирование на стенде и резервирование конфигураций.
  • Если у вас сложная среда (балансировщики, CDN, облачные базы), адаптируйте конфигурации под архитектуру.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро