Установка Drupal 9 на Debian 10 (Buster) с LEMP и Let's Encrypt
Требования
- Сервер с Debian Buster 10 (тесты проводились на 2 ГБ ОЗУ, 50 ГБ свободного места, 2 CPU). Эти значения — минимальные рекомендации для небольшого тестового сайта.
- root-права или пользователь с sudo для установки пакетов и изменения системных конфигураций.
- Доменное имя, указывающее на IP сервера (для получения сертификата Let’s Encrypt).
- Базовые навыки работы в терминале и понимание веб-серверов и баз данных.
Важно: если у вас другой релиз Debian или более новая версия PHP, используйте соответствующие пакеты и пути к сокету PHP-FPM.
Что мы сделаем
- Установим Nginx
- Установим и настроим PHP-FPM (в руководстве — PHP 7.3)
- Установим и настроим MariaDB
- Получим SSL через Let’s Encrypt (certbot)
- Настроим виртуальный хост Nginx для Drupal 9
- Скачиваем исходники Drupal и настраиваем права
- Завершаем установку через веб-интерфейс
Шаг 1 — Установка Nginx
Обновите списки пакетов и обновите систему:
sudo apt update
sudo apt upgradeУстановите Nginx:
sudo apt install nginx -yЗапустите и включите сервис при загрузке:
systemctl start nginx
systemctl enable nginxПроверка статуса:
systemctl status nginx
Если Nginx запущен без ошибок, можно переходить к установке PHP.
Шаг 2 — Установка и настройка PHP-FPM
В этом руководстве используется PHP-FPM 7.3. Установите PHP и необходимые расширения:
sudo apt install php php-fpm php-gd php-common php-mysql php-apcu php-gmp php-curl php-intl php-mbstring php-xmlrpc php-gd php-xml php-cli php-zip -yОтредактируйте php.ini для PHP-FPM (путь в примере — /etc/php/7.3/fpm/php.ini):
cd /etc/php/7.3/fpm/
vim php.iniНайдите и измените/раскомментируйте параметры:
date.timezone = Asia/Singapore
memory_limit = 256M
upload_max_filesize = 64M
max_execution_time = 600
cgi.fix_pathinfo = 0Сохраните файл и перезапустите сервис, а также включите его при загрузке:
systemctl restart php7.3-fpm
systemctl enable php7.3-fpmPHP-FPM по умолчанию слушает unix-сокет:

Проверьте сокеты и статус сервиса:
ss -plnt | grep php
systemctl status php7.3-fpm
Совет: если используете более новую версию PHP, замените в конфигурации и путях php7.3 на актуальную версию (php7.4, php8.0 и т.д.).
Шаг 3 — Установка и настройка MariaDB
Установите MariaDB сервер и клиент:
sudo apt install mariadb-server mariadb-clientЗапустите сервис и включите автозапуск:
systemctl start mysql
systemctl enable mysql
Запустите скрипт безопасной настройки:
mysql_secure_installationВ ответах обычно рекомендуется выбрать «Y» для всех опций: установка пароля root, удаление анонимных пользователей, запрет удалённого входа root, удаление тестовой базы и перезагрузка таблиц привилегий.
Создайте базу данных и пользователя для Drupal:
mysql -u root -p
create database drupaldb;
create user drupaluser@localhost identified by 'drupaluser@';
grant all privileges on drupaldb.* to drupaluser@localhost identified by 'drupaluser@';
flush privileges;
exit
Важно: выберите безопасный пароль для пользователя базы данных. Пароли в примерах служат только демонстрационной целью.
Шаг 4 — Получение SSL от Let’s Encrypt (Certbot)
Убедитесь, что ваш домен указывает на IP сервера. Установите certbot:
sudo apt install certbot -yОстановите Nginx на время генерации сертификата (используется standalone режим):
systemctl stop nginxЗапустите certbot для генерации сертификата (замените e-mail и -d на ваш домен):
certbot certonly --rsa-key-size 2048 --standalone --agree-tos --no-eff-email --email [email protected] -d drupal.hakase-labs.ioПосле успешного выполнения сертификаты будут в каталоге /etc/letsencrypt/live/yourdomain.com
Совет: если вы хотите автоматизировать продление, добавьте задачу в cron или используйте systemd timer для certbot renew.
Шаг 5 — Настройка виртуального хоста Nginx для Drupal 9
Создайте файл виртуального хоста в /etc/nginx/sites-available/drupal9 и вставьте конфигурацию (замените домен и пути к сертификатам):
server {
server_name drupal.hakase-labs.io;
root /var/www/drupal9; ## <-- Your only path reference.
listen 80;
listen [::]:80;
listen 443 default ssl;
ssl_certificate /etc/letsencrypt/live/drupal.hakase-labs.io/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/drupal.hakase-labs.io/privkey.pem;
# Redirect HTTP to HTTPS
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# Very rarely should these ever be accessed outside of your lan
location ~* \.(txt|log)$ {
allow 192.168.0.0/16;
deny all;
}
location ~ \..*/.*\.php$ {
return 403;
}
location ~ ^/sites/.*/private/ {
return 403;
}
# Block access to "hidden" files and directories whose names begin with a
# period. This includes directories used by version control systems such
# as Subversion or Git to store control files.
location ~ (^|/)\. {
return 403;
}
location / {
# try_files $uri @rewrite; # For Drupal <= 6
try_files $uri /index.php?$query_string; # For Drupal >= 7
}
location @rewrite {
rewrite ^/(.*)$ /index.php?q=$1;
}
# In Drupal 8, we must also match new paths where the '.php' appears in the middle,
# such as update.php/selection. The rule we use is strict, and only allows this pattern
# with the update.php front controller. This allows legacy path aliases in the form of
# blog/index.php/legacy-path to continue to route to Drupal nodes. If you do not have
# any paths like that, then you might prefer to use a laxer rule, such as:
# location ~ \.php(/|$) {
# The laxer rule will continue to work if Drupal uses this new URL pattern with front
# controllers other than update.php in a future release.
location ~ '\.php$|^/update.php' {
fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
include fastcgi_params;
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_intercept_errors on;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
}
# Fighting with Styles? This little gem is amazing.
# location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6
location ~ ^/sites/.*/files/styles/ { # For Drpal >= 7
try_files $uri @rewrite;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}Активируйте виртуальный хост и проверьте конфигурацию Nginx:
ln -s /etc/nginx/sites-available/drupal9 /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginxЕсли nginx -t возвращает ошибки — исправьте их прежде чем рестартовать сервис.

Шаг 6 — Скачивание и подготовка исходников Drupal
Перейдите в /var/www и скачайте архив с последней версией Drupal 9:
cd /var/www/
wget -q https://www.drupal.org/download-latest/tar.gz -O drupal-latest.tar.gzРаспакуйте и переименуйте папку в drupal9:
tar -xf drupal-latest.tar.gz
mv drupal-9*/ drupal9/Дайте права владельца каталогу веб-сервера (www-data):
chown -R www-data:www-data /var/www/drupal9
Совет: если на сервере используется другой пользователь веба (например nginx), используйте его вместо www-data.
Шаг 7 — Завершение установки через веб-интерфейс
Откройте браузер и перейдите по адресу вашего сайта, например:
https://drupal.hakase-labs.io/
Вы попадёте на страницу установки по HTTPS. Выберите язык установки (по умолчанию — English) и нажмите «Save and continue».

Выберите профиль установки — обычно “Standard” для первого запуска.

На шаге настройки базы данных укажите название БД, пользователя и пароль, которые создавали ранее.

Установка начнёт процесс и покажет прогресс.

После завершения задайте имя сайта, учётную запись администратора (логин, пароль, e-mail) и нажмите “Save and continue”.

После перехода на главную страницу вы увидите стандартный интерфейс Drupal.

Панель администратора доступна в меню “Configuration”.

Поздравляем — установка Drupal 9 завершена.
Критерии приёмки
- Сайт доступен по HTTPS и показывает страницу установки/главную страницу Drupal.
- PHP-FPM запущен и прослушивает сокет, указанный в конфигурации Nginx.
- MariaDB работает, создана БД и пользователь с нужными привилегиями.
- Nginx конфигурация проходит проверку nginx -t без ошибок.
- Сертификат Let’s Encrypt успешно установлен и не просрочен.
Рекомендации по безопасности
- Всегда держите систему и пакеты обновлёнными (apt update && apt upgrade).
- Установите и настройте брандмауэр (ufw или iptables). Разрешайте только нужные порты (80, 443, SSH).
- Отключите возможность доступа по root через SSH; используйте ключи вместо паролей.
- Ограничьте доступ к файлам /sites/*/private и к файлам конфигурации.
- Регулярно выполняйте резервные копии базы данных и файлов сайта.
- Включите автообновление certbot renew или настройте cron.
- Настройте HTTP заголовки безопасности: Content-Security-Policy, X-Frame-Options, X-Content-Type-Options.
Тесты и приёмка (минимальные тест-кейсы)
- Доступность главной страницы по HTTPS (код 200).
- Авторизация в /user/login работает, создание пользователя работает.
- Импорт/загрузка изображений в библиотеку медиа работает (проверить права на /sites/default/files).
- Выполнение SQL-запроса к drupaldb от имени drupaluser не вызывает ошибок прав доступа.
- Обновление страницы кэша и очистка кэша в админке проходят без ошибок.
Устранение неполадок — распространённые ошибки и решения
- Nginx не запускается после изменений: выполните nginx -t и исправьте синтаксические ошибки.
- Ошибка 502 Bad Gateway: проверьте, запущен ли php-fpm и совпадает ли путь к unix-сокету в fastcgi_pass.
- Проблемы с правами файлов: убедитесь, что web-процесс имеет права на /var/www/drupal9 и на /sites/default/files.
- Certbot не может получить сертификат: проверьте, что домен указывает на текущий сервер и Nginx остановлен в режиме standalone или используйте webroot метод.
Чек-лист задач по ролям
Системный администратор:
- Настроить сервер (обновления, брандмауэр, SSH).
- Установить Nginx, PHP-FPM, MariaDB, certbot.
- Настроить резервное копирование.
Деплой-инженер / DevOps:
- Настроить виртуальный хост, автоматическое восстановление и мониторинг.
- Настроить CI/CD для деплоя кода и миграций.
Разработчик:
- Настроить окружение разработки (drupal local settings, composer, drush).
- Проверить совместимость модулей с PHP и Drupal 9.
Контент-менеджер:
- Проверить доступ к админке, загрузку медиа, шаблонов.
Mini-методология развёртывания (быстрое руководство)
- Подготовить сервер (обновление, брандмауэр, SSH).
- Установить стек (Nginx, PHP-FPM, MariaDB).
- Создать БД и пользователя.
- Получить SSL сертификат.
- Настроить виртуальный хост Nginx.
- Скопировать/распаковать Drupal в /var/www и установить права.
- Пройти установку через веб-интерфейс.
- Настроить резервное копирование и мониторинг.
Модель зрелости установки (уровни готовности)
- Уровень 1 (dev): локальная установка, самоподписанные сертификаты, нет резервного копирования.
- Уровень 2 (staging): публичный домен, Let’s Encrypt, базовая безопасность, периодические бэкапы.
- Уровень 3 (prod): мониторинг, автоматические бэкапы, WAF, аварийные планы, SLA и тесты приёмки.
Быстрая справка по самым важным командам
- Обновление системы: sudo apt update && sudo apt upgrade
- Проверка Nginx: nginx -t
- Перезапуск сервиса: systemctl restart nginx / php7.3-fpm / mysql
- Проверка статуса: systemctl status nginx
- Проверка сокета php-fpm: ss -plnt | grep php
- Получение сертификата: certbot certonly –standalone -d yourdomain
Факты — ключевые числа
- Минимальные ресурсы для тестовой установки: 2 ГБ RAM, 2 CPU, 50 ГБ диска.
- Типичная память PHP-FPM в конфиге: memory_limit = 256M.
- Рекомендуемый upload_max_filesize для медиа: 64M.
Глоссарий (одна строка)
- LEMP: стек Linux + Nginx (Engine-X) + MariaDB/MySQL + PHP-FPM.
- PHP-FPM: реализация FastCGI для PHP, оптимизированная для процессов.
- certbot: утилита для получения сертификатов Let’s Encrypt.
Схема принятия решений по SSL (Mermaid)
flowchart TD
A[Есть домен?] -->|Нет| B[Настроить DNS]
B --> A
A -->|Да| C[Домен указывает на сервер?]
C -->|Нет| B
C -->|Да| D[Остановить Nginx]
D --> E[Запустить certbot standalone]
E --> F{Успех?}
F -->|Да| G[Включить Nginx и настроить сертификат в Nginx]
F -->|Нет| H[Использовать webroot или вручную установить сертификат]Короткая сводка и дальнейшие шаги
- Убедитесь, что автоматическое обновление сертификатов работает: certbot renew –dry-run.
- Пересмотрите права доступа к файлам и каталогам (особенно /sites/default/files и настройки private).
- Настройте мониторинг и резервное копирование для производства.
Итог: следуя этому руководству, вы получите рабочий экземпляр Drupal 9 на Debian 10 с HTTPS и базовыми мерами безопасности. Для продакшн-сайта добавьте мониторинг, регулярные бэкапы, WAF и политики обновлений.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента