155 lines
7.7 KiB
Markdown
155 lines
7.7 KiB
Markdown
<div align="center">
|
||
|
||
# bitrix-vps-infra
|
||
|
||
**Нативная инфраструктура для Bitrix на VPS: один скрипт, ноль Docker**
|
||
|
||
nginx · php-fpm · Percona MySQL через сокет · memcached ×2 · fail2ban · CrowdSec
|
||
|
||
[Ubuntu 24.04](https://releases.ubuntu.com/noble/) · [PHP 8.4-FPM](https://rpms.remirepo.net/) · [Percona 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
|
||
apt update && apt install -y git
|
||
git clone https://git.hlam.su/free/bitrix-vps-infra.git /opt/bitrix-vps-infra
|
||
cd /opt/bitrix-vps-infra
|
||
|
||
# обязательный минимум перед запуском:
|
||
nano install.sh # DOMAIN=..., при желании TZ, FPM_MAX_CHILDREN, DB_PASS
|
||
|
||
sudo ./install.sh
|
||
|
||
# креды печатаются и сохраняются (chmod 600):
|
||
cat /root/bitrix-install-creds.txt
|
||
```
|
||
|
||
Скрипт ставит пакеты (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
|
||
# на старом сервере: дамп базы
|
||
mysqldump --single-transaction --routines --triggers sitemanager | gzip > sitemanager.sql.gz
|
||
|
||
# перенос содержимого
|
||
rsync -avz /home/bitrix/www/bitrix newvps:/home/bitrix/www/
|
||
rsync -avz /home/bitrix/www/{local,upload} newvps:/home/bitrix/www/
|
||
|
||
# импорт на новом
|
||
gunzip < sitemanager.sql.gz | mysql sitemanager
|
||
./scripts/fix-rights.sh /home/bitrix/www
|
||
|
||
# конфиги приложения из примеров репы
|
||
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
|
||
# пароль БД взять из creds, 'session'-блок перенести в .settings.php (см. комментарий в примере)
|
||
```
|
||
|
||
TLS одним ходом:
|
||
|
||
```bash
|
||
apt-get install -y certbot python3-certbot-nginx
|
||
DOMAIN=$(grep '^DOMAIN=' /root/bitrix-install-creds.txt | cut -d= -f2)
|
||
certbot --nginx -d "$DOMAIN" -d "www.$DOMAIN"
|
||
systemctl reload nginx
|
||
```
|
||
|
||
certbot допишет 443-блок и редирект прямо в существующий vhost.
|
||
|
||
## Проверка после установки
|
||
|
||
```bash
|
||
curl -I http://$DOMAIN # ожидаем 200 или 301
|
||
ss -tlnp | grep -E ':3306|:33060' # пусто: TCP у базы выключен
|
||
free -m # swap почти пуст, available > 3G
|
||
fail2ban-client status sshd # jail активен
|
||
cscli metrics # crowdsec читает access.log
|
||
/usr/bin/php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php
|
||
# агенты вручную, без ошибок
|
||
tail -f /var/log/php/bitrix-slow.log # всё, что дольше 5 секунд
|
||
```
|
||
|
||
Дымовой тест сайта: главная → каталог → корзина → вход в админку → обмен с 1С.
|
||
|
||
## Ручки тюнинга
|
||
|
||
| Ручка | Где | По умолчанию | Когда крутить |
|
||
|---|---|---|---|
|
||
| `FPM_MAX_CHILDREN` | install.sh / pool | 30 | 503 под пиком: свободной RAM мало, снижайте; «висит» и есть память: повышайте |
|
||
| `innodb_buffer_pool_size` | mysql cnf | 4G | рассчитано на бокс ~12 GB RAM |
|
||
| memcached cache MB | systemd unit | 1024 | частая инвалидация кэша |
|
||
| rate limit | nginx.conf zone | 10 r/s | включать пер-локацией по необходимости |
|
||
| retention бэкапов | backup.sh | 14 дней | бюджет диска |
|
||
|
||
## Восстановление из бэкапа
|
||
|
||
```bash
|
||
gunzip < /var/backups/bitrix/db/<ts>_sitemanager.sql.gz | mysql sitemanager
|
||
cd /home/bitrix/www && tar xzf /var/backups/bitrix/code/<ts>_site.tar.gz
|
||
./scripts/fix-rights.sh
|
||
```
|
||
|
||
Каталог `upload/` в бэкапы не входит намеренно: он громоздкий. При нехватке места
|
||
на проде синхронизируйте его отдельно раз в неделю.
|
||
|
||
## Осознанные упрощения
|
||
|
||
Взято «как в лучших традициях», но без overengineering: ни HTTP/3, ни brotli (gzip
|
||
покрывает основной выигрыш), ни Zabbix/Sentry, ни composite-слой в nginx. Расширять
|
||
просто: brotli ставится двумя пакетами, composite-схема берётся из paskal/bitrix.infra
|
||
как образец. Идеология та же, только нативные пакеты вместо контейнеров.
|