Пункт 1.0.0.0 (изменение часового пояса сервера)

sudo dpkg-reconfigure tzdata

В появившемся меню выбираем "Europe" -> "Moscow"

Обратите внимание, что крон автоматически не подхватывает новый часовой пояс, его надо перезагрузить:

sudo service cron restart

Пункт 1.0.0.1 (проверяем настройку кириллицы в консоли)

Неплохо бы чтобы в консоли понимались файлы с русскими символами, для этого устанавливаем пакет локалей

sudo apt install locales

после этого настраиваем его:

sudo dpkg-reconfigure locales
можно выбрать только одну локализацию
en_US.UTF-8

Пункт 1.0.0.2 (изменяем название сервера/hostname)

На мой взгляд правильно каждый сервер называть своим понятным и читаемым именем, а не тем, что вам приподносит хостер, например мы можем заменить "мзы-server-548739" на понятное для вас имя "companyname-ru-msk-WEBServer-01":


echo 'companyname-ru-msk-WEBServer-01 ' > /etc/hostname 
для обновления настроек нужно перезагрузить сервер
sudo reboot

Пункт 1.0.1 (обновляем Ubuntu)

Теперь же необходимо обновить все пакеты в нынешней системе до актуальных версий:

sudo apt update && sudo apt dist-upgrade

Выбираем варианты на ваш выбор:

[O] keep the local version currently installed т.к. вашим хостинг-провайдером могут быть изначально вписаны дополнительные днс и тп
show the differences between the versions — для сравнения разницы в файлах

Пункт 1.0.2.0 (настройка ssh: меняем порт ssh)

sudo nano /etc/ssh/sshd_config

Ищем в открывшемся файле следующую строку:

#Port 22

Если строка начинается с символа #, его нужно удалить и вместо 22 порта, написать любой другой, например 48922:

Port 48922

На википедии можно ознакомиться со списком используемых и свободных TCP/UDP портов


Перезапускам демон ssh для применения настроек:

sudo /etc/init.d/ssh restart
или
sudo service ssh restart

Если вы допустили какую-либо ошибку в конфигурационном файле, то вы можете потерять связь с сервером. Будьте осторожны!

Далее, установив netstat можно проверить корректность сделанных изменений:

sudo apt install net-tools

После установки вводим следующую команду:

netstat -tulpan | grep ssh

В результатах мы должны увидеть наш указанный ранее порт, например:

tcp   0   0 0.0.0.0:48922   0.0.0.0:*   LISTEN 2355/shd  

После чего отключаемся от сервера по ssh, меняем в вашей программе порт на указанный ранее (пр.: 48922) и подключаемся уже с новым портом


Пункт 1.0.2.1 (настройка ssh: отключаем DebianBanner)

Добавим ещё один полезный параметр, который отсутствует в файле sshd_config – DebianBanner. Этот параметр добавляет в строку ответа sshd информацию об операционной системе, при обращению к серверу по протоколу TELNET или при сканировании nmap. Эта строка может выглядеть так: SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze1. Скроем информацию о нашей операционной системе.

sudo nano /etc/ssh/sshd_config 
и вписываем в самом конце:
DebianBanner no
Для применения изменений рестартуем ssh:
sudo service ssh restart

Пункт 1.0.2.2 (настройка ssh: включаем проверку прав на директорию подключения StrictModes)

Опция "StrictModes" определяет должен ли ssh проверять права пользователей в их домашних каталогах и файлы rhosts перед тем, как пустить на сервер. Эта опция должна всегда быть установлена в "yes", потому что иногда пользователи могут случайно оставить свои каталоги и файлы открытыми всем для записи.

sudo nano /etc/ssh/sshd_config 
Находим и изменяем (раскомментируем): 
StrictModes  yes
Для применения изменений рестартуем ssh: 
sudo service ssh restart  

Пункт 1.0.2.3 (настройка ssh: отключаем доступ у root пользователя PermitRootLogin )

Этот параметр разрешает или запрещает вход по SSH под суперпользователем "root". Запрещаем вход суперпользователю.

sudo nano /etc/ssh/sshd_config 
Находим и изменяем:
PermitRootLogin no
Для применения изменений рестартуем ssh:
sudo service ssh restart

Пункт 1.0.3 (устанавливаем htop)

