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

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 успешно установлен, поздравляем!

Теги

 

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

Перезагружаем IIS при 500-й ошибке

Недавно мой сайт на Drupal 8 стал иногда валиться с 500-й ошибкой. Началось это с очередного обновления. Проблема, как мне кажется, связана с некорректной работой системы кеширования. Помогает перезагрузка IIS.