🛠 Как поставить Joomla 4 на выделенный сервер VDS/VPS?

Ставим Джумлу на выделенный сервер (стек LEMP), настраиваем фаервол и переносим готовый сайт на второй сервер. Linux, консоль. Ready, steady, go!

Что делаем?
Устанавливаем Nginx, PHP, MySQL, Joomla, настраиваем фаервол и ограничиваем количество неудачных попыток входа с помощью fail2ban. Затем переносим работающий сайт на другой сервер. Бонус: Топ-20 лучших бесплатных расширений для Джумлы и советы по ее ускорению.

Эту инструкцию по настройке сервера можно использовать почти с любой CMS на PHP и MySQL: Wordpress, Drupal, MODX, October CMS и т. д.

1. Создаем сервер

Редакция выделила бюджет, поэтому берем сервер помощнее. Например, провайдер IT-инфраструктуры Selectel предлагает серверы, оснащенные 4-768 ГБ ОЗУ, 2-72 ядрами ЦП, возможность подключить графический ускоритель и выбрать в качестве сервера даже Raspberry Pi 4 (4/64 ГБ) и Mac mini для iOS-разрабов. Плюс, быстрая тех. поддержка, наличие резервного копирования и API. Такие серверы предназначены для нескольких десятков небольших сайтов или одного крупного.

Мы выберем следующую конфигурацию:

Intel Core i7-8700, 6 ядер по 3.2 ГГц, 32 ГБ ОЗУ, 960 ГБ SSD – отлично, Джумлу потянет.

В качестве ОС выбираем Ubuntu 20.04:

Арендуем сразу два сервера, чтобы два раза не вставать:

Кликнем по Первому серверу, перейдем во вкладку Операционная система и узнаем IP нашего сервера, имя пользователя и пароль:

Чтобы зайти на сервер скачаем Putty (Windows), впишем в него IP-адрес, порт 22 и нажмем на Open:

Пользователям Ubuntu достаточно открыть терминал (Ctrl + Alt + T) и ввести:

ssh root@5.188.158.146

Нас попросят ввести логин и пароль. Заходим под рутом (root) и приступаем к установке Джумлы.

1.1. Обновление системы

Обновим систему:

sudo apt update && sudo apt upgrade

1.2. Создание пользователя

В целях безопасности не рекомендуется работать под рутом, поэтому создадим нового пользователя alfred с помощью команды adduser:

adduser alfred

Добавим пользователя alfred в группу sudo:

usermod -aG sudo alfred

Перелогинимся под пользователя alfred:

su - alfred

1.3. Установка сервера MySQL

Установим MySQL-сервер командой:

sudo apt install mysql-server

Скрипт mysql_secure_installation позволяет настроить базовую защиту MySQL-сервера:

sudo mysql_secure_installation

Что он делает:

  • устанавливает/меняет пароль root-пользователя;
  • удаляет анонимных пользователей;
  • ограничивает удаленный доступ root-пользователя;
  • удаляет тестовую базу данных.

Что нам выбрать:

Would you like to setup VALIDATE PASSWORD component? [Y/n]: N
Set root password? [Y/n]: N
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: N
Remove test database and access to it? [Y/n]:  Y
Reload privilege tables now? [Y/n]:  Y

Логин под рутом нам еще пригодится, поэтому оставим удаленный доступ.

1.4. Создание базы данных

Запускаем MySQL:

sudo mysql

Создадим базу данных joomla_db:

mysql> CREATE DATABASE joomla_db;

Создадим пользователя базы данных joomla_user с паролем password:

mysql> CREATE USER 'joomla_user'@'localhost' IDENTIFIED BY 'password';

Предоставим пользователю joomla_user все привилегии на управление таблицей joomla_db:

mysql> GRANT ALL PRIVILEGES ON joomla_db.* TO 'joomla_user'@'localhost';

Перезагрузим привилегии, чтобы изменения вступили в силу:

mysql> FLUSH PRIVILEGES;

Выйдем из mysql:

mysql> \q

1.5. Установка PHP

В репозиториях Ubuntu 20.04 присутствует только php 7.4. Поскольку нам нужна версия 8, потребуется подключить сторонний репозиторий PPA:

sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

Joomla 4 поддерживает PHP восьмой версии. Для установки PHP 8 и сопутствующих пакетов введем:

sudo apt install php8.0-fpm php8.0-cli php8.0-gd php8.0-opcache php8.0-mysql php8.0-mcrypt php8.0-xml php8.0-curl