htop — продвинутый монитор процессов, написанный для Linux. Он был задуман заменить стандартную программу top. Htop показывает динамический список системных процессов, список обычно выравнивается по использованию ЦПУ. В отличие от top, htop показывает все процессы в системе. Также показывает время непрерывной работы, использование процессоров и памяти. Htop часто применяется в тех случаях, когда информации даваемой утилитой top недостаточно, например при поиске утечек памяти в процессах. Htop написан на языке Си и использует для отображения библиотеку Ncurses. Я всегда ставлю его при установке системы и моментально забываю про утилиту top.

sudo apt install htop

Команда запуска:

htop

Для выхода нажимаем F10 или CTRL+C

Столбцы:

PID - идентификатор процесса.
USER - владелец процесса.
PRI - текуший приоритет (влияет на процессорное время, отводимое процессу, значение по умолчанию - 20; чем меньше приоритет, тем больше времени отводится процессу, следовательно он выполняется быстрее).
NI - величина изменения приоритета относительно значения PRI (клавиши F7, F8).
VIRT - общий объем виртуальной памяти, используемой процессом. Включает в себя: область кода (CODE), данные (DATA), разделяемые библиотеки (SHARED) и страницы, перемещенные в swap-область памяти. Если приложение потребовало от ядра выделить ему 100Мб памяти, а использует всего 5 Мб, данный столбец всё равно будет показывать цифру 100.
(CODE - объем памяти, содержащий исполняемый код процесса.
DATA - объем памяти, занятой данными, используемыми процессом в ходе выполнения.
SWAP - объем памяти, используемой процессом, но перемещенной в swap-область.)
RES - количество резидентной (не перемещаемой в swap) памяти в килобайтах. Если приложение потребовало от ядра выделить ему 100Мб памяти, а использует всего 5 Мб, то данный столбец покажет 5. Но здесь есть два ньюанса: 
а) RES не показывает сколько данных было перемещено в swap, 
б) часть RES-памяти может быть разделяемой.
SHR - количество разделяемой (shared) памяти программы в килобайтах, т.е. памяти, которая может быть использована другими приложениями.

S - состояние процесса:
S — так называемое состояние сна;
R — состояние выполнения;
D — состояние ожидания.

CPU% - использование процессора в процентном отношении.
MEM% - использование процессом памяти в процентном отношении.
TIME+ - время работы процесса.
Command - указывает на команду, которой был запущен процесс.
Через настройки (F2) можно добавить еще некоторые полезные параметры:
IO RATE - Операции ввода\вывода. Чтение + запись. Если нужно отдельно на чтение и на запись, то можно добавить:
IO READ RATE и IO WRITE RATE.
Также на экран выводятся следующие параметры:
Load average - отражает число блокирующих процессов в очереди на исполнение в определенный временной интервал, а именно 1 минута, 5 минут и 15 минут, соответственно. Блокирующий процесс — это процесс, который ожидает ресурсов для продолжения работы.
Uptime - время работы системы.

Управление:

F1 - справка;
F2 - настройки;
F3 - поиск процесса;
F4 - сортировка списка процессов (от большего к меньшему или от меньшего к большему);
F5 - устанавливает древовидное отображение (корни - родительские процессы, а листья - дочерние) и наоборот;
F6 - открывает панель с выбором параметра сортировки процессов;
F7 - увеличить приоритет выполнения текущего процесса;
F8 - уменьшить приоритет выполнения текущего процесса;
F9 - убить процесс;
F10 - выйти из программы.

Пункт 1.0.5 (устанавливаем Midnight Commander)

Midnight Commander - консольный файловый менеджер для Linux.

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

В консольном окружении для работы с файлами вы должны знать основные команды и их синтаксис. К счастью, в Linux также имеется текстовый файловый менеджер, работающий в консольном окружении. Он называется Midnight Commander (далее мы будем называть его просто MC).

Для установки вводим:

sudo apt install mc

Команда запуска:

mc или sudo mc

Для выхода нажимаем F10

Пункт 1.1.6 (устанавливаем и настраиваем ProFTPD(FTP-сервер))

Я очень надеюсь, что большинство из вас прекрасно понимает, что устанавливать ftp сервер proftpd (как и любой другой) в 2019 году очень неразумно. Используйте SFTP!

