Некоторые аспекты управления 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.



    Базовые команды по управлению 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-администрирования.



    VDSina.ru — хостинг серверов
    Серверы в Москве и Амстердаме

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

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

      Но вы же несколько абзацев назад уже показали systemd, зачем ставить одновременно две системы контроля процессов?

        –1
        Supervisor — простой способ запустить приложение как демон.
          0

          systemd-run делает это элементарно.

            0
            Да и сами юнит-файлы не сильно сложны для написания…
        0
        Спасибо за подробное объяснение
          0
          chown -R $USER:$USER /var/www/your_domain/html


          А цель то этого какая? Потенциально вы решаете проблему с доступом себя-любимого в этот каталог, но создаете проблему с доступом nginx, ведь он то запущен под другим пользователем обычно.
          Передавать данные через nc тоже так себе идея. Мало ли кто и чего по пути добавит. Лучше уж sftp(для любителей из под винды winscp).
          опция -z означает сканирование вместо установления соединения

          Создает он соединение, просто никаких данных не посылает и тут же отключается, но сервер факт подключения увидит. Про опцию -w тогда уж добавьте, а то будет кто-то ждать таймаут на установку соединения, особенно когда пакеты дропаются. Он в linux несколько минут может быть. А лучше про замечательную команду man расскажите.
          Группы sudo может и не быть. И сам sudo обычно установить нужно еще, он в базовую систему не входит.
          Про ssh и дефолтный запрет логина пользователя root по паролю(хороший такой шанс для новичка отстрелить себе ногу, когда хостер по дефолту root разрешает, а после обновления ssh включает дефолтный конфиг и запрещает root).

            0
            nginx -t — тестирование конфигурации
            nginx -s reload — перечитывание конфигурации без рестарта сервиса nginx
              0
              Странный конечно подход, помимо andreymal, добавлю что настройка сервера начинается не с nginx. Первым делом после развертывания VPS из образа следует посмотреть открытые порты. Никогда не знаешь что хостер «запилил» в образ. Один из американских хостеров в образы Ubuntu добавлял Apache. Мой сценарий начальной проверки Ubuntu и настройки выглядит так:
              1) Проверка открытых портов netstat, lsof
              netstat -ntlp | grep LISTEN
              Утилита lsof умеет отображать процессы, которые работают с определенным файлом или сокетом.
              lsof -i | grep LISTEN
              lsof -nP -i | grep LISTEN
              lsof -i :80
              2) Подсчет размера каждой папки — ncdu.
              Иногда бывает трудно найти какие файлы больше всего занимают места на диске. Запущенная без параметров утилита выводит информацию о текущей папке, но так как нас интересует вся файловая система, то в качестве параметра укажем корневую директорию:
              «ncdu /». После непродолжительных вычислений утилита выведет иерархический список директорий, начиная с самого большого размера.
              3) Процессы потребляющие наибольшее кол-во памяти
              watch «ps -eo pid,ppid,cmd,%mem --sort=-%mem | head»
              4) Если кто то брутфорсит доступ по SSH, вот рецепт посмотреть неудачные попытки входа
              cat /var/log/auth.log* | grep 'Failed password' | grep sshd | awk '{print $1,$2}' | sort -k 1,1M -k 2n | uniq -c
              5) Добавление двухфакторной аутентификации на SSH
              6) И забыли про Task Manager — htop, и файловый менеджер — mc.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое