README: Russian rewrite with mermaid architecture diagram, badges, tuning table

This commit is contained in:
infra-bot
2026-08-27 16:21:28 +03:00
parent 34ff3a2693
commit e41d31af24
+106 -71
View File
@@ -1,119 +1,154 @@
# ============================================================ <div align="center">
# bitrix-vps-infra — native Bitrix stack on Ubuntu 24.04 VPS
# nginx (static+TLS) → php-fpm → Percona MySQL (unix socket)
# + memcached x2 + fail2ban + CrowdSec + ufw + backups
#
#docker analogue of paskal/bitrix.infra, without containers.
# ============================================================
## Services # bitrix-vps-infra
| Service | What | Where | **Нативная инфраструктура для Bitrix на VPS: один скрипт, ноль Docker**
|----------------|-----------------------------------------------|-------|
| nginx | front, static files, urlrewrite, rate-limit zones | `/etc/nginx/` |
| php8.4-fpm | Bitrix runtime, pool `bitrix` | `/etc/php/8.4/fpm/pool.d/bitrix.conf` |
| Percona MySQL | socket-only (`localhost`), buffer pool 4G | `/etc/mysql/conf.d/99-bitrix.cnf` |
| memcached x2 | cache `127.0.0.1:11211`, sessions `11212` | systemd units `memcached-cache/-sessions` |
| fail2ban | sshd + nginx-http-auth jails | `/etc/fail2ban/jail.local` |
| CrowdSec | parses nginx combined logs + sshd journal | `/etc/crowdsec/acquis.yaml` |
| cron | Bitrix agents CLI, exchange, nightly backup | `/etc/cron.d/bitrix` |
| ufw | OpenSSH/80/443 | `/etc/ufw/` |
## Quickstart (fresh Ubuntu 24.04) nginx · php-fpm · Percona MySQL через сокет · memcached ×2 · fail2ban · CrowdSec
[Ubuntu&nbsp;24.04](https://releases.ubuntu.com/noble/) · [PHP&nbsp;8.4-FPM](https://rpms.remirepo.net/) · [Percona&nbsp;8.0](https://www.percona.com/software/mysql-database/percona-server)
</div>
---
## Что это
Полный набор конфигов и идемпотентный `install.sh`, который превращает свежую Ubuntu 24.04
в рабочую площадку под 1С-Битрикс: веб-сервер, база только по unix-сокету, два memcached,
агенты в cron, бэкапы по расписанию, защита на fail2ban и CrowdSec.
Конфигурация поднята на реальном магазине и закрывает типовые проблемы классического
Bitrix VM: prefork-Apache держит пул воркеров, которые съедают всю память к обеду;
MySQL слушает TCP и ловит сканеры портянкой aborted connects. Здесь воркеры создаются
под нагрузку и умирают сами (`pm.max_requests`), а база недоступна по сети физически.
## Архитектура
```mermaid
flowchart TB
U["Браузер"] -->|"HTTPS :443"| NG
subgraph VPS["Ubuntu 24.04, без Docker"]
NG["nginx<br/>TLS · статика · urlrewrite<br/>limit_req zones"]
NG -->|"fastcgi, unix-сокет<br/>/run/php/bitrix-fpm.sock"| PHP["php-fpm pool 'bitrix'<br/>dynamic, max 30, max_requests 500"]
PHP -->|"localhost = сокет"| DB[("Percona MySQL 8.0<br/>bind 127.0.0.1 only")]
PHP --> MC1[("memcached cache<br/>127.0.0.1:11211")]
PHP --> MC2[("memcached sessions<br/>127.0.0.1:11212")]
CRON["cron (CLI php)<br/>agents · exchange · backup"]
CRON --> PHP
CRON --> DB
end
LOGS["nginx access.log (combined)"] -.->|parse| CS["CrowdSec + firewall-bouncer"]
SSHD["sshd journal"] -.-> F2B["fail2ban"]
CRON --> BAK["backups:<br/>mysqldump + code tarball<br/>retention 14 дней"]
CS -.->|"блокирует"| U
```
Ключевые отличия от «Bitrix VM по умолчанию»:
| Проблема VM | Решение здесь |
|---|---|
| 60 постоянных воркеров mod_php съедают RAM | fpm dynamic: создаются под трафик, верхняя граница 30 |
| MySQL на TCP, Aborted_connects десятками тысяч | сеть отключена, доступ только локальный сокет |
| Сессии в файлах на одном диске с сайтом | отдельный memcached-инстанс |
| Агенты через веб-хиты | CLI cron раз в минуту |
| Ручные бэкапы | nightly mysqldump + tarball, авторотация |
## Быстрый старт
```bash ```bash
apt update && apt install -y git apt update && apt install -y git
git clone <this repo> /opt/bitrix-vps-infra && cd /opt/bitrix-vps-infra git clone https://git.hlam.su/free/bitrix-vps-infra.git /opt/bitrix-vps-infra
cd /opt/bitrix-vps-infra
# 1) edit variables at top of install.sh (DOMAIN first!) # обязательный минимум перед запуском:
nano scripts/../install.sh # DOMAIN=..., FPM_MAX_CHILDREN=30, TZ nano install.sh # DOMAIN=..., при желании TZ, FPM_MAX_CHILDREN, DB_PASS
sudo ./install.sh sudo ./install.sh
# creds printed and saved to /root/bitrix-install-creds.txt (chmod 600) # креды печатаются и сохраняются (chmod 600):
cat /root/bitrix-install-creds.txt cat /root/bitrix-install-creds.txt
``` ```
## Migrate site from old server Скрипт ставит пакеты (ondrej PPA → php8.4-fpm, Percona repo → mysql-server, memcached,
fail2ban, CrowdSec + firewall-bouncer, certbot), раскладывает все конфиги из `config/`,
создаёт БД и пользователя, настраивает ufw (22/80/443), swap 4G и swappiness=10.
Повторный запуск безопасен: конфиги перезаписываются, ничего не удаляется.
## Миграция сайта со старого сервера
```bash ```bash
# on OLD server: dump db # на старом сервере: дамп базы
mysqldump --single-transaction --routines --triggers sitemanager | gzip > sitemanager.sql.gz mysqldump --single-transaction --routines --triggers sitemanager | gzip > sitemanager.sql.gz
# copy content # перенос содержимого
rsync -avz /home/bitrix/www/bitrix newvps:/home/bitrix/www/ rsync -avz /home/bitrix/www/bitrix newvps:/home/bitrix/www/
rsync -avz /home/bitrix/www/{local,upload} newvps:/home/bitrix/www/ rsync -avz /home/bitrix/www/{local,upload} newvps:/home/bitrix/www/
# import on NEW server # импорт на новом
gunzip < sitemanager.sql.gz | mysql sitemanager gunzip < sitemanager.sql.gz | mysql sitemanager
./scripts/fix-rights.sh /home/bitrix/www ./scripts/fix-rights.sh /home/bitrix/www
# bitrix app-configs: take examples, insert DB pass from creds file # конфиги приложения из примеров репы
cp config/bitrix-app/dbconn.php.example /home/bitrix/www/bitrix/php_interface/dbconn.php cp config/bitrix-app/dbconn.php.example /home/bitrix/www/bitrix/php_interface/dbconn.php
cp config/bitrix-app/settings_extra.php.example /home/bitrix/www/bitrix/.settings_extra.php cp config/bitrix-app/settings_extra.php.example /home/bitrix/www/bitrix/.settings_extra.php
# then edit .settings.php: host=localhost, add 'session' block from settings_extra comment # пароль БД взять из creds, 'session'-блок перенести в .settings.php (см. комментарий в примере)
``` ```
After that: TLS одним ходом:
```bash ```bash
apt-get install -y certbot python3-certbot-nginx apt-get install -y certbot python3-certbot-nginx
DOMAIN=$(grep '^DOMAIN=' /root/bitrix-install-creds.txt | cut -d= -f2) DOMAIN=$(grep '^DOMAIN=' /root/bitrix-install-creds.txt | cut -d= -f2)
certbot --nginx -d "$DOMAIN" -d "www.$DOMAIN" # upgrades vhost to TLS + redirect certbot --nginx -d "$DOMAIN" -d "www.$DOMAIN"
systemctl reload nginx systemctl reload nginx
``` ```
## Verify checklist certbot допишет 443-блок и редирект прямо в существующий vhost.
## Проверка после установки
```bash ```bash
curl -I http://DOMAIN # 200 or 301 curl -I http://$DOMAIN # ожидаем 200 или 301
mysqladmin status # socket alive, TCP not listening: ss -tlnp | grep -E ':3306|:33060' # пусто: TCP у базы выключен
ss -tlnp | grep -E '3306|33060' # expect EMPTY output free -m # swap почти пуст, available > 3G
free -m # swap ~0 used, available >3G fail2ban-client status sshd # jail активен
php-fpm8.4 -tt # pool syntax ok cscli metrics # crowdsec читает access.log
tail -f /var/log/php/bitrix-slow.log # requests >5s land here /usr/bin/php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php
fail2ban-client status sshd # jail active # агенты вручную, без ошибок
cscli metrics # crowdsec parsing access.log tail -f /var/log/php/bitrix-slow.log # всё, что дольше 5 секунд
/usr/bin/php -d memory_limit=1024M -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php
# agents run manually without error
``` ```
Site smoke: main page → catalog section → cart → admin login. Check exchange via admin Дымовой тест сайта: главная → каталог → корзина → вход в админку → обмен с 1С.
or manual flock command from `/etc/cron.d/bitrix`.
## Tuning knobs ## Ручки тюнинга
| Knob | File | Default | When change | | Ручка | Где | По умолчанию | Когда крутить |
|------|------|---------|-------------| |---|---|---|---|
| pm.max_children | fpm pool | 30 | OOM/slow under peak → raise if RAM free; 503 → lower concurrency | | `FPM_MAX_CHILDREN` | install.sh / pool | 30 | 503 под пиком: свободной RAM мало, снижайте; «висит» и есть память: повышайте |
| innodb_buffer_pool_size | mysql cnf | 4G | sized for 12GB box | | `innodb_buffer_pool_size` | mysql cnf | 4G | рассчитано на бокс ~12 GB RAM |
| memcached cache MB | unit file | 1024 | raise on cache churn | | memcached cache MB | systemd unit | 1024 | частая инвалидация кэша |
| limit_req rate | nginx.conf zone | 10 r/s | enforce per-location when needed | | rate limit | nginx.conf zone | 10 r/s | включать пер-локацией по необходимости |
| backup retention | backup.sh | 14 days | disk budget | | retention бэкапов | backup.sh | 14 дней | бюджет диска |
## Restore from backup ## Восстановление из бэкапа
```bash ```bash
gunzip < /var/backups/bitrix/db/<ts>_sitemanager.sql.gz | mysql sitemanager gunzip < /var/backups/bitrix/db/<ts>_sitemanager.sql.gz | mysql sitemanager
cd /home/bitrix/www cd /home/bitrix/www && tar xzf /var/backups/bitrix/code/<ts>_site.tar.gz
tar xzf /var/backups/bitrix/code/<ts>_site.tar.gz --strip-components=0 # replaces webroot files except upload/
./scripts/fix-rights.sh ./scripts/fix-rights.sh
``` ```
Upload directory is NOT in backups by design (bulky). Sync it separately Каталог `upload/` в бэкапы не входит намеренно: он громоздкий. При нехватке места
(e.g. weekly `rsync -a /home/bitrix/www/upload /var/backups/bitrix/upload`) if size permits. на проде синхронизируйте его отдельно раз в неделю.
## Notes / trade-offs taken deliberately ("no overskill") ## Осознанные упрощения
* No HTTP/3/brotli modules — gzip covers 95% benefit; upgrade path documented below. Взято «как в лучших традициях», но без overengineering: ни HTTP/3, ни brotli (gzip
* No composite-site nginx layer yet — enable after basic migration proved stable покрывает основной выигрыш), ни Zabbix/Sentry, ни composite-слой в nginx. Расширять
(add `$bx_composite_file` map + try_files per paskal/bitrix.infra pattern). просто: brotli ставится двумя пакетами, composite-схема берётся из paskal/bitrix.infra
* No Zabbix/Sentry — CrowdSec metrics + slowlog + system journal are the floor; как образец. Идеология та же, только нативные пакеты вместо контейнеров.
consider netdata later if growth demands.
* CrowdSec firewall-bouncer replaces host iptables scripting entirely.
### Optional upgrades later
```bash
apt install libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static # brotli
add brotli line into nginx.conf http{} block after gzips.
```