Для установки вводим:

sudo apt install proftpd

Открываем файл настроек:

sudo nano /etc/proftpd/proftpd.conf

Далее отключаем ipv6 (зачем вам на сервере с ftp -- ipv6? *сарказм* )

UseIPv6   off

По желанию можно изменить приветственное название от сервера:

ServerName   "FTPServerOK"

Весьма желательно изменить стандартный ftp порт, например на 48921:

Port   48921

Для того, что бы пользователи не могли выйти из домашнего каталога изменяем (раскоментируем) строчку:

DefaultRoot   ~

Для разрешения перезаписи файлов проверяем наличие следующей строчки:

AllowOverwrite on

Следующие настройки добавляем в конце текущего файла

Пользователь root не должен иметь возможности зайти на сервер. Добавляем ещё одну строчку:

RootLogin   off

Разрешаем докачку загружаемых на сервер файлов:

AllowStoreRestart   on

В целях безопасности отключаем идентификацию proftpd сервера
(в консоли ftp клиента):

ServerIdent   off

Так же можно изменить идентификацию на произвольную:

ServerIdent on "Welcome to FuckingTypeServer"

На этом настройка ftp сервера proftpd завершена, перезапускам его:

sudo service proftpd restart 
или
sudo /etc/init.d/proftpd restart 

Небольшое отступление для тех, кто набрел на эту статью, после того, как казалось бы правильно настроенный сервер при попытке подключения сообщает что-то вроде: "FTP ошибка 530, некорректные данные аутентификации", "ProFTPD login failing with 530" или "proftpd 530 login incorrect", то вы наверняка будете рады тому, что найдете ниже, а именно следующую строку и правильный процесс создания пользователя.

Далее нужно выполнить следующие операции, иначе кина не будет:

sudo nano /etc/shells

в самом конце файла добавить:

/bin/false

Сохраняем файл и закрываем редактирование.

Добавление пользователей/ftp

sudo useradd sample_user_name -b /home -m -U -s /bin/false;

где, sample_user_name -- имя пользователя, папка которого будет находиться по адресу /home/sample_user_name/

Создаем пароль пользователя

sudo passwd sample_user_name 

Вводим пароль, подтверждаем и всё, готово, можно подключаться к ftp серверу.

Пункт 1.1.7 (устанавливаем и настраиваем file2ban)

Принцип работы fail2ban прост. Специальный сервис ищет в системных журналах (логах) записи о неудачных попытках аутентификации и при определенных условиях с помощью iptables блокирует IP-адреса, с которых ведется атака.

Устанавливаем пакет fail2ban:

sudo apt install fail2ban

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

sudo systemctl enable fail2ban

После этого служба fail2ban запустится автоматически. В этом можно убедиться, проверив статус следующей командой:

sudo systemctl status fail2ban

Результат должен быть примерно следующим

fail2ban.service - Fail2Ban Service
      Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
      Active: active (running) since Wed 2021-01-01 01:01:01 MSK; 5min ago
        Docs: man:fail2ban(1)
     Process: 454 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
    Main PID: 463 (f2b/server)
       Tasks: 5 (limit: 125068)
      Memory: 17.4M
      CGroup: /system.slice/fail2ban.service
              └─463 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Файлы настроек fail2ban расположены в каталоге /etc/fail2ban/:

  • /fail2ban.conf – дефолтные настройки сервиса fail2ban;
  • /fail2ban.d/ – пользовательские настройки сервиса fail2ban;
  • /jail.conf – дефолтные настройки для защищаемых сервисов;
  • /jail.d/ – пользовательские настройки для защищаемых сервисов;
  • /filter.d/ – настройки шаблонов поиска в системных журналах (логах);
  • /action.d/ – настройки исполняемых действий;
  • /paths*.conf – настройки путей для различных операционных систем.

Чтобы ваши настройки не перезаписывались при обновлении пакетов, рекомендуем вместо редактирования файлов с дефолтным настройками создавать собственные (пользовательские) файлы настроек.

Вам необходимо удалить дефолтные настройки защиты sshd (очищаем файл):

cat /dev/null >/etc/fail2ban/jail.d/defaults-debian.conf