Изменим параметры файла конфигурации php.ini в соответствии с параметрами нашего сервера. Воспользуемся командой sed, которая ищет строчку в файле и заменяет ее на другую:

sudo sed -i "s/memory_limit = .*/memory_limit = 32000M/" /etc/php/8.0/fpm/php.ini

Директива memory_limit устанавливает доступный для PHP объем памяти в мегабайтах (M):

sudo sed -i "s/upload_max_filesize = .*/upload_max_filesize = 128M/" /etc/php/8.0/fpm/php.ini

upload_max_filesize задает максимальный размер закачиваемого файла:

sudo sed -i "s/post_max_size = .*/post_max_size = 128M/" /etc/php/8.0/fpm/php.ini

post_max_size – максимально допустимый размер данных, отправляемых методом POST.

sudo sed -i "s/max_execution_time = .*/max_execution_time = 3000/" /etc/php/8.0/fpm/php.ini

max_execution_timeвремя, отведенное PHP-коду на исполнение.

Все настройки можно также изменить, открыв файл php.ini с помощью редактора nano:

sudo nano /etc/php/8.0/fpm/php.ini

1.6. Установка Nginx

Установим Nginx:

sudo apt install nginx

Зайдем на сайт, введя в браузере его IP. Если все хорошо, то получим приветственное сообщение:

Создадим конфигурационный файл виртуального хоста:

sudo nano /etc/nginx/sites-available/mysite.com

Здесь:

mysite.com – домен. Если у нас есть только IP-адрес и нет домена, мы все равно можем создать папку с именем домена и прописать путь к этой папке в настройках.

Заполним файл следующими строчками:

server {
    listen 80;
    server_name 5.188.158.146;
    root /var/www/mysite.com;

    index index.html index.htm index.php;

    charset utf-8;

    access_log /var/log/nginx/mysite.com.access.log;
    error_log /var/log/nginx/mysite.com.error.log info;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~* /(images|cache|media|logs|tmp)/.*.(php|pl|py|jsp|asp|sh|cgi)$ {
        return 403;
        error_page 403 /403_error.html;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ .php$ {
        fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi.conf;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Нажимаем сочетание клавиш Ctrl + O, затем Enter, чтобы сохранить изменения и Ctrl + X, чтобы выйти из редактора nano.

Здесь:

server_name 5.188.158.146 – сюда записываем через запятую IP-адрес и/или домен, например server_name 5.188.158.146, mydomain.com. Ограничимся только IP-адресом.

Мы создали виртуальный хост. Чтобы его активировать, создадим символьную ссылку на файл с конфигурацией и разместим ее в каталоге sites-enabled, который Nginx будет считывать при запуске:

sudo ln -s /etc/nginx/sites-available/mysite.com /etc/nginx/sites-enabled/mysite.com

Проверим конфигурацию Nginx на наличие синтаксических или системных ошибок:

sudo nginx -t

Если ошибок нет, получим:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

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

sudo systemctl restart nginx

1.7. Загрузка Джумлы

Скачаем последнюю версию Джумлы и переименуем архив в joomla.zip:

wget https://downloads.joomla.org/ru/cms/joomla4/4-0-2/Joomla_4-0-2-Stable-Full_Package.zip?format=zip -O joomla.zip

Создадим папку с нашим сайтом mysite.com:

sudo mkdir -p /var/www/mysite.com

Чтобы разархивировать архив, установим утилиту unzip:

sudo apt install unzip

Разархивируем Джумлу в папку mysite.com:

sudo unzip joomla.zip -d /var/www/mysite.com

Наделим пользователя www-data правами (chown) на все файлы и папки внутри директории (-R, то есть рекурсивно) /var/www/mysite.com:

sudo chown -R www-data: /var/www/mysite.com

Еще раз зайдем на наш сайт через браузер и увидим установщик Джумлы:

Создадим учетную запись:

Заполним параметры учетной записи админа:

и заполним поля с именем БД, именем пользователя БД и его паролем:

После установки Джумлы:

перейдем в панель администратора http://5.188.158.146/administrator/ (вместо этого IP напишите свой) залогинимся и создадим свою первую запись:

Заполним поля и кликнем по кнопке Save & Close:

Перейдем во вкладку Content Articles и кликнем по Toggle featured status:

Перейдем на главную страницу http://5.188.158.146/:

1.8. Настройка фаервола

UFW (Uncomplicated Firewall) – популярная и простая утилита для настройки и управления фаерволом в дистрибутивах Ubuntu и Debian. По умолчанию фаервол уже установлен, но не активирован.

Если фаервол вдруг не установлен, то установим его командой:

sudo apt install ufw

Узнаем текущий статус фаервола:

sudo ufw status

Фаервол выключен:

Status: inactive

Посмотрим профили приложений:

sudo ufw app list

В зависимости от пакетов, установленных в системе, вывод будет выглядеть следующим образом:

Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH

Разрешим фаерволу доступ к профилям OpenSSH и 'Nginx Full':

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'

Включим фаервол:

sudo ufw enable

Если понадобится отключить фаервол, воспользуемся командой:

sudo ufw disable

1.9. Защита от брутфорса: fail2ban

В сети полно ботнетов, непрерывно сканирующих стандартные порты подключения SSH и пытающихся выполнить атаку перебором. Защищаемся от этого, ограничив количество неудачных попыток входа на сервер с помощью программы fail2ban.

Установим fail2ban:

sudo apt install fail2ban

и проверим его статус:

sudo systemctl status fail2ban

Получим следующий вывод:

● fail2ban.service - Fail2Ban Service
	Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
	Active: active (running) since Thu 2021-09-09 18:18:55 EEST; 4s ago
  	Docs: man:fail2ban(1)
  Main PID: 79346 (f2b/server)
  	Tasks: 5 (limit: 2282)
	Memory: 13.4M
	CGroup: /system.slice/fail2ban.service
        	└─79346 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Утилита работает.

Чтобы изменить настройки fail2ban откроем файл конфигурации:

sudo nano /etc/fail2ban/jail.conf

Найдем в нем следующие строчки:
maxretry = 5 – количество неудачных попыток входа до бана.
findtime = 10m – IP-адрес банится, если в течение 10 минут было предпринято 5 неудачных попыток хода.
bantime = 10m – IP-адрес банится на 10 минут.

Если поменяли параметры, то нужно перезапустить сервис fail2ban, чтобы изменения вступили в силу:

sudo systemctl restart fail2ban

1.10. Установка SSL-сертификата

SSL-сертификат можно поставить только с доменом (IP-адрес не подойдет). Если домен есть, то получим и установим бесплатный сертификат через центр сертификации Let's Encrypt.

Для этого установим утилиту сerbot, которая автоматизирует все шаги и ее плагин для Nginx:

sudo apt install certbot python3-certbot-nginx

Получим сертификат для домена mydomain.com:

sudo certbot --nginx -d mydomain.com -d www.mydomain.com

2. Миграция

Теперь перенесем БД и файлы с Джумлой на второй сервер.

2.1. Устанавливаем PHP и Nginx

Данные второго сервера:

Заходим на второй сервер и обновляемся:

sudo apt update && sudo apt upgrade

Установим php:

sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt install php8.0-fpm php8.0-cli php8.0-gd php8.0-opcache php8.0-mysql php8.0-mcrypt php8.0-xml php8.0-curl

поставим nginx :

sudo apt install nginx

Откроем файл с конфигурацией Nginx:

sudo nano /etc/nginx/sites-available/mysite.com

Конфигурация как у первого сервера, только поменялся IP-адрес:

server {
    listen 80;
    server_name 84.38.184.67;
    root /var/www/mysite.com;

    index index.html index.htm index.php;

    charset utf-8;

    access_log /var/log/nginx/mysite.com.access.log;
    error_log /var/log/nginx/mysite.com.error.log info;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~* /(images|cache|media|logs|tmp)/.*.(php|pl|py|jsp|asp|sh|cgi)$ {
        return 403;
        error_page 403 /403_error.html;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ .php$ {
        fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi.conf;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Создадим символьную ссылку:

sudo ln -s /etc/nginx/sites-available/mysite.com /etc/nginx/sites-enabled/mysite.com

Проверим файл конфигурации на ошибки:

sudo nginx -t

Перезапустим сервер Nginx:

sudo systemctl restart nginx

2.2. Переносим базу данных

Перенос БД включает в себя следующие шаги:

  1. Экспорт БД с помощью утилиты mysqldump.
  2. Архивация дампа БД.
  3. Перенос архива с дампом БД на второй сервер, используя команду scp.
  4. Создание пользователя базы данных и пустой базы данных на втором сервере.
  5. Распаковка архива с дампом БД на втором сервере.
  6. Импорт в пустую базу данных дампа БД.

Зайдем на первый сервер и перелогинимся под рута:

sudo su

Сделаем дамп базы данных с помощью утилиты mysqldump и сохраним дамп БД в папке /home/alfred/:

mysqldump -u root -p joomla_db > /home/alfred/joomla_db.sql;

Установим архиватор zip:

sudo apt install zip

Перейдем в папку пользователя alfred:

cd /home/alfred/

и заархивируем дамп БД:

zip /home/alfred/database.zip ./joomla_db.sql

Создадим на втором сервере пользователя alfred:

sudo adduser alfred
sudo usermod -aG sudo alfred

Перенесем дамп БД с первого сервера на второй. Для этого вернемся к первому серверу и введем:

scp /home/alfred/database.zip root@84.38.184.67:/home/alfred

Здесь:

команда scp – копирует файлы по ssh между компьютерами под управлением Linux.
root – логин администратора второго сервера.
84.38.184.67 – IP второго сервера.

Зайдем на второй сервер и установим утилиту для распаковки архива unzip:

sudo apt install unzip

Распакуем архив с дампом БД в папку пользователя alfred:

sudo unzip /home/alfred/database.zip -d /home/alfred

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

sudo apt install mysql-server

Откроем MySQL:

sudo mysql

Создадим пустую базу данных joomla_db:

mysql> CREATE DATABASE joomla_db;

Создадим пользователя базы данных joomla_user:

mysql> CREATE USER 'joomla_user'@'localhost' IDENTIFIED BY 'password';

Дадим ему привилегии на управление базой данных:

mysql> GRANT ALL PRIVILEGES ON joomla_db.* TO 'joomla_user'@'localhost';

Перезагрузим привилегии:

mysql> FLUSH PRIVILEGES;

Выйдем из MySQL:

mysql> \q

Перейдем в папку пользователя alfred:

cd /home/alfred/

Импортируем в пустую базу данных joomla_db дамп БД, который мы сделали на первом сервере:

mysql -u root -p joomla_db < /home/alfred/joomla_db.sql;

Базу данных перенесли, теперь очередь Джумлы.

2.3. Переносим файлы Джумлы

Перенос файлов Джумлы включает в себя следующие шаги:

  1. Архивация папки с Джумлой.
  2. Перенос архива на второй сервер с помощью команды scp.
  3. Распаковка архива в папку /var/www/mysite.com.

Зайдем на первый сервер:

cd /var/www/

Заархивируем файлы Джумлы в папку пользователя alfred:

sudo zip -r /home/alfred/joomla_copy.zip ./mysite.com

Создадим на втором сервере папку mysite.com:

sudo mkdir -p /var/www/mysite.com

Зайдем на первый сервер и перенесем архив с Джумлой на второй сервер:

scp /home/alfred/joomla_copy.zip root@84.38.184.67:/home/alfred

Зайдем на второй сервер и разархивируем архив с Джумлой в папку /var/www/:

sudo unzip /home/alfred/joomla_copy.zip -d /var/www/

Наделим пользователя правами (chown) на подпапки с сайтом:

sudo chown -R www-data: /var/www/mysite.com

Перейдем на главную страницу второго сервера http://84.38.184.67:

Миграция завершена.

PS: в целях безопасности можно отключить логин под рутом по SSH. Для этого откроем конфиг SSH-сервера:

sudo nano /etc/ssh/sshd_config

Найдем строчку PermitRootLogin yes и поменяем yes на no.

Перезапустим сервер SSH:

sudo service sshd restart

или

sudo systemctl restart sshd

3. Расширения

Расширения Joomla помогут превратить сайт в интернет-магазин, ускорить загрузку сайта, позаботиться о безопасности и многое другое. Расширения доступны по адресу

extensions.joomla.org. Вот самые популярные из них:

Расширения для интернет магазина

  • HikaShop – расширение электронной коммерции для всех версий Joomla.
  • JoomShopping – более 400 тыс. новых пользователей расширением за 3 года.
  • EShop – просто устанавливаете, добавляете продукты, включаете встроенные модули, плагины оплаты, плагины доставки и начинаете принимать заказы.

SEO

  • Google Structured Data – помогает размечать структурированные данные на страницы, чтобы Google точнее распознавал данные на ней и использовать их в результатах поиска.
  • EO-Generator, Aimy Speed Optimization PRO – увеличивает скорость загрузки страницы за счет объединения, сжатия и кэширования файлов.
  • TAGZ Open Graph – сообщает социальным сетям какую информацию отображать каждый раз, когда кто-либо другой делится ссылкой на ваш сайта.

Безопасность

  • Watchful Client – автоматизирует такие задачи, как создание резервных копий сайта, сканирование на наличие признаков проникновения и обновление расширений.
  • SpambotCheck – используя черные списки электронной почты, предотвращает регистрацию и вход смап-ботов.
  • OSpam-a-note – блокирует регистрацию ботов за счет меток времени: если форма отправлена очень быстро, то регистрация будет заблокирована.
  • Brute Force Stop – защищает сайт от брутфорса.
  • Admin Tools – уведомит вас о новых релизах Joomla, исправит разрешения ваших файлов и каталогов, защитит каталог администратора паролем, изменит префикс вашей базы данных и многое другое.

Отображение контента

  • Mini FrontPage – отражает статьи из выбранных категорий с датой и дизайном на выбор.
  • Latest News+ Date – кастомизирует отображение новостей как предыдущее расширение.
  • Vertical scroll recent article – заголовок статьи будет прокручиваться снизу вверх по вертикали.
  • DJ-ImageSlider – создает неограниченное количество групп и слайдов.
  • Slideshow CK – отображает изображения или видео с красивыми эффектами.
  • Phoca Gallery – галерея с 15 способами отображения контента.
  • Advanced Custom Fields – расширяет коллекцию основных полей Joomla: YouTube, Vimeo, HTML-Audio, Google Map и др.
  • GMapFP OpenStreetMap Custom Field – позволяет пользователям и редактору легко устанавливать маркеры на карту OpenStreetMap.
  • GMapFP : Google Map or Openstreet Map – можно использовать Google Maps и Openstreet Maps вместе.

4. Локализация Джумлы

Чтобы поменять язык на русский перейдем в SystemLanguage → Вводим в поле поиска russianInstall:

Сделаем Русский язык основным: SystemManageLanguages → Выберем Russian значением по дефолту:

5. Ускорение Джумлы и настройка бэкапа

5.1. Включение кэша

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

Чтобы включить кэширование перейдем в Панель управленияОбщие настройкиСистема и выберем Стандартное кэширование:

Стандартное кэширование отдает одинаковый кэш всем посетителям, прогрессирующее кэширование создает кэш для каждого отдельного посетителя.

Чтобы сбросить кэш, откроем Панель управления → вкладку System и кликнем по Очистить кэшОчистить все.

5.2. Сжатие страницы

Gzip сжимает страницу перед отправкой ее посетителю. Для включения сжатия перейдем:

Панель управленияОбщие настройкиСервер и включим Gzip-сжатие страниц:

5.3. Объединение CSS и JavaScript

Расширение JCH Optimize объединяет JavaScript- и CSS-файлы в один, снижая объем передаваемых данных и уменьшая количество HTTP-запросов к серверу.

Чтобы установить расширение перейдем в СистемаРасширенияУстановить из JED и введем в поле поиска JCH Optimize:

Перейдем на страницу расширения и установим его. Настройки расширения доступны в КомпонентыJCH Optimize. По умолчанию сжатие JS и CSS включены.

5.4. Настройка бэкапа

С помощью расширения Akeeba Backup можно делать бэкапы в один клик. Установим Akeeba Backup через JED. Теперь перейдем в КомпонентыAkeeba Backup и кликнем по кнопке Default Backup Profile. Бэкап создается автоматически и будет доступен в Manage Backups:

5.5. Быстрый хостинг

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

***

В этой статье мы:

  • научились работать со стеком LEMP: Linux, Nginx, MySQL, PHP;
  • установили Joomla на выделенный сервер;
  • настроили фаервол и ограничили количество неудачных попыток входа сервер;
  • перенесли готовый Joomla-сайт на другой сервер;
  • ускорили работу Joomla.

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

suvorovsda
13 февраля 2022

🌐 Почему данные в интернете не идут по самому короткому пути или как на самом деле работает CDN?

Из этой статьи узнаете, как выглядит интернет изнутри, какие существуют топ...
Библиотека программиста
21 января 2018

Компьютерные сети от А до Я: классификация, стандарты и уровни

Компьютерные сети непросты в изучении, ведь технологий и протоколов много, ...