07.05.2022

Установка Drupal на Ubuntu 22.04 c веб-сервером Nginx

PHP со всеми необходимыми расширениями и файл конфигурации Nginx специально для Drupal 9.

Ubuntu 22.04 — новый релиз популярного дистрибутива Linux, выпущенный в апреле 2022 года. В новой версии сделан упор на безопасность; в частности, по умолчанию используется файрвол UFW.

LEMP Stack (Linux, Nginx — читается: энджин-икс, MySQL/MariaDB и PHP) — популярное окружение для сайтов, работающих на языке PHP. Linux — операционная система, Nginx — веб-сервер,  MariaDB — полностью совместимая с MySQL система управления базами данных.  

1) Установка веб-сервера Nginx

Для начала обновляем сведения о пакетах.

sudo apt update

Устанавливаем веб-сервер Nginx…

sudo apt install nginx 

Напомним синтаксис команд терминала. APT — пакетный менеджер, используемый для установки ПО в систему. Команда install дает указание установить пакет. А nginx, соответственно, название пакета. При каждом запуске после получения сведений о пакете APT спросит, хотите ли вы продолжить. Нажимаем y, затем ENTER. 

Разрешаем файрволу подключение к веб-серверу по протоколам HTTP и HTTPS.

sudo ufw allow 'Nginx HTTP'

sudo ufw allow 'Nginx HTTPS'

Теперь при указании в браузере IP-адреса сервера или доменного имени вашего сайта вы увидите сообщение о том, что Nginx установлен.

2) Установка MySQL

Далее займемся установкой базы данных. Используем MariaDB — это форк MySQL, полностью совместимый с ним, но с некоторыми доработками, в том числе позитивно влияющими на производительность. Его поддерживает та же команда, что разработала базу MySQL, притормозившую свое развитие после покупки корпорацией Oracle.

sudo apt install mariadb-server mariadb-client -y

Рекомендуется установить параметры безопасности и задать пароль root пользователя базы данных. Для этого используется команда sudo mysql_secure_installationОпишем этот процесс в отдельной статье.

Подключаемся к системе управления базами данных…

mysql -u root

Создаем базу данных сайта…

CREATE DATABASE drupal;

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

GRANT ALL ON drupal.* TO 'drupal'@'localhost' IDENTIFIED BY 'MyPassword';

Активируем сделанные настройки…

FLUSH PRIVILEGES;

После чего выходим из интерфейса управления БД.

\q

3) Установка PHP 

Теперь перейдем к языку программирования PHP и установим необходимые для работы Drupal расширения.

sudo apt install php8.1-fpm php-mysql php-xml php-gd php-curl php-mbstring

Для установки CMS и работы с модулями для Drupal используем Composer.

Загружаем установщик Composer…

curl -sS https://getcomposer.org/installer -o composer-setup.php

Запускаем скрипт установки Composer…

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

И теперь можно проверить версию Composer.

composer -V

3.1) Настройка Nginx и установка Drupal

Перед этим этапом вам нужно купить доменное имя и подключить его к IP-адресу вашего сервера.

Переходим в папку веб-сервера…

cd /var/www

Устанавливаем друпал, используя Composer. my_site_name — название директории, где будут храниться файлы вашего сайта.

composer create-project drupal/recommended-project my_site_name

Переходим в созданную композером папку сайта…

cd my_site_name

Сразу установим и Drush.

composer require drush/drush

После этого шага вы можете вызывать Drush через vendor/bin/drushЧтобы использовать короткую команду drush без указания пути, установим Drush Launcher.

wget -O drush.phar https://github.com/drush-ops/drush-launcher/releases/latest/download/drush.phar

chmod +x drush.phar

sudo mv drush.phar /usr/local/bin/drush

Теперь создадим файл конфигурации nginx для вашего сайта.

  • my_site_domain — доменное имя вашего сайта, например drupal.ru
  • my_site_name — директория сайта

sudo nano /etc/nginx/sites-available/my_site_domain.conf

Копируем туда конфигурацию…

    server {
        server_name my_site_domain;
        root /var/www/my_site_name/web; ## <-- Your only path reference.
        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 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 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)(|/.*)$;
            # 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;
            # PHP 8.1 socket location.
            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;
        }
    }
        

Для сохранения жмем ctrl+x, затем y.

Включаем добавленную конфигурацию…

sudo ln -s /etc/nginx/sites-available/my_site_domain.conf /etc/nginx/sites-enabled/

Проверим, чтобы в конфигурации не было ошибок. Если появится сообщение об ошибке, нужно проверить файл конфигурации.

sudo nginx -t

Наконец, перезагружаем nginx для применения изменений и включения сайта.

sudo systemctl reload nginx

3.2) Получение SSl-сертификата

Чтобы сайт был доступен по протоколу HTTPS, можно использовать бесплатный сертификат от Certbot.

sudo apt install snap

sudo snap install --classic certbot

sudo ln -s /snap/bin/certbot /usr/bin/certbot

sudo certbot --nginx

Соглашаемся со всеми вопросами и оставляем свой имейл.

3.3) Установка Drupal

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

mkdir web/sites/default/files

chmod 777 'web/sites/default/files'

cp web/sites/default/default.settings.php web/sites/default/settings.php

chmod 777 web/sites/default/settings.php 

Указанные выше разрешения дают право на редактирование файла любым пользователем системы. Это небезопасно, и рекомендуется использовать права 755 для директории 'files' и 644 для 'settings.php'.

Теперь можно переходить на сайт и приступать к установке  в графическом интерфейсе Drupal. Потребуется указать:

  • логин и пароль от базы данных (установили в пункте 3),
  • название сайта,
  • имейл сайта,
  • логин и пароль администратора, 
  • выбрать часовую зону и язык сайта.

Если вдруг какая-либо страница не открывается, проверяем лог nginx и php.

tail /var/log/nginx/error.log

tail /var/log/php8.1-fpm.log

После завершения установки вы получите работающий сайт.