Справочник сисадмина

Настройка серверов на Ubuntu

Сервер отличается от рабочей станции: он работает 24/7, им управляют удалённо и к нему предъявляют требования по доступности. Здесь — полный чек-лист настройки сервера на базе Ubuntu Server 24.04 LTS «Noble Numbat» (стандартная поддержка до апреля 2029 года, расширенная — до 2036 через Ubuntu Pro). Материал охватывает инфраструктуру, установку, сеть, безопасность, веб, БД, мониторинг, бэкапы, автоматизацию и контейнеры.

Выбор инфраструктуры

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

Физический сервер vs VPS vs облако

ВариантПлюсыМинусыКогда выбирать
Физический (bare metal)Полный контроль, максимальная производительность, данные на своём дискеНужны стойка, охлаждение, ИБП, канал, сам чинишь железоБольшие нагрузки, строгая регуляторика (данные нельзя выносить)
VPS / VDSДёшево, быстро развернуть, root-доступ, починить можно через консоль провайдераСоседи по гипервизору, нет доступа к железу, зависимость от провайдераСтартапы, тесты, небольшие продакшн-сервисы
Публичное облако (AWS/Azure/GCP/Yandex Cloud)Масштабируемость, managed-сервисы, гео-распределение, SLAСложнее, дороже при росте, vendor lock-in, данные у третьей стороныВысокая доступность, микросервисы, глобальные продукты

Провайдеры и регионы

Регион выбирай ближе к пользователям: меньше задержка (RTT). Для РФ-аудитории — регионы в Москве/Санкт-Петербурге. Помни про законодательство (152-ФЗ): персональные данные россиян желательно хранить в РФ. Уточни, есть ли у провайдера резервное копирование, защита от DDoS и SLA на сетевую доступность.

Минимальные ресурсы (ориентир для 24.04 LTS)

СценарийCPURAMДиск
Обучение / тест1 vCPU1 ГБ10–20 ГБ SSD
Веб + БД (небольшой сайт)2 vCPU4 ГБ40 ГБ SSD
Продакшн (Nginx + PostgreSQL + кэш)4 vCPU8–16 ГБ80–120 ГБ SSD (отдельный том под данные)
База данных / тяжёлый сервис8+ vCPU32+ ГБNVMe, отдельный том под /var/lib
Официальный минимум Ubuntu Server 24.04: 1 ГГц CPU, 1 ГБ RAM (рекомендуется 2 ГБ), 2.5 ГБ диска (рекомендуется 25 ГБ). Для реальной работы берите с запасом.

Установка Ubuntu Server 24.04 и cloud-init

Ubuntu Server поставляется как минимальный установщик (subiquity) без графического окружения. Скачивай ubuntu-24.04-live-server-amd64.iso с ubuntu.com. При установке выбери: минимальную инсталляцию (minimal), openssh-server (чтобы сразу зайти по SSH), а не «featured server snaps» лишнего.

Cloud-init (user-data) — автоматизация первого запуска

В облаках и у многих VPS cloud-init применяет конфиг при первом старте. Ты можешь задать пользователя, ключи SSH, хостнейм, пакеты и скрипты через user-data (YAML). Пример:

#cloud-config
hostname: srv-01
users:
  - name: admin
    groups: sudo
    shell: /bin/bash
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
      - ssh-ed25519 AAAA...your_public_key... admin@laptop
package_update: true
package_upgrade: true
packages:
  - curl
  - vim
  - ufw
  - fail2ban
runcmd:
  - timedatectl set-timezone Europe/Moscow
  - ufw allow OpenSSH
  - ufw --force enable
Проверить, что cloud-init отработал: cloud-init status (должно быть status: done). Логи: /var/log/cloud-init.log, cloud-init collect-logs. Чтобы «сбросить» к первичной конфигурации: sudo cloud-init clean затем перезагрузка.

Подготовка перед разворачивания

Первичная настройка после установки

# 1. Обновление пакетов
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y

# 2. Создать пользователя с sudo (НЕ работай под root!)
sudo adduser admin
sudo usermod -aG sudo admin

# 3. Отключить пароль у root (вход только по ключу sudo-юзеря)
sudo passwd -l root          # блокирует учётку root (воскресит: passwd -u root)

# 4. Имя хоста (изменится сразу и персистентно)
sudo hostnamectl set-hostname srv-01
hostnamectl                    # проверить static/chassis/icon

