Сегодня мы с вами установим Drupal 9 на веб-сервер Nginx на сервере с операционной системой Ubuntu Server 22.04. Drupal 10 устанавливается аналогично, но сегодня мне нужна именно девятая версия. Погнали.
Drupal — система управления контентом (CMS) с открытым исходным кодом под лицензией GPL. Написана на PHP. На Drupal работает больше миллиона сайтов: персональные блоги, корпоративные порталы, политические и правительственные сайты.
Наш сайт тоже работает на Drupal.
Подготовка к установке
Если у вас вообще ничего нет, если вы собираетесь поставить всё с нуля, то нужно начать с установки операционной системы. Поставим Ubuntu Server 22.04.
Установка Ubuntu Server 22.04 LTS на виртуальную машину VMware ESXi 6.7
Итак, операционная система установлена.
Нужно придумать и создать почтовый ящик, от имени которого drupal будет рассылать сообщения.
- e-mail для drupal
Нужно делегировать домен и направить трафик на соответствующие NS сервера. Я для примера сделаю сайт:
- drupal.internet-lab.ru
Дополнительно понадобится почтовый сервер, должен же Drupal как-то слать письма. Будем считать, что вы с этим моментом сами справитесь. Отправку писем можно и потом прикрутить.
MariaDB
Дальше нам нужна база данных. MariaDB подойдёт.
Установим MariaDB 10. Процесс установки вынес в отдельную статью:
Установка MariaDB 10 на Ubuntu 22.04
Создадим директорию /opt/mysql и перенесём туда каталог данных MySQL:
Перемещение базы данных MariaDB 10 в Ubuntu 22.04
Нужно создать базу данных (схему), создать пользователя для этой базы, дать ему полные права на базу.
mysql -u root
CREATE DATABASE drupal;
GRANT ALL ON drupal.* TO 'drupal'@'localhost' IDENTIFIED BY 'ExamplePasswordX4k1';
FLUSH PRIVILEGES;
\q
Записать на бумажку или в файл:
- Имя БД
- Имя пользователя от БД
- Пароль пользователя от БД
- Адрес БД
- Порт БД
У меня веб-сервер и БД на одном сервере, порт стандартный, поэтому адрес БД у меня localhost, порт стандартный 3306.
Nginx и PHP
Теперь поднимем web-сервер Nginx.
apt install nginx
Drupal у нас будет работать на PHP 8.1. Устанавливаем дополнительные пакеты:
apt install php8.1-fpm php-mysql php-xml php-gd php-curl php-mbstring
В дальнейшем для управления сайтом нам пригодится composer, поставим (необязательно сейчас).
cd /tmp
curl -sS https://getcomposer.org/installer -o composer-setup.php
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
composer -V
Установка Drupal
Мне нужно установить определённую версию, буду ставить Drupal 9.5.11.
cd /var/www/html/
wget https://ftp.drupal.org/files/projects/drupal-9.5.11.tar.gz
tar -xvzf drupal-9.5.11.tar.gz
mv drupal-9*/ drupal/
chown -R www-data:www-data /var/www/html/drupal
rm drupal-9.5.11.tar.gz
Конфигурация Nginx для Drupal 9
Создадим конфигурационный файл для Drupal.
vim /etc/nginx/sites-available/drupal
Конфигурацию честно содрал с сайта Nginx.
server {
listen 80;
server_name drupal.internet-lab.ru;
root /var/www/html/drupal;
client_max_body_size 100M;
autoindex off;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~ \..*/.*\.php$ {
return 403;
}
location ~ ^/sites/.*/private/ {
return 403;
}
# Block access to scripts in site files directory
location ~ ^/sites/[^/]+/files/.*\.php$ {
deny all;
}
# Allow "Well-Known URIs" as per RFC 5785
location ~* ^/.well-known/ {
allow all;
}
# 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 /index.php?$query_string;
}
location @rewrite {
rewrite ^ /index.php;
}
# Don't allow direct access to PHP files in the vendor directory.
location ~ /vendor/.*\.php$ {
deny all;
return 404;
}
# Protect files and directories from prying eyes.
location ~* \.(engine|inc|install|make|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\.(?!well-known).*|Entries.*|Repository|Root|Tag|Template|composer\.(json|lock)|web\.config)$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig|\.save)$ {
deny all;
return 404;
}
# In Drupal, 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)(|/.*)$;
# Ensure the php file exists. Mitigates CVE-2019-11043
try_files $fastcgi_script_name =404;
# Security note: If you're running a version of PHP older than the
# latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini.
# See http://serverfault.com/q/627903/94922 for details.
include fastcgi_params;
# Block httpoxy attacks. See https://httpoxy.org/.
fastcgi_param HTTP_PROXY "";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param QUERY_STRING $query_string;
fastcgi_intercept_errors on;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
try_files $uri @rewrite;
expires max;
log_not_found off;
}
# Fighting with Styles? This little gem is amazing.
location ~ ^/sites/.*/files/styles/ {
try_files $uri @rewrite;
}
# Handle private files through Drupal. Private file's path can come
# with a language prefix.
location ~ ^(/[a-z\-]+)?/system/files/ {
try_files $uri /index.php?$query_string;
}
# Enforce clean URLs
# Removes index.php from urls like www.example.com/index.php/my-page --> www.example.com/my-page
# Could be done with 301 for permanent or other redirect codes.
if ($request_uri ~* "^(.*/)index\.php/(.*)") {
return 307 $1$2;
}
}
Пока делаем на 80 порту, потом будем сертификат прикручивать. Включаем конфигурацию.
ln -s /etc/nginx/sites-available/drupal /etc/nginx/sites-enabled/
Настраиваем SSL сертификат
Установим и настроим certbot для получения и обновления SSL сертификатов Let's Encrypt.
Let’s Encrypt — центр сертификации, начавший работу в бета-режиме с 3 декабря 2015 года, предоставляющий бесплатные криптографические сертификаты X.509 для TLS-шифрования (HTTPS). Процесс выдачи сертификатов полностью автоматизирован. https://letsencrypt.org/
Let's Encrypt — настройка certbot в Ubuntu 22
Certbot установили, запускаем:
certbot run --nginx
Указываем e-mail администратора сертификатов Let's Encrypt. Принимаем лицензионное соглашение и отвечаем на вопросы.
Скрипт выводит список доменов, которые он нашёл в Nginx. Указываем номер домена, для которого требуется сертификат. В данном случае пишем "1". Enter.
И ничего не работает. Всё просто, домен, который я создал, ещё не разошёлся по DNS серверам в Интернет.
Но тут наступило утро, и Шахерезада прекратила дозволенные речи.
Делаю паузу до следующего утра.
Домен доступен.
certbot run --nginx
Скрипт выводит список доменов, которые он нашёл в Nginx. Указываем номер домена, для которого требуется сертификат. В данном случае пишем "1". Enter.
На этот раз скрипт отработал, сгенерировал сертификаты (сроком на 3 месяца) и изменил конфигурационный файл сайта в nginx.
Пробуем зайти на сайт.
Продолжение установки Drupal
Мы находимся в разделе "Choose language". Нужно выбрать язык. Выбираю русский.
Мы в разделе "Выбор профиля". Есть три варианта установки:
- Стандарт
- Минимальный
- Демо
Я выбираю Демо. "Сохранить и продолжить".
Попадаем в раздел "Установка базы данных". Вот здесь нам и понадобится название базы и юзер с паролем, вводим эти данные.
В дополнительных настройках можно указать сервер и порт базы данных. "Сохранить и продолжить".
Попадаем в раздел "Установка сайта". Начинается установка сайта.
Загружаются переводы.
Попадаем в раздел "Настройка сайта".
Указываем:
- Название сайта
- E-mail адрес сайта
- Логин админа
- Пароль админа
- E-mail адрес админа
- Страну
- Часовой пояс
- И галки:
- Проверять обновления автоматически
- Получать уведомления по электронной почте
"Сохранить и продолжить".
Попадаем в раздел "Завершение переводов". Ждём.
Открывается главная страница сайта.
Drupal успешно установлен, поздравляем!