Затем создайте файл /etc/fail2ban/jail.d/sshd.local и добавляете в файл следующие записи:

nano /etc/fail2ban/jail.d/sshd.local

[sshd]
enabled = true
#порт, на который вы изменили стандартный 22 ssh:
port = 48922
#баним на 24 часа:
bantime = 86400 
#если за 2 часа:
findtime = 7200 
#более 2 неудачных попыток авторизации:
maxretry = 2 

Теперь если параметр enabled будет иметь значение true, сервис fail2ban заблокирует соответствующий IP-адрес на количество секунд, прописанное в параметре bantime, при условии, что за период, указанный в секундах в параметре findtime, с этого адреса будет проведено заданное параметром maxretry или большее число неудачных попыток ssh-аутентификации. По прошествии периода, прописанного в параметре bantime, заблокированный IP-адрес автоматически разблокируется.

В нашем примере IP-адрес будет блокироваться на 86400 секунд (24 часа), если в течение последних 7200 секунд (2х часов) с него было осуществлено 2 и более неудачных попыток аутентификации.

Настройка сервиса fail2ban завершена, необходимо его перезапустить:

sudo systemctl restart fail2ban 

В ходе использования fail2ban вам может понадобиться на время снять блок с конкретного IP-адреса или добавить его в список исключений.

Прежде всего, убедитесь, что нужный IP-адрес находится в списке заблокированных:

fail2ban-client status sshd

В результате исполнения данной команды вы получите список, где будет указано количество неудачных попыток аутентификации и список заблокированных IP-адресов.

Результат команды:

Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 12
| ̀ - File list: /var/log/secure
̀ - Actions
|- Currently banned: 1
|- Total banned: 2
̀ - Banned IP list: 8.8.4.4

Добавить ip в список исключений fail2ban:

 fail2ban-client set sshd addignoreip 8.8.4.4 

Разблокировать ip в fail2ban:

fail2ban-client set sshd unbanip 8.8.4.4

Более подробно 1: https://andreyex.ru/linux/kak-ustanovit-i-nastroit-fail2ban-v-ubuntu-20-04/

Более подробно 2: https://www.servers.ru/knowledge/linux-administration/how-to-protect-ssh-using-fail2ban-on-ubuntu-16_04 и тут: https://linux-notes.org/udalit-iz-fail2ban-zablokirovanny-j-ip/


Пункт 1.1.8 (настройка приветствия консоли, устанавливаем landscape-common)

Добавляем консольную информационную плюшку

sudo apt install landscape-common
после чего перезагружаем сервер
sudo reboot

так же можно почитать https://4skill.ru/nastrojka-privetstviya-konsoli-ubuntu-server/

Пункт 1.1.9 (настройка приветствия консоли, устанавливаем update-notifier)

Было бы не плохо при входе в консоль получать количество пакетов, которые можно обновить. Жаль, весит обновление почти полгига, ну да не суть. Если у вас впс не на 5Гб, то можно и поставить, в остальном не самая обязательная штука.

apt install update-notifier
после чего перезагружаем сервер
sudo reboot 

В UBUNTU 20.04 ИСПОЛЬЗУЕМ СЛЕДУЮЩИЙ КОД:

apt-get -s dist-upgrade | grep "^[[:digit:]]\+ upgraded"

ПОДРОБНЕЕ: https://unix.stackexchange.com/questions/105463/machine-readable-number-of-updates-alternative-to-usr-lib-update-notifier-apt

Пункт 1.1.10 (добавление нового системного пользователя)

т.к. заходить под рутом мягко говоря не рекомендовано, то мы должны создать нового пользователя, например "your_user_name":

adduser your_user_name 
после чего вводим СЛОЖНЫЙ пароль этого пользователя и записываем в надежном месте, а лучше в двух, т.к. потеряв его вы в дальнейшем потеряете доступ к серверу.
Пример хорошего пароля: qtR_L2qWr@K9DU

После чего нужно дать возможность пользователю выполнять команды sudo:

nano /etc/sudoers

Вписываем в самом конце следующую строку

имя_пользователя ALL=(ALL) ALL
например:
 your_user_name ALL=(ALL) ALL 

Далее, при попытке войти на сервер по ssh под новым пользователем можно зайти под рутом, для этого выполняем:

su
вводим пароль пользователя root

