Битрикс на каждый запрос трогает тысячи файлов. Docker Desktop на Mac кладёт эти обращения в виртуальную ФС — и страница каталога превращается в медитацию. Я попробовал, поругался и собрал стек так, как на сервере: нативно.

nginx · PHP-FPM 8.3 · MySQL 8 · Redis — через MacPorts. Без контейнеров, без ожидания.

Разница ощущается сразу: холодный старт окружения — секунды, хит Битрикса — как на проде, а не «подождите, Docker синхронизирует».

Каркас

Одна схема на все проекты:

  • сайты лежат в ~/Sites/имя.test
  • каждый домен — свой vhost в ~/Sites/configs/nginx/conf.d/
  • *.test прописаны в /etc/hosts — DNS не нужен
  • PHP-FPM один на всех (127.0.0.1:9000), MySQL и Redis — общие

Управлять этим руками надоело быстро. Сначала появился server.sh, потом — нативная панель Server Control.

Server Control — статусы nginx, PHP-FPM, MySQL и Redis

Один скрипт вместо десятка команд

~/Sites/server.sh поднимает и гасит сервисы через port load / port unload, рисует статусы портов и гоняет живые тесты PHP↔MySQL / PHP↔Redis.

SERVICES="nginx php83-fpm mysql8-server redis"

start_servers() {
  for service in $SERVICES; do
    sudo port load "$service" 2>/dev/null
  done
  sleep 2
  check_status   # процессы + порты 80 / 9000 / 3306 / 6379
}

# ./server.sh start | stop | restart | status | test

Команда test не врёт зелёной галочкой: она реально стучится в сокеты. Если MySQL «вроде запущен», а коннекта нет — увидишь сразу.

nginx под Битрикс

Для обычного PHP-сайта хватает try_files … /index.php. Для Битрикса — фолбэк на urlrewrite.php, запрет служебных кешей и запас по телу запроса (выгрузки из 1С бывают толстыми).

server {
    listen 80;
    server_name bai.test;
    root /Users/erik/Sites/bai.test;
    client_max_body_size 100M;

    location ~* ^/(bitrix/cache|bitrix/managed_cache|bitrix/stack_cache|upload/1c_catalog|upload/resize_cache)/ {
        deny all;
    }

    location / {
        try_files $uri $uri/ /bitrix/urlrewrite.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 300s;
    }
}

Новый проект = скопировал конфиг, поменял server_name / root, добавил строку в hosts, создал базу. Через Server Control это вообще кнопка «Создать сайт».

Почему Redis рядом

На каталоге с десятками тысяч SKU MySQL без кеша быстро становится узким местом даже локально. Redis как кеш-бэкенд Битрикса снимает лишние запросы — и отладка «почему тормозит витрина» становится честнее: ты видишь код, а не страдания диска.

Итог

  • нативная скорость файловой системы — критично для Битрикса
  • десяток сайтов на одном PHP-FPM, без зоопарка контейнеров
  • старт/стоп/тест — скрипт или GUI, как удобнее в момент
  • те же nginx/PHP/MySQL/Redis, что и на боевых серверах — меньше сюрпризов при выкладке

Docker я не хоронил: для чужих стеков и CI он ок. Для ежедневной Битрикс-разработки на Mac мой выбор — этот стек. Быстро, предсказуемо и без лишней магии.