bitrix-vps-infra

Нативная инфраструктура для Bitrix на VPS: один скрипт, ноль Docker

nginx · php-fpm · Percona MySQL через сокет · memcached ×2 · fail2ban · CrowdSec

Ubuntu 24.04 · PHP 8.4-FPM · Percona 8.0


Что это

Полный набор конфигов и идемпотентный install.sh, который превращает свежую Ubuntu 24.04 в рабочую площадку под 1С-Битрикс: веб-сервер, база только по unix-сокету, два memcached, агенты в cron, бэкапы по расписанию, защита на fail2ban и CrowdSec.

Конфигурация поднята на реальном магазине и закрывает типовые проблемы классического Bitrix VM: prefork-Apache держит пул воркеров, которые съедают всю память к обеду; MySQL слушает TCP и ловит сканеры портянкой aborted connects. Здесь воркеры создаются под нагрузку и умирают сами (pm.max_requests), а база недоступна по сети физически.

Архитектура

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, авторотация

Быстрый старт

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. Повторный запуск безопасен: конфиги перезаписываются, ничего не удаляется.

Миграция сайта со старого сервера

# на старом сервере: дамп базы
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 одним ходом:

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.

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

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 дней бюджет диска

Восстановление из бэкапа

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 как образец. Идеология та же, только нативные пакеты вместо контейнеров.

S
Description
No description provided
Readme
53 KiB
Languages
Shell 92.7%
Python 7.3%