После этого обязательно нужно отключить возможность авторизации root пользователя по ssh:

sudo nano /etc/ssh/sshd_config

и исправляем значение на no
PermitRootLogin no

после чего перезагружаем ssh командой:
sudo service ssh restart

После чего можно отключиться от ssh и попробовать снова залогиниться под пользователем root. Если вы всё правильно настроили, то ничего не получится. Нужно подключаться по дополнительному созданному вами пользователю your_user_name.

На запрос пароля sudo надо отвечать СВОИМ паролем. На su - паролем рута.
PermitRootLogin no означает, что нельзя зайти рутом по ssh, надо зайти просто пользователем, а потом (если надо) поднимать привилегии до рута. Нормальная политика безопасности. Имя root слишком известно 🙂

Можно сделать НЕБЕЗОПАСНЫЙ финт ушами и отключить у вашего только что созданного пользователя (your_user_name) ввод пароля после попытки запуска команд от суперпользователя root (su/sudo/sudo -s):

Открываем от root пользователя следующий файл:
sudo nano /etc/sudoers

после чего в самый конец файла добавляем строчку:
your_user_name  ALL=(ALL) NOPASSWD:ALL 

Не забыв заменить your_user_name на имя вашего нового пользователя.

После этого вы сможете запускать команды не вводя пароль root пользователя.

Стоить помнить, что данный способ является плохим примером безопасности!

Пункт 1.2.0 (установка и настройка nginx)

sudo apt install nginx

Пункт 1.2.1 (установка самой последней версии nginx)

Т.к. основной репозиторий Ubuntu содержит не самую последнюю версию Nginx, то нам приходится ещё две минуты покопировать команды, для подключения официального Nginx репозитория.

Установите пакеты, необходимые для подключения apt-репозитория:

sudo apt install curl gnupg2 ca-certificates lsb-release 

Для подключения apt-репозитория для стабильной версии nginx, выполните следующую команду (я использую её):

echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \     | sudo tee /etc/apt/sources.list.d/nginx.list 

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

Для UBUNTU 18.04.2
echo "deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx" \
     | sudo tee /etc/apt/sources.list.d/nginx.list
Для UBUNTU 20.04.1
echo "deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ focal nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ focal nginx" \
     | sudo tee /etc/apt/sources.list.d/nginx.list

Теперь нужно импортировать официальный ключ, используемый apt для проверки подлинности пакетов:

curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add - 

Проверьте, верный ли ключ был импортирован:

sudo apt-key fingerprint ABF5BD827BD9BF62 

Вывод команды должен содержать полный отпечаток ключа 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62:

pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
uid [ unknown] nginx signing key signing-key@nginx.com

Чтобы установить/обновить nginx, выполните следующие команды:

 sudo apt update && sudo apt install nginx

После этого можно проверить актуальность установленной версии nginx командой:

nginx -v

И сравнить версию с версией на официальном сайте nginx https://nginx.org/en/download.html (Stable version)

Пункт 1.2.2 (правим конфиги nginx для мультисайтинга)

Переименовываем старый файл настроек nginx:
sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf_OLD


Создаем новый файл настроек nginx:
sudo nano /etc/nginx/nginx.conf
и вставляем в него следующее содержимое:

user www-data;
worker_processes 4; #Количество одновременно запущенных процессов nginx должно быть равно количеству ядер вашего процессора
pid /run/nginx.pid;

events {
	worker_connections 300;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##
	
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 30;
	types_hash_max_size 2048;
	server_tokens off;
	#more_set_headers 'Sever: EGOmedia fast server';

	client_max_body_size 00m;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# nginx-naxsi config
	##
	# Uncomment it if you installed nginx-naxsi
	##

	#include /etc/nginx/naxsi_core.rules;

	##
	# nginx-passenger config
	##
	# Uncomment it if you installed nginx-passenger
	##
	
	#passenger_root /usr;
	#passenger_ruby /usr/bin/ruby;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}


#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
# 
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}

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

mkdir {/etc/nginx/sites-available,/etc/nginx/sites-enabled}

Перезагружаем nginx командой:

sudo service nginx restart

После чего переходим в браузере по адресу: http://ip_вашего_сервера

Если всё настроено правильно, то вы должны будете увидеть примерно следующий текст:

  Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.

