VDS (Virtual Dedicated Server) — услуга, в рамках которой пользователь получает виртуальный выделенный сервер с максимальными привилегиями. Это эмуляция реального физического сервера, у него есть рутовый доступ, возможность установки произвольных операционных систем и любого софта. При этом он обходится значительно дешевле аренды сопоставимого по мощности физического сервера.

На сервер можно поставить ОС со своего образа или воспользоваться готовым образом в панели управления.



Предположим, мы поставили Debian 10 и веб-сервер Nginx, который идёт в стандартном репозитории (apt install nginx). Давайте посмотрим, какие полезные утилиты и команды помогут в управлении сервером под Linux. Рассмотрим и отдельно Nginx, и сам VDS-сервер в целом.

Содержание



Для начала желательно разобраться с самим веб-сервером. Nginx запускается по окончании установки. Проверяем этот факт:

systemctl status nginx

Выдача:

● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-08-17 08:52:54 UTC; 4min 23s ago
Docs: man:nginx(8)
Main PID: 3942 (nginx)
Tasks: 3 (limit: 4719)
Memory: 6.1M
CGroup: /system.slice/nginx.service
├─3942 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
├─3943 nginx: worker process
└─3944 nginx: worker process

Или просто вводим IP-адрес сервера в браузере:

http://your_server_ip

Если мы ещё не скопировали на сервер файлы своего сайта, то будет показана стандартная заглавная страница Nginx.



Базовые команды по управлению Nginx


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

Остановка веб-сервера:

sudo systemctl stop nginx

В случае запуска от имени root, команда такая:

systemctl stop nginx

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

systemctl start nginx

Остановка и повторный запуск (перезапуск):

systemctl restart nginx

Если вы просто внесли некие изменения в конфигурацию, Nginx может перегрузиться без потери текущих соединений. Это делается следующей командой:

systemctl reload nginx

По умолчанию, Nginx сконфигурирован на автоматический запуск при загрузке сервера. Такое поведение можно изменить следующей командой:

systemctl disable nginx

Снова включить автозапуск Nginx при загрузке сервера:

systemctl enable nginx

По умолчанию в Nginx сконфигурирован один набор правил server blocks для одного домена. Предполагается, что на вашем сервере размещается только один сайт. По умолчанию он должен располагаться в директории /var/www/html.

Предположим, что вы хотите создать в Nginx несколько наборов правил server blocks для нескольких сайтов или переместить файлы текущего сайта в другую директорию /var/www/your_domain.

Это делается следующими командами.

Сначала создаём нужную директорию на сервере.

mkdir -p /var/www/your_domain/html

Затем назначаем владельца этой директории с помощью переменной $USER, которая должна соответствовать текущему пользователю:

chown -R $USER:$USER /var/www/your_domain/html

Размещаем в указанной директории главную страничку index.html.

Потом нужно создать соответствующий набор правил для Nginx. В любом текстовом редакторе создаём файл /etc/nginx/sites-available/your_domain и копируем туда конфигурацию из файла по умолчанию, только с изменённым адресом и доменом:

server {
listen 80;
listen [::]:80;

root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;

server_name your_domain www.your_domain;

location / {
try_files $uri $uri/ =404;
}
}

В конце концов, активируем эту конфигурацию, прописав симлинк к новому конфигурационному файлу в директории sites-enabled, которую Nginx считывает при загрузке:

ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

После перезагрузки Nginx будет выдавать соответствующую страницу на запросы your_domain и www.your_domain.

Управление сервером


Какие вопросы чаще всего возникают у пользователей при управлении Linux-сервером? Какие инструменты можно порекомендовать даже не очень опытным администраторам?

Установка супервизора


Supervisor — это система клиент/сервер, при помощи которой администратор контролирует процессы на сервере. Инструмент создает процессы в виде подпроцессов от своего имени.

Установка supervisord в Debian или Ubuntu предельно простая:

apt-get install supervisor

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

Новые программы передаются в супервизор через конфигурационные файлы в директории /etc/supervisor/conf.d. Например, для скрипта long.sh конфигурационный файл может выглядеть следующим образом:

[program:long_script]
command=/usr/local/bin/long.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/long.err.log
stdout_logfile=/var/log/long.out.log

Соответственно, скрипт будет автоматически запускаться при каждой загрузке системы и автоматически перезапускаться в случае выхода. Это значение может быть 'false' (не перезапускаться) или 'unexpected' (перезапускаться только в случае выхода с неожиданным кодом ошибки, по умолчанию, с любым кодом, кроме 0 или 2).

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

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

