acme.sh: ACME-клиент без единой строчки на Python

certbot тянет за собой интерпретатор Python и набор pip-пакетов — на обычном сервере это не проблема, но на урезанном образе, роутере с OpenWRT или в минимальном Docker-контейнере без python3 установка такого клиента превращается в отдельный квест. acme.sh написан целиком на POSIX shell — работает под bash, dash, busybox ash, не требует ничего, кроме curl или wget и стандартных утилит, которые есть почти в любом дистрибутиве по умолчанию. Устанавливается сам в ~/.acme.sh одной командой и не требует root: ...

October 9, 2026 · llexa

nginx: ограничение числа соединений через limit_conn

limit_req режет частоту запросов в секунду, а limit_conn в nginx решает другую задачу — ограничивает, сколько соединений с одного ключа (обычно IP) может быть открыто одновременно. Это разные лимиты, и путать их не стоит: клиент может укладываться в лимит запросов в секунду и всё равно держать десятки параллельных закачек с одного адреса. http { limit_conn_zone $binary_remote_addr zone=addr:10m; server { location /download/ { limit_conn addr 1; } } } Здесь на один IP разрешено одно одновременное соединение с /download/ — типичный кейс для раздачи файлов, где важно не количество запросов в секунду, а то, сколько параллельных закачек тянет один клиент. При превышении лимита nginx по умолчанию отвечает 503, код меняется через limit_conn_status. ...

October 6, 2026 · llexa

LGTM-стек #3: экспортёры nginx и RabbitMQ — один свой, второй встроенный

Два сервиса из типового стека — и два разных подхода к тому, откуда Prometheus берёт по ним метрики: у одного нужен отдельный процесс-переводчик, у второго экспорт уже встроен. ...

September 28, 2026 · llexa

HAProxy: балансировка, ACL и health checks

HAProxy разделяет конфиг на frontend (что слушаем) и backend (куда шлём), в отличие от nginx, где всё описывается блоками server/location вперемешку. Такое разделение упрощает ACL — правила маршрутизации по пути, хосту или заголовку живут отдельно от списка бэкендов. frontend web bind *:80 acl is_api path_beg /api use_backend api_servers if is_api default_backend web_servers backend web_servers option httpchk GET /health server web1 10.0.0.1:8080 check server web2 10.0.0.2:8080 check option httpchk шлёт GET на /health, упавший чек убирает узел из ротации без перезапуска HAProxy. check в строке server включает мониторинг — без него трафик слепо идёт и на мёртвый бэкенд. ...

September 14, 2026 · llexa

certbot: автоматизация TLS-сертификатов Let's Encrypt

Платный wildcard-сертификат или возня с CSR — избыточны для большинства сайтов. certbot сам получает сертификат Let’s Encrypt, вписывает его в конфиг nginx и настраивает автопродление: сертификаты живут 90 дней, продление обязано быть автоматическим. # выпуск + автонастройка nginx для домена sudo certbot certonly --nginx -d example.com -d www.example.com # автопродление настроено? (обычно systemd timer) systemctl list-timers | grep certbot # сухой прогон продления, без реального обновления sudo certbot renew --dry-run --nginx сам находит нужный server-блок. --standalone — если nginx ещё не поднят. renew --dry-run раз в квартал стоит гонять руками — чтобы не узнать о сломанном автопродлении в момент истечения сертификата. ...

July 25, 2026 · llexa

nginx: усиление TLS без танцев с бубном

Дефолтный nginx с сертификатом Let’s Encrypt работает, но A на SSL Labs не даст — разрешены старые протоколы и слабые шифры. Правится парой директив в server. ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5:!3DES; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=63072000" always; ssl_stapling on; # OCSP stapling — сервер сам ssl_stapling_verify on; # прикладывает статус сертификата После правки: nginx -t && systemctl reload nginx, проверка — ssl-labs.com/ssltest или openssl s_client -connect host:443 -status. HSTS с годовым max-age необратим: сломается TLS — браузеры откажутся ходить и по HTTP. Включать значение постепенно. ...

July 20, 2026 · llexa

nginx: map и geo — динамика без if

map и geo живут в http {} и вычисляются один раз на запрос — без if, без лишнего кода. geo $remote_addr $is_internal { default 0; 10.0.0.0/8 1; 192.168.0.0/16 1; } map $http_referer $bad_referer { default 0; ~*spam\.ru 1; } server { if ($bad_referer) { return 444; } if ($is_internal = 0) { return 403; } } geo — хэш по IP, без regex, очень быстро. map — regex по любому заголовку или переменной. Комбинируются свободно. #nginx #linux #sysadmin

June 29, 2026 · llexa

nginx upstream: балансировка и keepalive

Базовый upstream с тремя бэкендами и балансировкой по наименьшим соединениям: upstream backend { least_conn; server 127.0.0.1:8001; server 127.0.0.1:8002; server 127.0.0.1:8003; keepalive 32; } server { location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } keepalive 32 — пул постоянных соединений к бэкендам. proxy_http_version 1.1 + Connection "" обязательны, иначе keepalive не работает. Алгоритмы: round_robin (дефолт), least_conn (меньше активных соединений), ip_hash (одна сессия — один бэкенд). Для ip_hash убрать least_conn. ...

June 26, 2026 · llexa

nginx: ограничение запросов (rate limiting)

limit_req в nginx режет частоту запросов прямо на уровне веб-сервера — без iptables и без отдельного WAF. http { # зона на 10 МБ, лимит — 10 запросов/сек на каждый IP limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; server { location /api/ { limit_req zone=api burst=20 nodelay; limit_req_status 429; proxy_pass http://backend; } } } burst=20 — разрешает кратковременный всплеск в 20 запросов сверх лимита, nodelay — не ставит их в очередь, а пропускает сразу или режет. Без nodelay лишние запросы притормозятся, а не отклонятся. ...

June 19, 2026 · llexa