Перейти к основному содержанию

Drupal 9 — установка на Nginx в Ubuntu 22

Drupal 9

Сегодня мы с вами установим 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

drupal

Записать на бумажку или в файл:

  • Имя БД
  • Имя пользователя от БД
  • Пароль пользователя от БД
  • Адрес БД
  • Порт БД

У меня веб-сервер и БД на одном сервере, порт стандартный, поэтому адрес БД у меня 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

drupal

В дальнейшем для управления сайтом нам пригодится 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

Мне нужно установить определённую версию, буду ставить 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

drupal

Конфигурация 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;
    }
}

drupal

Пока делаем на 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.

drupal

И ничего не работает. Всё просто, домен, который я создал, ещё не разошёлся по DNS серверам в Интернет.

drupal

Но тут наступило утро, и Шахерезада прекратила дозволенные речи.

Делаю паузу до следующего утра.

drupal

Домен доступен.

certbot run --nginx

Скрипт выводит список доменов, которые он нашёл в Nginx. Указываем номер домена, для которого требуется сертификат. В данном случае пишем "1". Enter.

drupal

На этот раз скрипт отработал, сгенерировал сертификаты (сроком на 3 месяца) и изменил конфигурационный файл сайта в nginx.

Пробуем зайти на сайт.

drupal

Продолжение установки Drupal

Мы находимся в разделе "Choose language". Нужно выбрать язык. Выбираю русский.

drupal

Мы в разделе "Выбор профиля". Есть три варианта установки:

  • Стандарт
  • Минимальный
  • Демо

Я выбираю Демо. "Сохранить и продолжить".

drupal

Попадаем в раздел "Установка базы данных". Вот здесь нам и понадобится название базы и юзер с паролем, вводим эти данные.

drupal

В дополнительных настройках можно указать сервер и порт базы данных. "Сохранить и продолжить".

drupal

Попадаем в раздел "Установка сайта". Начинается установка сайта.

drupal

Загружаются переводы.

drupal

Попадаем в раздел "Настройка сайта".

drupal

Указываем:

  • Название сайта
  • E-mail адрес сайта
  • Логин админа
  • Пароль админа
  • E-mail адрес админа
  • Страну
  • Часовой пояс
  • И галки:
    • Проверять обновления автоматически
    • Получать уведомления по электронной почте

drupal

"Сохранить и продолжить".

drupal

Попадаем в раздел "Завершение переводов". Ждём.

drupal

Открывается главная страница сайта.

drupal

Drupal успешно установлен, поздравляем!

Теги

 

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

Обновляем Nginx на Ubuntu Server 20.04 из репозитория

Пришла задачка — обновить nginx на одном из web серверов. Главное требование, обновиться нужно на версию не ниже 1.21, потому что в более ранних версиях обнаружена какая-то уязвимость.

Теги

Заглушка для технических работ на Nginx

Иногда сайт нужно вывести из эксплуатации для проведения технических работ. Это может быть процесс резервного копирования, обновление, изменение конфигурации, перенос данных, или восстановление.

Теги