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

✉️ Email: [email protected]
📲 Telegram канал: https://t.me/zer0kernelorg
💰 Donate (BTC): bc1qwvrgka76eeley8feqdxjxk2866sv0tnweylxjc
ngx_brotli. Правильная настройка снижает объём передаваемых данных на 60–80% для текстовых ресурсов и ускоряет загрузку страниц.ngx_http_gzip_module сжимает ответ перед отправкой клиенту, если браузер прислал заголовок Accept-Encoding: gzip. Nginx проверяет MIME-тип, размер ответа и уровень сжатия, затем формирует сжатый поток и добавляет заголовок Content-Encoding: gzip.gzip_buffers. Если ответ больше буфера, Nginx пишет временные данные на диск — это замедляет обработку.http {
gzip on;
gzip_vary on;
gzip_min_length 256;
gzip_comp_level 5;
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
application/xml+rss
image/svg+xml;
}
| Директива | Назначение |
|---|---|
gzip on | Включает сжатие |
gzip_vary on | Добавляет Vary: Accept-Encoding, чтобы CDN и прокси кэшировали сжатые и несжатые версии отдельно |
gzip_min_length 256 | Не сжимает ответы меньше 256 байт — сжатие мелких файлов увеличивает объём из-за накладных расходов |
gzip_comp_level 5 | Уровень сжатия от 1 до 9. Уровень 5 даёт хороший баланс между скоростью и степенью сжатия |
gzip_types | Список MIME-типов для сжатия. text/html сжимается всегда, указывать его не нужно |
upstream, которая описывает группу бэкенд-серверов. Запросы распределяются между ними согласно выбранному алгоритму, а при отказе одного из серверов трафик автоматически перенаправляется на оставшиеся.upstream в контексте http. Внутри перечисляются бэкенды с помощью директивы server. Адрес можно задать доменным именем, IP-адресом с необязательным портом или путём к UNIX-сокету с префиксом unix:. Если порт не указан, используется порт 80.upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
backup получают трафик только тогда, когда все основные серверы недоступны. Доменное имя, которому соответствует несколько IP-адресов, автоматически раскладывается на несколько серверов.backend1.example.com, по одному на backend2.example.com:8080 и unix:/tmp/backend3.upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
pg_hba.conf (Host-Based Authentication) определяет, какие клиенты, с каких адресов, к каким базам и под какими пользователями могут подключаться к PostgreSQL, а также какой метод аутентификации будет применён. Это первый барьер на пути любого соединения: если правило не найдено или метод не пройден, сервер отклоняет подключение ещё до проверки пароля.pg_hba.conf находится в каталоге данных кластера (data_directory). Узнать точный путь можно через SQL:| Дистрибутив / способ | Путь |
|---|---|
| Debian/Ubuntu (пакетная установка) | /etc/postgresql/<версия>/main/pg_hba.conf |
| CentOS/RHEL (пакетная установка) | /var/lib/pgsql/<версия>/data/pg_hba.conf |
| Сборка из исходников | <data_directory>/pg_hba.conf |
pg_reload_conf() перечитывает pg_hba.conf, но не применяет изменения к уже установленным соединениям. Новые правила действуют только для новых подключений.pg_hba.conf — это одно правило. Формат:local (Unix-сокет), host (TCP/IP, включая SSL и не-SSL), hostssl (только SSL), hostnossl (только без SSL).all, sameuser, samerole, replication или имя файла с перечнем баз (с префиксом @).all или файл с перечнем ролей (с префиксом @).192.168.1.0/24), имя хоста или all (для local не указывается).--memory (сокращённо -m) задаёт жёсткий потолок оперативной памяти, доступной контейнеру. Если процесс внутри превышает лимит, ядро убивает его через OOM-killer.docker run -d --name app --memory=512m nginx:alpine
b, k, m, g. Слишком малый лимит (единицы мегабайт) приведёт к тому, что контейнер не сможет запуститься — процессу не хватит памяти даже на инициализацию.--memory-reservation задаёт мягкий порог. Ядро старается удерживать потребление ниже этого значения, но не убивает процесс при превышении. Полезен для балансировки нагрузки в условиях нехватки памяти на хосте.docker run -d --memory=1g --memory-reservation=768m myapp
--memory-swap задаёт общий лимит RAM + swap. Поведение зависит от соотношения с --memory:Значение --memory-swap | Поведение |
|---|---|
| Не задан | Общий лимит RAM + swap равен 2 × --memory, то есть swap доступен в объёме --memory |
-1 | Swap не ограничен |
0 | Трактуется как «не задан» — применяется поведение по умолчанию |
Равен --memory | Swap полностью отключён: контейнер может использовать только RAM |
Больше --memory | Swap доступен в объёме --memory-swap минус --memory |
## Запретить swap полностью: memory-swap = memory...
max_connections сервер просто отказывает в подключении. Типичные симптомы перегрузки:FATAL: sorry, too many clients already в логах приложений.pool_mode в секции [pgbouncer] или переопределяется для конкретной базы в секции [databases].SET, advisory locks.COMMIT или ROLLBACK. Между транзакциями клиент «сидит» на внутреннем соединении PgBouncer без серверного ресурса.SET, PREPARE, advisory locks, LISTEN/NOTIFY не сохраняются между транзакциями — состояние сбрасывается при возврате соединения в пул.lvm2 присутствует в большинстве дистрибутивов по умолчанию. Если его нет:## Debian / Ubuntu
sudo apt install lvm2
## RHEL / CentOS / Fedora
sudo dnf install lvm2
systemctl status lvm2-lvmpolld
/dev/sdb) или используйте свободный раздел. Инициализируйте его как PV:sudo pvcreate /dev/sdb
sudo pvs
sudo vgcreate vg_data /dev/sdb
vg_data — произвольное имя группы. Если нужно объединить несколько дисков в один пул, перечислите их через пробел:sudo vgcreate vg_data /dev/sdb /dev/sdc
sudo lvcreate -L 50G -n lv_app vg_data
-L задаёт размер, -n — имя. Том будет доступен как /dev/vg_data/lv_app или через символическую ссылку /dev/mapper/vg_data-lv_app.sudo mkfs.ext4 /dev/vg_data/lv_app
sudo mkdir -p /mnt/app
sudo mount...
/var/log/syslog или grep CRON.Persistent=true запускает задачу при следующей загрузке, если предыдущий запуск был пропущен.After=, Requires=, Wants= для контроля порядка.journalctl -u без дополнительной настройки.systemctl list-timers показывает время последнего и следующего запуска каждого таймера.| Файл | Назначение |
|---|---|
имя.timer | Определяет расписание и условия срабатывания |
имя.service | Описывает, что именно выполнять |
backup.timer активирует backup.service. Таймер не выполняет команды сам — он лишь запускает соответствующий сервис.[Install], потому что активацией управляет таймер.## /etc/systemd/system/backup.service
[Unit]
Description=Ежедневный бэкап базы данных
[Service]
Type=oneshot
ExecStart=/usr/local/bin/db-backup.sh
User=backup
Group=backup
Nice=10
IOSchedulingClass=idle
Type=oneshot — systemd считает задачу завершённой, когда процесс из ExecStart завершится. Это стандарт для задач по расписанию.User= и Group= — запуск от...sshd jail. Но веб-сервер — не менее привлекательная цель: брутфорс панелей управления, перебор паролей в /wp-login.php, сканирование уязвимостей по сигнатурам в URI, попытки эксплуатации известных CVE через GET/POST-запросы. Все эти атаки оставляют следы в логах Nginx или Apache, и Fail2Ban способен их автоматически блокировать.iptables или nftables ban). Разница лишь в том, какой лог парсить и какой паттерн искать.| Компонент | Расположение | Назначение |
|---|---|---|
| Фильтр | /etc/fail2ban/filter.d/*.conf | Регулярное выражение для извлечения IP из строки лога |
| Jail | /etc/fail2ban/jail.conf + /etc/fail2ban/jail.local | Привязка фильтра к лог-файлу, пороги, время бана |
| Действие | /etc/fail2ban/action.d/*.conf | Что делать при бане (iptables, nftables, firewallcmd) |
jail.conf напрямую. Все переопределения пишите в jail.local или в файлы /etc/fail2ban/jail.d/*.conf.ls /etc/fail2ban/filter.d/nginx-*.conf
nginx-http-auth.conf — парсит строки user "..." was not found in "..." и password mismatch из error-лога при использовании auth_basic.nginx-bad-request.conf — ловит запросы, которые Nginx отклонил с кодом 400.nginx-botsearch.conf — блокирует ботов, сканирующих типовые пути (/phpmyadmin, /wp-admin и т. п.).nginx-limit-req.conf — работает в связке с директивой...| Механизм | Где хранится | Управляется через | Типичный сценарий |
|---|---|---|---|
| Named volume | /var/lib/docker/volumes/ | docker volume | Базы данных, состояния сервисов |
| Bind mount | Произвольный путь на хосте | Указывается при запуске | Конфиги, разработка, общие файлы |
| tmpfs mount | Оперативная память | Указывается при запуске | Секреты, кэш, временные данные |
## Создание volume
docker volume create pgdata
## Запуск контейнера с подключением volume
docker run -d \
--name postgres \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:16
-v принимает формат имя_тома:путь_в_контейнере. Если том с таким именем не существует, Docker создаст его автоматически.## Список всех томов
docker volume ls
## Информация о конкретном томе
docker volume inspect pgdata
## Удаление тома (только если он не используется ни одним контейнером)
docker volume rm pgdata
## Удаление всех неиспользуемых томов
docker volume prune
docker volume inspect показывает точку монтирования на хосте, драйвер и метки. По умолчанию данные лежат в...ngx_http_limit_req_module и ngx_http_limit_conn_module встроены в Nginx по умолчанию и не требуют дополнительных пакетов. Они решают две разные задачи: limit_req ограничивает частоту запросов от одного клиента, limit_conn — количество одновременных соединений. Вместе они закрывают основные сценарии: перебор паролей, агрессивный парсинг, всплески трафика от ботов и исчерпание пула соединений к backend.10r/s Nginx пропускает один запрос каждые 100 мс. Если запросы приходят чаще, они либо ставятся в очередь (при наличии burst), либо сразу получают отказ. Очередь тоже ограничена — её размер задаётся параметром burst.limit_req_zone объявляет область в разделяемой памяти, где хранятся счётчики. Размещается в контексте http.http {
limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=10r/s;
}
| Параметр | Назначение |
|---|---|
$binary_remote_addr | Ключ, по которому ведётся подсчёт. Бинарное представление IP занимает 4 байта (IPv4) или 16 байт (IPv6), что экономит память по сравнению с $remote_addr. |
zone=req_per_ip:10m | Имя зоны и размер разделяемой памяти. 1 МБ хранит примерно 16 000 состояний. |
rate=10r/s | Скорость «утечки». Допустимы r/s (запросы в секунду) и r/m (запросы в минуту). |
$server_name для ограничения на весь виртуальный хост, $http_x_api_key для ограничения по API-ключу или комбинацию через конкатенацию.limit_req...