Створення шаблону VPS з Drupal 9 на Centos 8

Ми продовжуємо розширювати наш маркетплейс. Нещодавно ми розповідали, як зробили образ Gitlab, а цього тижня у нашому маркетплейсі з'явився Drupal.

Розповідаємо, чому вибрали саме його та як створювався образ.

Створення шаблону VPS з Drupal 9 на Centos 8

Drupal — зручна та потужна платформа для створення будь-яких типів сайтів: від мікросайтів та блогів до великих соціальних проектів, яка використовується також як основа для веб-додатків, написана мовою PHP та використовує як сховища даних реляційні бази даних.

Drupal 9 включає всі особливості реалізовані у версії 8.9. Ключова відмінність версії 9 від версії 8 полягає в тому, що для платформи будуть випускатися оновлення та виправлення безпеки після листопада 2021 року. Також у версії 9 спростили процес оновлення, роблячи процес оновлення з версії 8 ще простішим.

Вимоги до сервера

Для використання Drupal рекомендується використовувати 2 Гб RAM та 2 ядра CPU.

Основні файли Drupal займають близько 100 Мб, додатково вам знадобиться місце для зберігання картинок, бази даних, додаткових модулів і резервних копій, яке буде залежати від розміру вашого сайту.

Для Drupal 9 потрібно PHP 7.4 або вище з мінімальним обмеженням (memory_limit) на пам'ять 64 Мб, у разі використання додаткових модулів рекомендується встановити 128 Мб.

Як веб-сервер Drupal може використовувати Apache або Nginx, а як базу даних MySQL, PostgreSQL або SQLite.

Ми будемо встановлювати Drupal з використанням Nginx та MySQL.

Встановлення

Оновлено встановлені пакети до останньої версії:

sudo dnf update -y

Додамо постійний дозвіл для вхідного трафіку на http/80 та https/443 порти:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

Застосуємо нові правила файрвола:

sudo systemctl reload firewalld

Встановимо Nginx:

sudo dnf install nginx -y

Запустимо та ввімкнемо сервер Nginx:

sudo systemctl start nginx
sudo systemctl enable nginx

Так як на даний момент в основному репозиторії Centos використовується версія PHP 7.2 додамо репозиторій REMI з PHP 7.4 (мінімальна версія для Drupal 9).
Для цього додамо репозиторій EPEL (потрібний репозиторій REMI):

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

Додамо репозиторій REMI:

sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Увімкнемо модуль php:remi-7.4 для встановлення php 7.4:

sudo dnf module enable php:remi-7.4 -y

Встановимо php-fpm та php-cli:

sudo dnf install -y php-fpm php-cli

Встановимо PHP модулі, необхідні для роботи Drupal:

sudo dnf install -y php-mysqlnd php-date php-dom php-filter php-gd php-hash php-json php-pcre php-pdo php-session php-simplexml php-spl php-tokenizer php-xml

Також встановимо рекомендовані модулі PHP mbstring opcache:

sudo dnf install -y php-mbstring php-opcache

Встановимо сервер MySQL:

sudo dnf install mysql-server -y

Включимо та запустимо сервер MySQL:

sudo systemctl start mysqld
sudo systemctl enable mysqld

Так як ми робимо шаблон для VDS, а вони можуть бути повільними, додамо затримку старту mysqld 30 секунд, інакше можуть бути проблеми зі стартом сервера при початковому завантаженні системи:

sudo sed -i '/Group=mysql/a 
ExecStartPre=/bin/sleep 30
' /usr/lib/systemd/system/mysqld.service

Змінимо групу та користувача з-під якого буде працювати nginx внісши зміни в /etc/php-fpm.d/www.conf:

sudo sed -i --follow-symlinks 's/user = apache/user = nginx/g' /etc/php-fpm.d/www.conf
sudo sed -i --follow-symlinks 's/group = apache/group = nginx/g' /etc/php-fpm.d/www.conf

Змінимо власника каталогу сесій PHP так само відповідно на nginx:

sudo chown -R nginx. /var/lib/php/session

Видалимо рядки з коментарями з файлу конфігурації /etc/nginx/nginx.conf (що б не було подвійних спрацьовувань для sed):

sudo sed -i -e '/^[ t]*#/d'  /etc/nginx/nginx.conf