Пункт 1.2.1 (установка и настройка MySQL)

MySQL является системой управления базами данных с открытым исходным кодом и обычно используется, как часть популярного стека LAMP (Linux, Apache, MySQL, PHP/Python/Perl). MySQL использует реляционную базу данных и SQL (Structured Query Language, язык структурированных запросов) для управления данными.

Короткая версия установки очень проста: достаточно обновить индекс пакетов, установить пакет mysql-server, а затем запустить скрипт настройки безопасности.

Обновляем индекс пакетов apt командой:

sudo apt update 

Затем устанавливаем сам пакет MySQL:

Было:
sudo apt install mysql-server
Стало:
sudo apt install mariadb-server

В случае новой установки MySQL вам необходимо выполнить скрипт безопасности. Он изменяет некоторые настройки по умолчанию на более безопасные, например, удалённый вход для пользователей root и пользователи, созданные по умолчанию. В старых версиях MySQL вам было необходимо также инициализировать директорию данных вручную, теперь это делается автоматически.

Выполните скрипт безопасности командой:

 sudo mysql_secure_installation 

В результате выполнения этого скрипта вам будет предложено внести изменения в настройки безопасности вашей MySQL:

1.Сначала вам будет предложено установить плагин валидации паролей (Validate Password Plugin), который позволяет тестировать надёжность паролей MySQL.(можно нажать любую клавишу (кроме Y/y) для отмены установки плагина)

2. Далее вам предложат задать пароль для пользователя root вашей установки MySQL. Выберите надёжный пароль и введите его два раза.

3. Далее вы можете выбирать Y и нажимать ENTER для всех последующих вопросов. При этом будут удалены некоторые анонимные пользователи и тестовые базы данных, будет отключена возможность удалённого входа для root пользователей, после чего все внесённые изменения будут применены к вашей установке MySQL.

Подробности настройки MySQL 18.04 https://www.digitalocean.com/community/tutorials/mysql-ubuntu-18-04-ru

Подробности настройки MySQL 20.04 https://www.digitalocean.com/community/tutorials/how-to-install-mariadb-on-ubuntu-20-04-ru

Пункт 1.3.0 (установка и настройка apache2-mpm-itk)

Модуль apache2-mpm-itk для Apache нужен для того чтобы запускать виртуальные хосты vhosts под своим UID или GID, проще говоря, скрипты сайта должны быть недоступны для других хостов даже для чтения (в случае взлома одного сайта не смогли взломать другой сайт находящихся на этом сервере).

Я уже давно использую apache2-mpm-itk на своих серверах, но после попытки установить apache2-mpm-itk в Ubuntu 18.04, понял что кое-что изменилось.

Теперь apache2-mpm-itk является отдельным модулем в Apache2 и устанавливается как модуль.

Чтобы установить модуль apache2-mpm-itk в Ubuntu 18.04 необходимо:

Установить apache2 в Ubuntu 18.04:

sudo apt install apache2 

После чего вы получите ошибку, это нормально.

Установить модуль libapache2-mpm-itk:

 sudo apt install libapache2-mpm-itk

Включить модуль apache2-mpm-itk:

sudo a2enmod mpm_prefork
sudo a2enmod mpm_itk

Редактируем файл конфигурации, т.к. Apache по-умолчанию принимает запросы из интернета (80 порт и из-за его занятости была ошибка), а у нас это делает nginx:

sudo nano /etc/apache2/ports.conf

И изменяем строчку:

Listen 80
на
Listen 127.0.0.1:8080

Перезагружаем apache командой:

sudo service apache2 restart

Смотрим какие модули у нас установлены:

sudo apachectl -t -D DUMP_MODULES 

и если видим:

.......
mpm_itk_module (shared)
........

То модуль apache2-mpm-itk установлен в Ubuntu 18.04 и можно дальше настраивать сервер.

В виртуальных хостах apache ничего не изменилось:

<IfModule mpm_itk_module>
    AssignUserId user-www user-www
</IfModule>

Где user-www меняем на вашего пользователя.

Пункт 1.4.0 (установка и настройка php 7.3)

В случае ошибки добавления смотрим подсказку ниже

Добавляем PPA репозиторий:

sudo add-apt-repository ppa:ondrej/php
Нажимаем Enter.

Пункт 1.4.0.1 Fix add-apt-repository: command not found error

Иногда после этой команды выскакивает ошибка следующего вида:

 sudo: add-apt-repository: command not found 

Ошибка проста. Пакет add-apt-repository не установлен в вашей системе.

Если вы попытаетесь использовать sudo apt-get install add-apt-repository, это не сработает.

Это связано с тем, что команда add-apt-repository находится в пакете software-properties-common, и вам необходимо установить этот пакет, чтобы установить add-apt-repository.

Поэтому во избавление ошибки (если она появилась) используем следующую команду:

sudo apt-get install software-properties-common 
подтверждаем установку кнопкой:
Y
и снова пытаемся добавить репозиторий вышеуказанной командой:
sudo add-apt-repository ppa:ondrej/php 

Если ошибка не появились или вы её успешно исправили, то далее обновляем список командой:

sudo apt-get update 

Установите PHP 7.3, используя следующую команду:

php 8.0.1 https://www.cloudbooklet.com/how-to-install-php-8-on-ubuntu/

php7.3
sudo apt-get install php7.3 libapache2-mod-php7.3 php7.3-mysql php7.3-curl php7.3-gd php7.3-imagick php7.3-snmp php7.3-imap php7.3-recode php7.3-zip php-pear php7.3-memcache libapache2-mod-php7.3 php7.3-bcmath 
php8.0.1:
sudo apt-get install php8.0 libapache2-mod-php8.0 php8.0-mysql php8.0-curl php8.0-gd php8.0-imagick php8.0-snmp php8.0-imap php8.0-recode php8.0-zip php-pear php8.0-memcache libapache2-mod-php8.0 php8.0-bcmath 

На появившиеся в процессе установки вопросы отвечаем Y

Используйте следующую команду, чтобы проверить версию PHP, установленную на вашем сервере:

php -v

Вывод должен быть примерно следующим:

PHP 7.3.x-x+ubuntu18.04.1+deb.sury.org+1 (cli) (built: xxx  x xxxx xx:xx:xx) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.x, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.x-x+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies

PHP 8.0.1 (cli) (built: Jan 13 2021 08:22:35) ( NTS )
 Copyright (c) The PHP Group
 Zend Engine v4.0.1, Copyright (c) Zend Technologies
     with Zend OPcache v8.0.1, Copyright (c), by Zend Technologies

Перезапускаем Apache для применения изменений:

sudo service apache2 restart

Дополнительно вносим изменения в конфигурационный файл Apache:

sudo nano /etc/apache2/apache2.conf

Находим следующие строчки:

<Directory />
       Options FollowSymLinks
       AllowOverride None
       Require all denied
</Directory>

<Directory /usr/share>
       AllowOverride None
       Require all granted
</Directory>

<Directory /var/www/>
       Options Indexes FollowSymLinks
       AllowOverride None
       Require all granted
</Directory>

<Directory /srv/>
       Options Indexes FollowSymLinks
       AllowOverride None
       Require all granted
</Directory>

Их нужно закомментировать и добавить после них следующие пять строчек:

<Directory /home/>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
        #ErrorDocument 403 /var/www/html/403.html
</Directory>

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

# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
#<Directory />
#       Options FollowSymLinks
#       AllowOverride None
#       Require all denied
#</Directory>

#<Directory /usr/share>
#       AllowOverride None
#       Require all granted
#</Directory>

#<Directory /var/www/>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#</Directory>

#<Directory /srv/>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#</Directory>

<Directory /home/>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
        #ErrorDocument 403 /var/www/html/403.html
</Directory>

После чего снова перезагружаем Apache:

sudo service apache2 restart

Дабы однажды не столкнуться с ошибкой вроде:

Ошибка /var/www/site/public_html/.htaccess: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration 

Нужно включить rewrite модуль Apache

sudo a2enmod rewrite

После чего нужно снова перезагрузить сервер Apache:

sudo service apache2 restart 

После этого нам желательно настроить наш первый тестовый сайт и проверить его работоспособность.

Пункт 1.5.0 (Создание нового сайта)

Пункт 1.6.0 (Установка и настройка phpMyAdmin)

Всю эту процедуру можно прочесть по этой ссылке