Архив автора: admin

Начальная настройка веб сервера на Ubuntu 20.04.4 LTS в 2022 году под множество изолированных сайтов

1.0.1. Проверка и изменение часового пояса сервера




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




date




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




Fri 16 Jun 2022 01:01:01 AM MSK




Мы привыкли к 24 часовому отображению времени и нам его нужно изменить. Для этого вписываем в консоль следующую команду и нажимаем «Enter»:




sudo dpkg-reconfigure tzdata




В выпадающем окне «Geographic area:» выбираем «Europe«.




На следующей странице в «Time zone:» выбираем «Moscow«.




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




Current default time zone: 'Europe/Moscow'
Local time is now:      Fri Jun 16 01:12:12 MSK 2022.
Universal Time is now:  Thu Jun 15 22:12:12 UTC 2022.




Обращаем ваше внимание на то, что встроенный в Ubuntu планировщик заданий «cron«, использующийся для периодического выполнения заданий в определённое время автоматически не подхватывает новый часовой пояс и его надо перезагрузить командой:




sudo service cron restart




1.0.2. Проверка настройки кодировки сервера и установка кириллицы в консоли




Если в консоли нет поддержки UFT-8 и кириллицы, то у нас могут возникнуть некоторые неприятные ситуации. Заранее избежать их мы можем, если установим, правильно настроим и сконфигурируем локаль используя команду:




sudo apt install locales




После этого производим следующую настройку:




sudo dpkg-reconfigure locales




Выбираем желаемые локализации в окне «Locales to be generated:«




«en_US.UTF-8 UTF-8» является предпочтительным выбором в большинстве случаев, но вы можете добавить «ru_RU.UTF-8 UTF-8«




В следующем окне «Default locale for the system environment:» предпочтительно выбирать «en_US.UTF-8«




1.0.3. Производим замену названия сервера/hostname




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




Изменение hostname влияет в основном на восприятие и на наш взгляд правильно каждый сервер называть своим понятным и читаемым именем, а не тем, что вам рандомно генерирует хостер, например мы можем заменить «vps-server-548739» на понятное для вас имя «companyname-ru-msk-WEBServer-01».




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




echo 'companyname-ru-msk-WEBServer-01 ' > /etc/hostname




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




sudo reboot





1.0.4 Обновляем UBUNTU




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




sudo apt update && sudo apt dist-upgrade




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




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




1.0.5. Настройка ssh




1.0.5.1. Меняем порт ssh сервера на произвольный




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




Изменение порта не делает ваш сервер безопасным или защищеннее, но позволяет отсеять некоторое количество ботов, автоматически сканирующих ssh на 22 порту.




Используя следующую команду меняем порт на понравившийся вам, желательно не использовать порты из первой тысячи (1-999) и порты используемые другими приложениями (список основных используемых портов можно посмотреть в википедии), если эти приложения когда-либо могут оказаться установленными на ваш сервер:




sudo nano /etc/ssh/sshd_config




В редакторе находим строку со следующим содержимым:




#Port 22