Додамо в /etc/nginx/nginx.conf налаштування компресії gzip

sudo sed -i '/types_hash_max_size 2048;/a 

    gzip on;
    gzip_static on;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;
    gzip_comp_level 9;
    gzip_proxied any;
    gzip_min_length 1000;
    gzip_disable "msie6";
    gzip_vary on; 
' /etc/nginx/nginx.conf

Додамо в /etc/nginx/nginx.conf налаштування індексного файлу index.php:

sudo sed -i '/        root         /usr/share/nginx/html;/a 
        index index.php index.html index.htm;
' /etc/nginx/nginx.conf

Додамо налаштування для дефолтного сервера обробку php через сокет php-fpm, відключимо лог для статичних файлів, збільшимо час expire, відключимо лог доступу та помилок для favicon.ico та robots.txt і заборонимо доступ до файлів .ht для всіх:

sudo sed -i '/        location / {/a 
		try_files $uri $uri/ /index.php?q=$uri&$args;
        }
    
        location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
        access_log off;
        expires max;
        }
    
        location ~ .php$ {
        try_files  $uri =404;
        fastcgi_pass   unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_intercept_errors on;
        fastcgi_ignore_client_abort off;
        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 180;
        fastcgi_read_timeout 180;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
        }
    
        location = /favicon.ico {
        log_not_found off;
        access_log off;
        }
    
        location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
        }
    
        location ~ /.ht {
        deny all;' /etc/nginx/nginx.conf

Встановимо wget необхідний установки certbot:

sudo dnf install wget -y

Завантажуємо файл certbot з офсайту:

cd ~
wget https://dl.eff.org/certbot-auto

Перемістимо certbot в /usr/local/bin/:

mv certbot-auto /usr/local/bin/certbot-auto

І призначимо права та власником root:

chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto

Встановимо залежності certbot і на даному етапі перервемо його роботу (Відповіді: Y, c):

certbot-auto

Завантажуємо з офсайту архів з останньою версією Drupal 9:

cd ~
wget https://www.drupal.org/download-latest/tar.gz

Встановимо tar для розпакування архіву:

sudo dnf install tar -y

Видалимо файли за замовчуванням у каталозі /usr/share/nginx/html/:

rm -rf /usr/share/nginx/html/*

Розпакуємо файли в каталог веб-сервера:

tar xf tar.gz -C /usr/share/nginx/html/

Перенесемо файли з підкаталогу до кореневого каталогу веб-сервера:

mv /usr/share/nginx/html/drupal-9.0.7/* /usr/share/nginx/html/

Видалимо підкаталог:

rm -rf /usr/share/nginx/html/drupal-9.0.7

Видалимо архів із настановними файлами:

rm -f ./tar.gz

Призначимо власником файлів nginx:

chown -R nginx. /usr/share/nginx/html

На даному етапі ми вимкнемо сервер і зробимо снапшот:

shutdown -h now

Після запуску VDS зі снапшота виконаємо початкове налаштування сервера MySQL запустивши скрипт:

mysql_secure_installation

Включимо валідатор паролів:

Would you like to setup VALIDATE PASSWORD component? : y

Задамо пароль користувача root MySQL:

New password:
Re-enter new password:

Видалимо анонімних користувачів:

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

Заборонимо підключатися root віддалено:

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y

Видалимо тестову базу даних:

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

Перезавантажимо таблиці привілеїв:

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

Після цього, для завершення встановлення, ми можемо перейти на адресу vps_ip_address
На цій адресі ми побачимо сторінку з установкою Drupal.

Виберемо мову, що використовується. Наприклад: російська. Натисніть «Зберегти та продовжити»

Виберемо настановний профіль (демо використовується виключно для ознайомлення із системою). У нашому випадку хай це буде стандарт.

На наступній сторінці задамо ім'я базі даних, наприклад "drupal". Вкажемо ім'я користувача БД root і пароль, заданий йому, при запуску mysql_secure_installation. Натисніть «Зберегти та продовжити».

Дочекаємося завершення встановлення та оновлення перекладів (процес може тривати кілька хвилин).

Вкажемо назву сайту, задамо email сайту (від імені якого будуть надходити повідомлення сайту), логін, пароль та email облікового запису адміністратора Drupal. Також поставимо країну та часовий пояс у регіональних налаштуваннях. І завершимо встановлення натиснувши «Зберегти та продовжити».

Після цього можна перейти в панель управління зі створеним логіном та паролем адміністратора Drupal.

Налаштування HTTPS (опційно)

Для налаштування HTTPS у VDS має бути діюче DNS ім'я, вкажіть у

/etc/nginx/nginx.conf

у розділі server ім'я сервера (наприклад):

server_name  domainname.ru;

Перезапустимо nginx:

service nginx restart

Запустимо certbot:

sudo /usr/local/bin/certbot-auto --nginx

Введемо свій e-mail, погодимося з умовами сервісу (A), Передплата на розсилку (опційно) (N), виберемо доменні імена для яких потрібно видати сертифікат (Enter для всіх).

У випадку, якщо все пройшло без помилок, ми побачимо повідомлення про успішну видачу сертифікатів та налаштування сервера:

Congratulations! You have successfully enabled ...

Після цього підключення на 80 порт будуть перенаправлятися на 443 (https).

Додамо /etc/crontab для автоматичного оновлення сертифікатів:

# Cert Renewal
30 2 * * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload"

Налаштування Trusted Host Security (рекомендовано)

Ця настройка призначена як вирішення проблеми, пов'язаної з динамічним визначенням base_url, і покликана запобігти атакам HTTP HOST Header (коли ваш сайт думає, що він хтось інший).

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

У файлі

/usr/share/nginx/html/sites/default/settings.php розкоментуємо або додамо налаштування з патернами актуальних імен сайту, наприклад:

$settings['trusted_host_patterns'] = [
  '^www.mydomain.ru$',
];

Встановлення PHP APCu (РЕКОМЕНДУЄТЬСЯ)

Drupal підтримує APCu - Alternative PHP User Cache, версії 8 і 9 інтенсивніше використовують APCu як короткостроковий локальний кеш, ніж попередні версії. Розмір кешу за замовчуванням (32 Мб) підійде більшості сайтів і не може перевищувати 512 Мб.

Для активації встановимо модуль PHP APCu:

dnf -y install php-pecl-apcu

Перезапустимо nginx і php-fpm:

service nginx restart
service php-fpm restart

У разі використання російської мови та APCu з рекомендованим розміром пам'яті для кешу, в панелі керування ви можете побачити попередження, що розмір виділеної пам'яті для кешу відрізняється від рекомендованого, але фактично все працює правильно, а некоректне попередження швидше за все виправлять у найближчих оновленнях.

Або якщо попередження ріже око, можна використовувати відповідний патч з офсайту.

Ви також можете зробити для нас образ

Є три варіанти, як взяти участь.

Підготуйте образ самі та отримайте 3000 рублів на баланс

Якщо ви готові відразу кинутися в бій і створити образ, якого вам не вистачає, ми зарахуємо вам 3000 рублів на внутрішній баланс - ви зможете витратити на сервери.

Як створити свій образ:

  1. Створіть обліковий запис у нас на сайті
  2. Повідомте, що ви збираєтеся створювати та тестувати образи
  3. Ми зарахуємо вам 3000 рублів та включимо можливість створювати снапшоти
  4. Замовте віртуальний сервер із чистою операційною системою
  5. Встановіть на це VPS програмне забезпечення та налаштуйте його
  6. Складіть інструкцію або скрипт для розгортання ПЗ
  7. Створіть снапшот для налаштованого сервера
  8. Замовте новий віртуальний сервер, вибравши у списку «Шаблон сервера» створений раніше снапшот
  9. У разі успішного створення сервера, передайте матеріали отримані на етапі 6 технічної підтримки
  10. У разі помилки ви можете уточнити у підтримки причину та повторити налаштування

Для власників бізнесу: запропонуйте свій софт

Якщо ви розробник софту, який розгортають і використовують на VPS, то ми можемо включити вас в маркетплейс. Так ми можемо допомогти вам привести нових клієнтів, трафік та впізнаваність. Пишіть нам

Розкажіть у коментарях, якого образу вам бракує?

І ми підготуємо його самі

Створення шаблону VPS з Drupal 9 на Centos 8

Створення шаблону VPS з Drupal 9 на Centos 8

Джерело: habr.com