Установка Drupal на Ubuntu 22.04 c веб-сервером Nginx
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
После завершения установки вы получите работающий сайт.