Некоторые аспекты управления VDS-сервером под Linux
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.
Примечание. Если пользователь не имеет рутовых прав, то для выполнения каждой команды он должен получить рутовые привилегии с помощью команды 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-администрирования.