supervisorctl reread

supervisorctl update

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

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

$ supervisorctl
long_script RUNNING pid 12614, uptime 1:49:37
supervisor>

В этом режиме supervisorctl изначально выводит статус и время работы всех программ под управлением супервизора, а потом свю командную строку. Там можно ввести help — и увидеть список доступных команд:

supervisor> help

default commands (type help ):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version

Как видим, можно запускать, останавливать и перезапускать программы из командной строки с помощью команд start, stop и restart.

Выход из супервизорпа осуществляется по Ctrl-C или командой quit:

supervisor> quit

Анализ свободного места на диске


Стандартная утилита для просмотра информации о смонтированных разделах — это df. Она выводит список подключенных устройств и информацию о занятом месте.

df опции устройство

Параметр -h активирует режим читаемого человеком вывода (то есть в мегабайтах или гигабайтах):

$ df -h
Файловая система Размер Использовано Дост Использовано% Cмонтировано в
devtmpfs 925M 0 925M 0% /dev
tmpfs 936M 56K 936M 1% /dev/shm
tmpfs 936M 1,9M 934M 1% /run
tmpfs 936M 0 936M 0% /sys/fs/cgroup
/dev/sda3 15G 11G 4,2G 71% /
tmpfs 936M 192K 936M 1% /tmp
/dev/sdb4 133G 126G 974M 100% /home
tmpfs 188M 20K 188M 1% /run/user/42
tmpfs 188M 7,1M 181M 4% /run/user/1000

Информация о конкретной директории (например, /home):

df -h /home

Информация о разделах с заданной файловой системой:

df -h -t ext4

Поиск файлов командой find


Поиск по названию файла:

find -name "query"

Поиск по названию без учёта регистра:

find -iname "query"

«Обратный» поиск файлов, которые не соответствуют указанному шаблону:

find -not -name "query_to_avoid"

или

find \! -name "query_to_avoid"

Поиск по типу файла

find -type дескриптор_типа запрос

Некоторые из распространённых дескрипторов::

  • f — обычный файл
  • d — директория
  • l — символическая ссылка
  • c — файлы устройств посимвольного ввода-вывода
  • b — файлы устройств блочного ввода-вывода

Например, следующая команда выведет все устройства посимвольного ввода-вывода, установленные в системе:

find / -type c
/dev/parport0
/dev/snd/seq
/dev/snd/timer
/dev/autofs
/dev/cpu/microcode
/dev/vcsa7
/dev/vcs7
/dev/vcsa6
/dev/vcs6
/dev/vcsa5
/dev/vcs5
/dev/vcsa4
. . .

Есть фильтр по размеру и времени доступа/изменения. Например, вот команда для поиска всех файлов менее 50 байт:

find / -size -50c

Поиск всех файлов более 700 мегабайт:

find / -size +700M

Для поиска по времени доступа, модификации или изменения метаинформации файла используются параметры '-atime', '-mtime' и '-ctime' с символами плюса и минуса для указания диапазона больше и меньше указанного, соответственно.

Поиск файлов, которые были модифицированы менее суток назад:

find / -mtime -1

Файлы с временем доступа более трёх суток назад:

find / -atime +3

Файлы, которые изменялись за последнюю минуту:

find / -mmin -1

Файлы, которые новее указанного файла:

find / -newer myfile

Доступен поиск по владельцу ('-user', '-group') и по файлам с конкретными разрешениями ('-perm'). На всех найденных файлах можно сразу провести какое-нибудь действие ('-exec').

Тестирование TCP и UDP-соединений


В комплекте Linux идёт большое количество полезных утилит. Некоторые системные администраторы способны выполнять большинство задач, пользуясь только встроенным инструментарием, без установки дополнительных программ. Настоящий швейцарский нож среди встроенных инструментов Linux — сетевая утилита netcat. Общий синтаксис:

netcat [options] host port

Эта команда инициирует TCP-соединение на заданный хост по указанному порту. Если вместо TCP нужно протестировать UDP-соединение, то указываем опцию -u:

netcat -u host port

Диапазон портов:

netcat host startport-endport

В большинстве систем можно писать как netcat, так и nc.

Сканирование портов


Одно из типичных применений netcat — сканирование портов, опция -z означает сканирование вместо установления соединения. Используем её вместе с опцией -v для выдачи более детальной информации при сканировании портов с 1 до 1000:

netcat -z -v domain.com 1-1000

Выдача будет выглядеть примерно так:

nc: connect to domain.com port 1 (tcp) failed: Connection refused
nc: connect to domain.com port 2 (tcp) failed: Connection refused
nc: connect to domain.com port 3 (tcp) failed: Connection refused
nc: connect to domain.com port 4 (tcp) failed: Connection refused
nc: connect to domain.com port 5 (tcp) failed: Connection refused
nc: connect to domain.com port 6 (tcp) failed: Connection refused
nc: connect to domain.com port 7 (tcp) failed: Connection refused
. . .
Connection to domain.com 22 port [tcp/ssh] succeeded!
. . .

Впрочем, для этой задачи имеется более продвинутая, специализированная программа nmap. Устанавливаем её:

apt-get update
apt-get install nmap

Эта утилита выдаёт более подробную информацию о портах. Реестр известных портов /usr/share/nmap/nmap-services содержит более 20 тысяч строк, в том числе дополнительные поля, такие как средняя частота открытия конкретного порта на серверах в интернете (третья колонка):

. . .
tcpmux 1/tcp 0.001995 # TCP Port Service Multiplexer [rfc-1078]
tcpmux 1/udp 0.001236 # TCP Port Service Multiplexer
compressnet 2/tcp 0.000013 # Management Utility
compressnet 2/udp 0.001845 # Management Utility
compressnet 3/tcp 0.001242 # Compression Process
compressnet 3/udp 0.001532 # Compression Process
unknown 4/tcp 0.000477
rje 5/udp 0.000593 # Remote Job Entry
unknown 6/tcp 0.000502
echo 7/tcp 0.004855
echo 7/udp 0.024679
echo 7/sctp 0.000000
. . .

Не рекомендуется запускать сканирование портов чужого сервера, поскольку администратор системы может принять такие действия за враждебные. Nmap предназначен для исследования своего собственного сервера, а поэкспериментировать можно на специально предназначенном для тестовых целей сервере scanme.nmap.org.

Некоторые команды требует длительного времени для выполнения.

Сканирование операционной системы на хосте:

nmap -O хост

Сканирование диапазона хостов от xxx.xxx.xxx.xxx до yyy.yyy.yyy.yyy:

nmap -PN xxx.xxx.xxx.xxx-yyy.yyy.yyy.yyy

Сканирование сетевого диапазона с поиском доступных сервисов:

nmap -sP диапазон_адресов

Сканирование конкретного порта:

nmap -p номер_порта хост

Сканирование всех открытых портов TCP и UDP:

nmap -n -PN -sT -sU -p- хост

Изучение версий ПО, работающего на хосте:

nmap -PN -p номер_порта хост

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

Пересылка сообщений и файлов


С помощью ключа -l можно поставить на прослушивание конкретный порт на сервере:

netcat -l 5438

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

netcat domain.com 5438

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

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

netcat -l 5438 > полученный_файл

На другом компьютере вместо текстового сообщения подаём на вход оригинальный файл:

netcat domain.com 5438 < оригинальный_файл

Аналогично можно передавать самые разные вещи, например, содержимое директорий, заархивированное на лету в tarball:

tar -czf - * | netcat domain.com 4444

Таким же способом можно на одной стороне создать образ диска (dd), отправить его в указанный порт по созданному TCP-соединению — и принять на другой системе.

Добавление и удаление пользователей


Для добавления, удаления пользователей и выдачи им привилегий sudo нужно для начала подключиться к серверу как root:

ssh root@ip_вашего_сервера

После этого добавляем пользователя:

adduser newuser

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

Для назначения административных привилегий нужно добавить пользователя в группу sudo. Пользователям из этой группы разрешено запускать команду sudo с повышением своих привилегий до административных.

usermod -aG sudo user1

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

sudo команда

Имея такие права, этот пользователь может удалять других пользователей:

sudo deluser --remove-home username

Опция --remove-home удаляет также и домашнюю директорию пользователя.

Сам root имеет право выполнить команду deluser без sudo.

Конечно, здесь далеко не полный список полезных инструментов для управления VDS-сервером. Но эти вопросы часто возникают у начинающих системных администраторов, которые подняли свой первый сервер, поставили ОС и начинают разбираться в мире Linux-администрирования.



Комментарии (8)