С большой вероятностью эта строка будет закомментирована знаком решетки (#), т.к. используются значения по умолчанию, т.е. порт 22.




Нам же нужно раскомментировать эту строку (удалить знак «#») и заменить порт на желаемый, например на 62222 (любой на ваш выбор).




Port 62222




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




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




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




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




1.0.5.1.2. Устанавливаем netstat 




Устанавливаем netstat и проверяем корректность сделанных изменений: 




sudo apt install net-tools




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




netstat -tulpan | grep ssh




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




tcp   0   0 0.0.0.0:62222   0.0.0.0:*   LISTEN   1150/sshd: /usr/sbi




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




1.0.5.2. Отключаем 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.5.3. Включаем проверку прав на директорию подключения StrictModes




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




Во избежание этого момента вносим следующие правки в файл




sudo nano /etc/ssh/sshd_config




Находим и изменяем (раскомментируем):




StrictModes  yes




Для применения изменений перезагружаем ssh:




sudo service ssh restart




1.0.5.4. Добавление нового системного пользователя UBUNTU 20.04 LTS




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




adduser your_user_name 




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




Пример хорошего пароля: 0$j%lQM1ArBS




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




nano /etc/sudoers




Добавляем следующую строку в самом конце:




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




например:




your_user_name ALL=(ALL) ALL




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




su




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




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




1.0.5.5. Отключаем доступ у root пользователя PermitRootLogin (дополняется)




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




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




sudo nano /etc/ssh/sshd_config




Находим и изменяем:




PermitRootLogin no




Для применения изменений перезагружаем ssh:




sudo service ssh restart




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




На запрос пароля sudo надо отвечать СВОИМ паролем. На su — паролем рута.
PermitRootLogin no означает, что нельзя зайти root пользователем по 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.0.6. Устанавливаем htop




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




sudo apt install htop




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




htop




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




Более детальную информацию по использованию утилиты htop можно найти на этой странице




1.0.7. Устанавливаем Midnight Commander




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




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




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




Команда инсталляции:




sudo apt install mc




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




mc
или
sudo mc




Для выхода из mc (Midnight Commander) нажимаем клавишу F10




1.0.7. Устанавливаем и настраиваем ProFTPD (FTP-сервер на UBUNTU 20.04 LTS)




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




Установка производится командой:




sudo apt install proftpd




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




sudo nano /etc/proftpd/proftpd.conf




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




UseIPv6 off




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




ServerName "FTPServerOK"




Рекомендуем вам изменить стандартный ftp порт, например на 48921:




Port 48921




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




DefaultRoot ~




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




AllowOverwrite on




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




Пользователь root не должен иметь возможности попасть на ftp сервер, это реализуется добавлением следующей строки:




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




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




Добавление пользователей proftpd ftp сервера




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




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.0.8. Устанавливаем и настраиваем file2ban на UBUNTU 20.04 LTS




Принцип работы 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 Fri 2022-06-22 22:22:22 MSK; 29s ago
       Docs: man:fail2ban(1)
   Main PID: 2222 (f2b/server)
      Tasks: 5 (limit: 38328)
     Memory: 13.8M
     CGroup: /system.slice/fail2ban.service
             └─2222 /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 ssh:




fail2ban-client set sshd addignoreip 8.8.4.4




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




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.0.9. Настройка приветствия консоли, устанавливаем landscape-common UBUNTU 20.04 LTS




Установка производится командой:




sudo apt install landscape-common




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




sudo reboot




1.1.0. Установка и настройка nginx на UBUNTU 20.04 LTS




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




sudo apt install nginx




Её мы использовать не будем, т.к. основной репозиторий Ubuntu 20.04 содержит не самую последнюю версию 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




Для UBUNTU 22.04:




echo "deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ jammy nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ jammy 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>




apt-key export 7BD9BF62 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/nginx_key.gpg




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




sudo apt update && sudo apt install nginx




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




nginx -v




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




1.1.1. Конфигурирование nginx на UBUNTU 20.04 LTS для мультисайтинга




Переименовываем старый файл настроек 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.0. Установка и настройка MySQL/MariaDB на UBUNTU 20.04 LTS




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




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




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




sudo apt update




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




[ранее] Установка mysql-server:




sudo apt install mysql-server




[предпочтительный вариант] Установка mariadb-server:




sudo apt install mariadb-server




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




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




sudo mysql_secure_installation 




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




NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):




Можно смело нажимать «Enter», т.к. пароль у вас ещё не установлен.




После чего вы увидите предложение установить пароль для root пользователя:




OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n]




Выбираем «Y«, придумываем сложный пароль и вписываем его два раза.




После чего вы получите следующее сообщение:




By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]




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




Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]




Соглашаемся с тем, что root пользователь может подключаться с localhost, выбираем «Y«.




Удаляем тестовую базу данных «Y«:




By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]




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




Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]




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




Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!




Подробности настройки 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 на UBUNTU 20.04 LTS




Модуль 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 20.04 LTS:




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 20.04 LTS и можно дальше настраивать сервер.




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




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




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




1.4.0. Установка и настройка php 8.1.x на UBUNTU 20.04 LTS




В случае ошибки «add-apt-repository: command not found» добавления смотрим подсказку ниже.




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




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




1.4.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 8.1.7, используя следующую команду:




php 7.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 




php 8.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-zip php-pear php8.0-memcache libapache2-mod-php8.0 php8.0-bcmath php8.0-xmlrpc




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




php 8.1.7:




sudo apt-get install php8.1 libapache2-mod-php8.1 php8.1-mysql php8.1-curl php8.1-gd php8.1-imagick php8.1-snmp php8.1-imap php8.1-zip php-pear php8.1-memcache libapache2-mod-php8.1 php8.1-bcmath php8.1-xmlrpc




На появившиеся в процессе установки вопросы отвечаем «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.x (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







PHP 8.1.x (cli) (built: Jun 10 2022 12:22:48) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.7, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.7, 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




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




2.0.0. Создание нового сайта на UBUNTU 20.04 LTS




2.1.0. Установка и настройка phpMyAdmin на UBUNTU 20.04 LTS




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



2022-06-24T18:33:01
Настройка web сервера

Как в UBUTNU 20.04 LTS узнать количество пакетов, требующих обновления?

Кто-то использует update-notifier, занимающий 500 мб и выводящий результаты каждый раз при авторизации по ssh, а мы рекомендуем не устанавливать лишний софт и использовать следующую команду:




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




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




0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.




Если обновлять что-либо нужно, то код будет похож на нижеследующий:




111 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.




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



2022-06-24T04:09:15
Настройка web сервера

Утилита htop, установка и примеры использования в Ubuntu 20.04 LTS и других версиях в 2022 году

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




Установка производится из стандартного репозитория командой:




sudo apt install htop




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




htop




Для выхода используем клавишу F10 или комбинацию клавиш CTRL+C




Столбцы в утилите HTOP:




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 — время работы системы.




Управление HTOP




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



2022-06-24T03:00:29
Настройка web сервера

Ускоряем MySQL/MariaDB используя RAM-диск на UBUNTU 20.04 LTS SERVER в 2022 году

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




Сначала сделайте резервную копию всех баз данных.




Скопируем его в /var/lib/mysql.bak:




sudo cp -pRL /var/lib/mysql /var/lib/mysql.bak




Создайте каталог для RAM-диска.




sudo mkdir /ramdisk




Заранее уточните размер папки с базами данных MySQL/MqriaDB командой:




 du -hs /var/lib/mysql/




Исходя из полученного размера и учитывая дальнейший рост базы нужно установить соответствующий размер RAM-диска (виртуального диска в оперативной памяти). Я назначил рамдиску размер 4ГБ.




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




Монтируем соответствующий раздел командой:




sudo mount -t tmpfs -o size=4G tmpfs /ramdisk/




Останавливаем MySQL/MariaDB командой:




sudo service mysql stop
или
sudo /etc/init.d/mysql stop




Перемещаем файлы баз данных MySQL/MariaDB в раздел RAM-диска.




sudo mv /var/lib/mysql /ramdisk/mysql




Создаём символическую ссылку на RAM-диск.




sudo ln -s /ramdisk/mysql /var/lib/mysql




Изменяем права папки на MySQL, чтобы разрешить доступ.




sudo chown mysql:mysql /ramdisk/mysql




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




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




Восстановление баз данных




Т.к. базы данных сохраняются на RAM-диске, они будут удаляться каждый раз при выключении компьютера.




Вот шаги для его восстановления.




Удалите ранее созданную символическую ссылку на mysql ramdisk.




sudo rm -rf /var/lib/mysql




Скопируйте и восстановите базы данных из резервной копии.




sudo cp -pRL /var/lib/mysql.bak /var/lib/mysql




Скрипты для удобства




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




Скрипт восстановления базы данных




#!/bin/bash

# Script for restoring backed up database that was moved to the RAM Disk.

if [ $(uname) = "Linux" ]; then

# Delete detached symlink

[ -L /var/lib/mysql ] && sudo rm -rf /var/lib/mysql

# Restore backups

[ -d /var/lib/mysql.bak ] && sudo cp -pRL /var/lib/mysql.bak /var/lib/mysql

else

echo "Unsupported platform."

fi




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




#!/bin/bash

# Create ramdisk if it doesn't exist.

[ ! -d /ramdisk ] && sudo mkdir /ramdisk

# Mount ramdisk has been created.

[ -d /ramdisk ] && sudo mount -t tmpfs -o size=4G tmpfs /ramdisk/

if [ -d /var/lib/mysql ]; then

# Move the mysql databases to the ramdisk if it exists

sudo mv /var/lib/mysql /ramdisk/mysql

# Create a symbolic link.

sudo ln -s /ramdisk/mysql /var/lib/mysql

# Change ownership to mysql.

[ -d /ramdisk/mysql ] && sudo chown mysql:mysql /ramdisk/mysql

else

echo "No MySQL directory at /var/lib."

fi;

# Restart mysql.

sudo /etc/init.d/mysql restart




Это то, что я выполняю каждый раз, когда перезагружаю сервер.




# Restore the data first.

./mysql-ramdisk-restore.sh

# then move it to the RAM.

./mysql-ramdisk.sh




Обязательно убедитесь, что вы создали резервную копию своих баз данных в /var/lib/mysql.bak перед выполнением этих команд.



2022-06-23T00:29:07
Веб-разработка

Хостинг/VPS/VDS/выделенный сервер на NVMe и SATA SSD: в чем разница?

В поисках идеального решения для ваших веб-проектов или приложений вы столкнетесь с множеством вариантов VPS-хостинга. И независимо от того, являетесь ли вы владельцем магазина электронной коммерции (интернет-магазина), дизайнером сайтов или экспертом-блоггером, производительность вашего проекта в решающей степени зависит от технологии хранения данных, которую использует ваш хостинг-сервер.




Тип хранилища, используемый вашим VPS/VDS/выделенным сервером или хостинг-провайдером, оказывает наибольшее влияние на воспринимаемую пользователем скорость и отзывчивость. Именно по этой причине технологии хранения данных быстро развиваются, чтобы поддерживать надежный, мощный и более быстрый веб-хостинг. Сегодня мы рассмотрим разницу между NVMe и SATA SSD. Оба они являются твердотельными, однако различия между ними могут дать вам существенно разные результаты.




Что такое технология NVMe?




NVMe расшифровывается как Non-Volatile Memory express. Это новый инновационный интерфейс связи, который устраняет ограничения, налагаемые предыдущими технологиями хранения данных. Протокол NVMe предназначен для беспрепятственного использования высокоскоростных носителей информации. Он также является твердотельным, как и SSD с интерфейсом SATA (Serial ATA), однако скорость и производительность ничем не отличаются.




Если говорить в общем, NVM (энергонезависимая память) — это память, которая может сохранять данные даже при отключении питания системы. С другой стороны, энергозависимая память теряет сохраненные данные при отсутствии питания. SSD, вращающиеся диски и другие дисковые накопители — все это примеры энергонезависимой памяти. Учитывая это, технология NVMe использует энергонезависимую память для сохранения данных даже при отключении питания.




NVMe также использует более новый интерфейс для связи с процессором и операционной системой — PCI express, или PCIe. Это гораздо более быстрый интерфейс, чем SATA или SAS. Этот новый интерфейс может напрямую взаимодействовать с центральным процессором, обеспечивая гораздо более высокую пропускную способность (и, следовательно, большую скорость), а также меньшее время отклика.




Что такое SSD (твердотельный накопитель)?




SSD (Solid State Drives) — это оборудование, использующее технологию твердотельного хранения данных с помощью флэш-памяти. Существует несколько типов флэш-памяти, однако наиболее распространенной является NAND-память.




Мы знаем, что твердотельные накопители обеспечивают значительно более высокую скорость чтения/записи по сравнению с традиционными жесткими дисками (HDD). Однако SSD также имеют некоторые ограничения, когда речь идет о максимальной скорости для протоколов хранения данных.




Твердотельные накопители обычно работают с интерфейсами SATA и SAS, которые препятствуют повышению производительности более быстрых дисков. Изначально интерфейс SATA был разработан для жестких дисков и широко использовался в ранних SSD для лучшей поддержки обратной совместимости. Но со временем интерфейс SATA стал ограничивать возможности твердотельных накопителей.




Чтобы решить эту проблему, разработчики создали протокол NVMe, который опирается на интерфейс PCI Express (PCIe). Этот интерфейс позволяет NVMe обеспечивать более высокую скорость, лучшую производительность и повышенную надежность. Все эти накопители объединены под одним названием «SSD», поскольку для хранения данных в них используется твердотельная память.




Изначально накопители NVMe предлагались в виде карт расширения с интерфейсами PCI 2.0 или PCIe 3.0. Они должны были подключаться к разъему PCIe материнской платы сервера. Позже были разработаны 2,5-дюймовые NVMe-накопители, которые подключались к материнской плате через разъем U.2 или U.3.




NVMe против SSD: В чем разница?




Как и NVMe, SSD также является разновидностью энергонезависимой памяти и считывает/записывает данные только с помощью электронных схем.




Итак, если и SSD, и NVMe являются твердотельными устройствами хранения данных, в чем между ними разница?




Как уже упоминалось выше, разница заключается в букве «e» в NVMe, которая означает Express. Express — это новый протокол, специально разработанный для усиления внутреннего параллелизма и низкой задержки твердотельных накопителей. Это означает, что система хранения NVMe подключает накопитель к материнской плате сервера с помощью более быстрого и нового интерфейса, используя прямые дорожки PCIe процессора.




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




Поэтому, когда вы говорите SSD-хостинг, это означает, что твердотельные накопители подключены к серверу через более медленные интерфейсы SATA или SAT.




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




Преимущества технологии NVMe:




Больше операций ввода-вывода




Благодаря шине PCI express диски NVMe способны обеспечить больше IOPs (операций ввода/вывода), чем интерфейс ATA, использовавшийся в дисках ранних поколений. Интерфейсы SATA обеспечивали пропускную способность 6 Гбит/с, тогда как более поздние интерфейсы SAS-3 с последовательным подключением были рассчитаны на пропускную способность 12 Гбит/с.




Технология NVMe превосходит SATA и SAS по пропускной способности, поскольку ее интерфейс PCIe обеспечивает теоретический максимум пропускной способности 32 Гбит/с (или огромные 256 Гбит/с) с новейшим интерфейсом PCIe 4.0. В настоящее время ни один твердотельный накопитель не обеспечивает пропускную способность этого интерфейса (или даже половины ее), но это перспективный интерфейс, у которого есть пространство для роста.




Хороший SSD-накопитель, подключенный к быстрому интерфейсу SAS или SATA, может обеспечить скорость чтения/записи данных около 550 МБ/с. Кроме того, этот же SSD может обрабатывать до 10 000 операций ввода-вывода в секунду.




В то время, как хороший NVMe может считывать/записывать от 3000 до 3200 МБ/с данных и обрабатывать до 640 000 IOPs.




Одним словом, NVMe обеспечивает до 60 раз лучшую производительность IOPs и примерно в 6 раз более высокую скорость передачи данных.




Высокая глубина очереди команд




Накопители NVMe используют различные процессы постановки в очередь, в то время как твердотельные накопители SATA могут обрабатывать только одну команду за раз с глубиной очереди 32 команды.




Интерфейс SAS обеспечивает глубину очереди в 254 команды. Но самым невероятным фактом является то, что новая технология NVMe может обрабатывать 64 000 очередей и допускать 64 000 записей в каждой очереди.




Чем больше глубина очереди, тем больше запросов на чтение/запись может быть поставлено в очередь на выполнение, что позволяет повысить скорость отклика системы.




Масштабируемая технология




Поскольку технология NVMe опирается на дорожки PCIe, а не на интерфейс контроллера, она является масштабируемой. На данный момент твердотельные накопители NVMe используют 4 дорожки, но потенциально они могут использовать все 16 дорожек PCIe, что является перспективным решением.




Более экологичная технология




По сравнению с традиционными технологиями, NVMe намного экологичнее, поскольку она способна использовать режим пониженного энергопотребления для значительного снижения энергопотребления. Этот режим ожидания может снизить энергопотребление до 97%, когда система простаивает.




Безопасность в соответствии с отраслевыми стандартами




Набор команд технологии NVMe разработан для поддержки всех команд контейнера безопасности, присутствующих в интерфейсах ACS, SAS и ATA. Именно поэтому NVMe исключительно совместима с отраслевыми стандартами безопасности.




Сокращение узких мест на серверах




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




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




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




Что такое NVMe VPS хостинг?




VPS (сокращение от Virtual Private Server) — это виртуальная среда, работающая на физическом сервере. Она предоставляется хостинг-провайдером в качестве услуги. На физическом сервере может одновременно работать несколько VPS, каждый из которых имеет свои собственные выделенные ресурсы. VPS позволяет пользователям выбирать ОС и другие параметры конфигурации, поэтому его легко развернуть и управлять им.




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




NVMe VPS хостинг- это просто виртуальный выделенный сервер, который работает на физическом сервере, использующем твердотельные накопители NVMe. Эти накопители используют интерфейс PCIe, который разработан для обеспечения исключительной скорости передачи данных и лучшей общей производительности. Серверы NVMe умело используют низкую задержку и твердотельную природу твердотельных накопителей. В целом, NVMe VPS будет работать намного лучше, чем типичный SATA SSD VPS — другие ресурсы, такие как процессор, обычно не являются узким местом для производительности и отзывчивости посетителей.




Итоги




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




Хостинг NVMe — это идеальное решение для компаний с высокопроизводительными приложениями, веб-сервисами или веб-сайтами, которым требуется максимальная скорость.



2022-06-23T00:01:13
wordpress

Какой язык программирования выбрать новичку?

Итак, вы поставили цель – стать программистом. С чего начать?

Для того, чтобы начать писать код, нужно владеть хотя бы одним языком программирования. Вот тут и начинается ступор. Как правильно выбрать первый язык программирования, куда податься? Об этом сегодня и поговорим.

 

А так ли важно?

Любой IT-специалист вам скажет, что язык – всего лишь инструмент, и будет абсолютно прав. Все ЯП хоть и отличаются, но в деталях, используя при этом одни и те же понятия: переменная, функция, класс. Более того, подавляющее большинство востребованных языков поддерживают одни и те же методологии: структурное программирование, объектно-ориентированное программирование.

Из этого следует два вывода. Во-первых, общий подход к написанию программ не изменится, если вы предпочтёте, например, Python, чем C++. Во-вторых, после изучения одного конкретного языка перейти к разработке на другом не станет проблемой.

Проведём аналогии. И на английском, и на русском языке вы можете узнать у прохожих дорогу до ближайшей станции метро. В обоих случаях вы используете местоимение, вопросительное слово, сказуемое и зависимые части. С языками программирования точно также.

Но проблемы реального мира в IT не работают. Например, на английском языке и русском языке практически нет одинаковых слов, тогда как в программировании используются одни и те же обороты: for, while, class, public. В Англии вас могут не понять, если вы заговорите на русском. А вот если вы написали программу на C++, то Python-разработчик в общем виде поймёт, что вы имели в виду. Да, синтаксис отличается, какие-то функции непонятны, но идея написанного будет ясна.

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

 

На что обратить внимание?

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

 

Наличие справочного материала в большом количестве

Сюда относятся как видео с YouTube, так и учебники, написанные профессиональными разработчиками и ответы со stackoverflow. Это – важнейший критерий выбора.

Представьте, вы видите незнакомую ошибку или новую функцию. Для выяснения обстоятельств вам придётся обращаться в интернет за помощью. С гораздо большей вероятностью вы найдёте ответ, если язык популярен.

Поддержка основных методологий разработки: структурное программирование и ООП

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

 

Кросс-платформенность

Почему это важно? Во-первых, это позволит вам запускать код с разных устройств: как с ноутбука дома, так и с телефона в пробке. Как раз освободите больше свободного времени для работы. Во-вторых, это позволяет не останавливаться на конкретных решениях. Откуда вы знаете, что вам больше понравится: разработка веб-сайтов или мобильных приложений? Напрямую это к кросс-платформенности не относится, но как правило языки, разработанные только под конкретное устройство, не дадут свободы выбора направления разработки. Сейчас многие языки предоставляют возможность запускать программу с любого устройства, но учесть это всё же надо.

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

 

Python

Язык программирования Python был создан в 1991 году. В 2021 он стал самым популярным в мире. В чём причина успеха?

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

Во-вторых, язык обладает малым порогом вхождения. Вам не нужно учитывать множество деталей при разработке программ, как в Си. Язык поддерживает ООП, поэтому приложение может иметь любую архитектуру.

Но Python – не панацея. Чем больше вы его изучаете, тем больше вы удивляетесь его сложности организации. В плане производительности и работы с памятью питон проигрывает многим другим языкам.

Выбор Python позволит максимально быстро понять, как устроено программирование, и увидеть первые результаты. Но впоследствии придётся изучать низкоуровневые нюансы, которых вы не замечаете, когда используете питон.

 

Cи

Язык Си, несмотря на 50-летний возраст, остаётся мощным инструментом. Операционная система Linux до сих пор пишется на этом языке.

Да, Си сложнее, чем Python. Но зато он позволяет досконально изучить структурное программирование, работу с системными ресурсами, такие вещи, как указатели. Фактически, это – фундамент многих современных технологий.

Си приучит вас писать красивый, грамотный код. Си существенно расширит ваш кругозор в IT-сфере.

Казалось бы, в Си нет ООП, почему он сюда включён? Здесь есть несколько причин. Дело в том, что объектно-ориентированный подход исправил проблемы структурного программирования, которые вы обязательно заметите, программируя на Си. Например, попробуйте написать приложение, затем добавьте одну новую функциональность, а потом замерьте время, которое вы потратили на модификацию проекта. Оно в лучшем случае будет такое же, сколько вы

потратили на написание базовой программы. Это всё нужно прочувствовать, чтобы понимать, почему сейчас в актуальной разработке используются те или иные решения.

Но при этом Си позволяет пусть и криво-косо, но реализовать все базовые принципы ООП: инкапсуляцию (которая, к слову, в С реализована идеально), полиморфизм и наследование.

Однако самое главное – существует С++. Многие программы на Си будут работать и на С++, но С++ предусматривает в свой механике объектно-ориентированное программирование. Поэтому, по сути, изучив структурный подход, вы просто перейдёте к С++, ничего не потеряв, и более досконально зная, как устроен язык изнутри.

Этот вариант более сложный, но зато – очень эффективный.



2022-06-22T19:26:08
Программирование