# 5. Часовой пояс и время
sudo timedatectl set-timezone Europe/Moscow
timedatectl status

# 6. NTP — синхронизация времени (systemd-timesyncd включён по умолчанию)
timedatectl timesync-status
# Для строгой точности поставь chrony:
sudo apt install chrony
sudo systemctl enable --now chrony
chronyc tracking
chronyc sources -v

Локали и раскладка

sudo apt install locales
sudo locale-gen ru_RU.UTF-8
sudo update-locale LANG=ru_RU.UTF-8
locale                          # проверка текущих настроек
# Для консоли/клавиатуры:
sudo dpkg-reconfigure keyboard-configuration
Время на всех серверах кластера должно быть синхронизировано (NTP) — иначе сломаются логи, TLS-сертификаты, репликация БД и Kerberos. Проверь, что System clock synchronized: yes в timedatectl status.

Сеть — netplan

В Ubuntu конфигурация сети задаётся через netplan (файлы YAML в /etc/netplan/*.yaml). Рендерер превращает YAML в правила: networkd (systemd-networkd, по умолчанию для сервера) или NetworkManager (для десктопа).

Пример: DHCP

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: true

Пример: статический IP

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      addresses: [192.0.2.10/24]
      routes:
        - to: default
          via: 192.0.2.1
      nameservers:
        addresses: [1.1.1.1, 8.8.8.8]
      dhcp4: no

Пример: bonding (LACP / 802.3ad)

network:
  version: 2
  renderer: networkd
  bonds:
    bond0:
      interfaces: [enp3s0, enp4s0]
      addresses: [192.0.2.10/24]
      routes:
        - to: default
          via: 192.0.2.1
      parameters:
        mode: 802.3ad
        lacp-rate: fast
        mii-monitor-interval: 100
        transmit-hash-policy: layer3+4

Пример: VLAN

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: no
  vlans:
    enp3s0.100:
      id: 100
      link: enp3s0
      addresses: [10.0.100.10/24]

Применение конфигурации

sudo netplan generate        # проверка синтаксиса (ошибки вылезут здесь)
sudo netplan try             # применить с откатом через 120с (спасёт от потери связи!)
sudo netplan apply           # применить немедленно
ip addr show
ip route show
При удалённой настройке сети всегда используй netplan try — он применит конфиг и спросит подтверждение; если связь оборвётся, через 2 минуты вернётся старая настройка. netplan apply не откатывает сам — можно отрезать себя от сервера.

SSH — удалённое управление

SSH (порт 22/TCP) — основной способ попасть на Linux-сервер. С Windows используй встроенный клиент (ssh в терминале/PowerShell) или PuTTY.

Генерация ключей и копирование

# На КЛИЕНТЕ (один раз). ed25519 — современный, короткий и безопасный:
ssh-keygen -t ed25519 -C "admin@laptop"
# Копируем публичный ключ на сервер:
ssh-copy-id admin@192.0.2.10
# Проверка входа без пароля:
ssh admin@192.0.2.10

Жёсткая настройка sshd_config

Файл /etc/ssh/sshd_config (или лучше drop-in /etc/ssh/sshd_config.d/99-hardening.conf):

# /etc/ssh/sshd_config.d/99-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AllowUsers admin deploy
MaxAuthTries 3
LoginGraceTime 20
Port 22
X11Forwarding no
AllowAgentForwarding no
PermitEmptyPasswords no
ClientAliveInterval 300
ClientAliveCountMax 2
sudo sshd -t                # проверить синтаксис ДО перезапуска
sudo systemctl restart ssh  # применить (на Ubuntu служба называется ssh)

Клиентский ~/.ssh/config и мультиплексирование

# ~/.ssh/config (права 600)
Host srv-01
  HostName 192.0.2.10
  User admin
  IdentityFile ~/.ssh/id_ed25519
  Port 22
  ControlMaster auto
  ControlPath ~/.ssh/control-%r@%h:%p
  ControlPersist 10m        # держать соединение открытым 10 минут

Мультиплексирование ускоряет множественные SSH/SCP/rsync-сессии — они переиспользуют одно TCP-соединение.

ssh-agent

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l                  # список добавленных ключей

Туннелирование

ТипКомандаЗачем
Local (-L)ssh -L 8080:localhost:80 admin@srvПробросить локальный порт 8080 на порт 80 сервера (доступ к закрытым сервисам)
Remote (-R)ssh -R 8080:localhost:80 admin@srvОткрыть порт на сервере, ведущий на твой локальный порт (reverse tunnel)
Dynamic (-D)ssh -D 1080 admin@srvSOCKS5-прокси через сервер (анонимный выход/обход)
Для постоянного туннеля добавь в ~/.ssh/config строку RemoteForward 8080 localhost:80 или используй autossh.

Фаервол — UFW и nftables

UFW («Uncomplicated Firewall») — удобный фронтенд к nftables (с 24.04 бэкенд по умолчанию — nftables; iptables теперь обёртка над nftables).

UFW подробно

sudo ufw --force reset                 # сброс к умолчанию (осторожно!)
sudo ufw default deny incoming         # запретить всё входящее
sudo ufw default allow outgoing        # разрешить исходящее
sudo ufw allow OpenSSH                 # профиль приложения (порт 22)
sudo ufw allow 22/tcp                  # или явно порт
sudo ufw limit 22/tcp                  # разрешить с rate-limit (защита от брута)
sudo ufw allow 80,443/tcp
sudo ufw allow 'Nginx Full'            # профиль из /etc/ufw/applications.d
sudo ufw enable                        # ВКЛЮЧИТЬ (после того как разрешил SSH!)
sudo ufw status verbose
sudo ufw status numbered               # с номерами правил
sudo ufw delete <номер>                # удалить правило
sudo ufw logging on                    # логировать отклонённые
sudo ufw app list                      # список профилей
Всегда разреши порт SSH до ufw enable, иначе сам себя заблокируешь и потеряешь доступ (придётся восстанавливать через консоль/VNC провайдера).

nftables базово

sudo nft list ruleset                  # показать текущие правила
# Пример таблицы inet filter:
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input iif "lo" accept
sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input tcp dport { 80, 443 } accept

iptables (legacy/compat)

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -P INPUT DROP
sudo iptables -L -n -v
В 24.04 iptables — это симлинк на iptables-nft (работает поверх nftables). Пиши правила через nftables, если хочешь «по-настоящему».

Systemd — управление службами

В Ubuntu всё управляется через systemd. Юнит-файлы лежат в /etc/systemd/system/ (твои), /lib/systemd/system/ (пакетные), /run/systemd/system/ (сгенерированные).

Типы юнитов

ТипНазначение
.serviceСлужба/демон (nginx, ssh, твой скрипт)
.socketСлушает сокет и запускает сервис по запросу
.timerПланировщик (замена cron для systemd)
.mount / .automountМонтирование ФС
.targetГруппа юнитов (уровень запуска, напр. multi-user.target)
.pathРеакция на изменения в файловой системе

Свой unit-файл (.service)

# /etc/systemd/system/myapp.service
[Unit]
Description=MyApp API service
After=network.target postgresql.service
Wants=network.target

[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=on-failure          # on-failure | always | no | on-abnormal
RestartSec=5
Environment=APP_ENV=production
EnvironmentFile=/etc/myapp/env
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
sudo systemctl status myapp
journalctl -u myapp -f     # логи в реальном времени

Маскирование и drop-ins

sudo systemctl disable myapp        # выключить автозапуск
sudo systemctl stop myapp           # остановить
sudo systemctl mask myapp           # ЗАПРЕТИТЬ запуск вообще (не снимешь просто enable)
sudo systemctl unmask myapp         # снять маску

# Drop-in — безопасное переопределение без правки самого юнита:
sudo systemctl edit nginx           # создаёт /etc/systemd/system/nginx.service.d/override.conf
# Например добавить лимиты:
# [Service]
# MemoryMax=512M
# CPUQuota=50%

Веб-сервер: Nginx vs Apache

NginxApache
МодельEvent-driven, один процесс на ядроПроцессы/потоки на соединение (или event MPM)
ПроизводительностьОчень высокая на статике, низкая памятьХорошая, больше памяти
Роль чащеFront-end / reverse proxy / балансировщикУниверсальный хостинг, .htaccess
Конфиги/etc/nginx/sites-available|enabled/etc/apache2/sites-available|enabled, .htaccess

Virtual host (Nginx)

sudo apt install nginx
sudo systemctl enable --now nginx

# /etc/nginx/sites-available/example.com
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html;

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

    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# Включить сайт:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t                # проверить конфиг
sudo systemctl reload nginx

Reverse proxy и балансировка (upstream)

upstream backend {
    least_conn;              # или round-robin / ip_hash
    server 10.0.0.11:8080 weight=2;
    server 10.0.0.12:8080;
    server 10.0.0.13:8080 backup;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
    }
}

Кэш, сжатие, HTTP/2, заголовки безопасности

server {
    listen 443 ssl;
    http2 on;                         # HTTP/2 (в 24.04 включён по умолчанию для ssl)
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Сжатие
    gzip on;
    gzip_types text/plain text/css application/json application/javascript image/svg+xml;
    gzip_min_length 1024;

    # Кэш ответов бэкенда
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m;
    location / {
        proxy_cache mycache;
        proxy_pass http://backend;
    }

    # Заголовки безопасности
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    add_header Content-Security-Policy "default-src 'self'" always;
}

TLS — Let's Encrypt / certbot

Certbot выпускает бесплатные доверенные сертификаты Let's Encrypt со сроком 90 дней с автообновлением.

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
# Или через webroot/standalone:
sudo certbot certonly --webroot -w /var/www/example.com -d example.com

# Проверить автообновление (cron/timer уже настроен certbot-ом):
sudo certbot renew --dry-run

# Просмотр сертификатов:
sudo certbot certificates
Certbot ставит systemd timer certbot.timer (и/или cron), который дважды в день пытается обновить сертификаты за 30 дней до истечения. Сертификат действителен 90 дней, но обновляется автоматически — главное, чтобы таймер работал.

Базы данных: MySQL/MariaDB и PostgreSQL

MariaDB (дроп-in замена MySQL в Ubuntu)

sudo apt install mariadb-server
sudo systemctl enable --now mariadb
sudo mysql_secure_installation      # убрать анонимных, запретить root-логин удалённо, удалить test-БД
# Харденинг: root через unix_socket (без пароля извне), без remote root
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket;"
sudo mysql -e "DELETE FROM mysql.user WHERE User='';"
sudo mysql -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1');"
sudo mysql -e "DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test';"
sudo mysql -e "FLUSH PRIVILEGES;"

# Бэкап:
mysqldump -u root -p --single-transaction --routines --triggers mydb > mydb.sql
# Восстановление:
mysql -u root -p mydb < mydb.sql

PostgreSQL

sudo apt install postgresql
sudo systemctl enable --now postgresql
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'strong';"
# Создать БД и пользователя:
sudo -u postgres createuser -P appuser
sudo -u postgres createdb -O appuser mydb

# Бэкап:
pg_dump -U appuser -h localhost mydb > mydb.sql
# Восстановление:
psql -U appuser -h localhost mydb < mydb.sql
По умолчанию PostgreSQL слушает только localhost (listen_addresses в postgresql.conf). Не открывай 5432 в интернет — пускай через VPN/SSH-туннель или приватную сеть. Пароли храни в ~/.pgpass с правами 600.

Мониторинг

Логи: journalctl и logrotate

journalctl                          # все логи systemd
journalctl -u nginx -f              # следить за службой
journalctl --since "2026-07-15 00:00" --until "01:00"
journalctl -p err -b                # ошибки с последней загрузки
journalctl --disk-usage
sudo journalctl --vacuum-size=500M  # ограничить размер

# logrotate — ротация лог-файлов (/etc/logrotate.d/)
# Пример /etc/logrotate.d/myapp:
# /var/log/myapp/*.log {
#     daily
#     missingok
#     rotate 14
#     compress
#     delaycompress
#     notifempty
#     create 0640 appuser appuser
#     postrotate
#         systemctl reload myapp >/dev/null 2>&1 || true
#     endscript
# }

Бэкапы

rsync — быстрое копирование с дедупом по изменениям

# Зеркало каталога на удалённый сервер (инкрементально):
rsync -avz --delete -e ssh /var/www/ admin@backup:/srv/backups/www/
# Снимок с датой:
rsync -avz /data/ /backup/data-$(date +%F)/

BorgBackup — дедуплицирующие зашифрованные снимки

sudo apt install borgbackup
borg init --encryption=repokey /backup/repo
borg create /backup/repo::{now:%Y-%m-%d} /home /var/www /etc
borg prune -v /backup/repo --keep-daily=7 --keep-weekly=4 --keep-monthly=6
borg list /backup/repo

restic — простой, кросс-платформенный, в S3/Backblaze

sudo apt install restic
restic -r /backup/repo init
restic -r /backup/repo backup /etc /var/www
restic -r /backup/repo snapshots
restic -r /backup/repo forget --keep-daily 7 --keep-monthly 3

rsnapshot — снимки на основе rsync + hardlinks

sudo apt install rsnapshot
# /etc/rsnapshot.conf (интервалы hourly/daily/weekly/monthly)
# snapshot_root   /backup/snapshots/
# backup  /etc/           localhost/
# backup  /var/www/       localhost/
rsnapshot daily
Правило 3-2-1: 3 копии, 2 разных носителя, 1 вне площадки. Проверяй бэкапы восстановлением (restore test) — непроверенный бэкап не считается.

Автоматизация: Ansible и bash

Ansible — инвентарь и playbook

# inventory.ini
[web]
192.0.2.10  ansible_user=admin
192.0.2.11  ansible_user=admin

[db]
192.0.2.20  ansible_user=admin

# site.yml
- name: Harden web servers
  hosts: web
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: latest
        update_cache: yes
    - name: Allow SSH in UFW
      ufw:
        rule: allow
        port: "22"
        proto: tcp
    - name: Enable UFW
      ufw:
        state: enabled
        policy: deny
pip install ansible            # или apt install ansible-core
ansible all -i inventory.ini -m ping
ansible-playbook -i inventory.ini site.yml

bash-скрипт (пример бэкапа + ротации)

#!/usr/bin/env bash
set -euo pipefail
DEST="/backup/www-$(date +%F)"
mkdir -p "$DEST"
rsync -a --delete /var/www/ "$DEST/"
# хранить последние 7 копий
find /backup -maxdepth 1 -name 'www-*' -mtime +7 -exec rm -rf {} +
echo "Backup done: $DEST" | logger

Контейнеры: Docker

# Установка (официальный скрипт / репозиторий):
sudo apt install docker.io docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker admin        # без sudo для docker (перелогинься)

# Основные команды:
docker ps -a                         # контейнеры
docker images                        # образы
docker run -d -p 8080:80 --name web nginx
docker logs -f web
docker exec -it web bash
docker stop web && docker rm web
docker system prune -a               # очистка
# docker-compose.yaml
services:
  web:
    image: nginx:stable
    ports: ["80:80", "443:443"]
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - dbdata:/var/lib/postgresql/data
volumes:
  dbdata:
# Запуск:
docker compose up -d

Харденинг (усиление защиты)

unattended-upgrades — автообновления безопасности

sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades   # включить
# /etc/apt/apt.conf.d/50unattended-upgrades — что обновлять
sudo unattended-upgrades --dry-run --debug

fail2ban — блокировка брутфорсеров

sudo apt install fail2ban
# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
banaction = nftables-multiport     # в 24.04 используем nftables-бэкенд
backend = systemd

[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 3

[nginx-http-auth]
enabled = true
sudo systemctl enable --now fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd banip 1.2.3.4

AppArmor, Lynis, аудит SUID

sudo apt install apparmor-utils lynis
sudo aa-status                       # профили AppArmor
sudo lynis audit system              # аудит безопасности, рекомендации в /var/log/lynis-report/

# Найти все SUID/SGID-бинарники (потенциально опасны):
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -ld {} \; 2>/dev/null
# Снять suid, если не нужен (осторожно!):
# sudo chmod u-s /path/to/bin
AppArmor включён в Ubuntu по умолчанию и ограничивает, что может делать процесс (например nginx). Не отключай его без причины. Lynis даёт оценку «hardening index» — стремись к максимуму.

Диагностика загрузки и восстановление

Никогда не запускай fsck на смонтированном разделе — можно разрушить файловую систему. Используй Live-USB или recovery mode (где корень монтируется read-only).

Производительность: sysctl, tuned, perf

sysctl — параметры ядра

# /etc/sysctl.d/99-tuning.conf
# Сеть:
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 5000
# Память / swap:
vm.swappiness = 10
vm.vfs_cache_pressure = 50
# Открытые файлы:
fs.file-max = 2097152
# Применить:
sudo sysctl --system
sysctl net.ipv4.tcp_tw_reuse     # проверка

tuned и perf

sudo apt install tuned
sudo tuned-adm list              # профили (throughput-performance, latency-performance…)
sudo tuned-adm profile throughput-performance

# perf — профилирование CPU (для поиска узких мест в коде):
sudo apt install linux-tools-common
sudo perf top
sudo perf record -a -g -- sleep 30
sudo perf report
Для высоконагруженных сервисов увеличь лимиты дескрипторов: в /etc/security/limits.conf пропиши * soft nofile 1048576 и перезайди в сессию.