Главная » Производительность » Настройка Nginx для Битрикс: рабочий конфиг

Настройка Nginx для Битрикс: рабочий конфиг

Конфигурация Nginx для Битрикс: блоки обработки PHP, композитного кеша и защиты служебных путей

Nginx для сайта на 1С-Битрикс настраивается не совсем так, как для типового PHP-проекта. У Битрикс есть служебные пути, которые нужно закрыть, механизм композитного кеша, требующий отдельного правила, и обработчик обмена с 1С, которому нужны увеличенные лимиты.

Разберём рабочую конфигурацию по блокам и объясним, зачем нужен каждый — чтобы конфиг не копировался вслепую.

Базовая структура

server {
    listen 80;
    server_name site.ru www.site.ru;
    return 301 https://site.ru$request_uri;
}

server {
    listen 443 ssl http2;
    server_name site.ru;

    root /home/site/public_html;
    index index.php;

    ssl_certificate     /etc/letsencrypt/live/site.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/site.ru/privkey.pem;

    client_max_body_size 100m;

    # ... остальные блоки ...
}

Параметр client_max_body_size задаёт максимальный размер загружаемого файла. Значение по умолчанию — около мегабайта, чего не хватит ни для обмена с 1С, ни для загрузки изображений товаров.

Обработка PHP

location ~ \.php$ {
    try_files $uri =404;

    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;

    fastcgi_read_timeout 600;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
}

Два момента, специфичных для Битрикс:

  • try_files $uri =404 — обязательная строка безопасности. Без неё возможна ситуация, когда загруженный файл выполняется как PHP.
  • fastcgi_read_timeout увеличен: обмен с 1С, импорт и переиндексация выполняются долго. При значении по умолчанию вы получите ошибку 504 — этот случай разобран в статье Ошибка 504 Gateway Timeout в Битрикс.

Нужна помощь с Битрикс?





    Композитный кеш

    Композит хранит готовые HTML-страницы, и Nginx может отдавать их напрямую, не запуская PHP вообще. Это самая заметная по эффекту часть конфигурации:

    set $composite_cache "";
    
    if ($request_method = GET) {
        set $composite_cache "on";
    }
    
    if ($http_cookie !~ 'BITRIX_SM_LOGIN') {
        set $composite_cache "${composite_cache}A";
    }
    
    location / {
        if ($composite_cache = "onA") {
            rewrite .* /bitrix/html_pages/$host/$composite_key/index.html last;
        }
    
        try_files $uri $uri/ @bitrix;
    }

    Логика простая: страницу из кеша отдаём только на GET-запросы и только неавторизованным посетителям. Авторизованный пользователь должен получить персональную версию. Как устроен сам механизм, описано в статье Композитный сайт Битрикс.

    Служебные пути

    Часть каталогов Битрикс должна быть закрыта от прямого доступа:

    # файлы окружения
    location ~* /(bitrix/modules|upload/support/not_image|bitrix/php_interface) {
        deny all;
    }
    
    # кеш
    location ~* /bitrix/(cache|managed_cache|stack_cache|html_pages) {
        deny all;
    }
    
    # резервные копии и дампы
    location ~* \.(sql|bak|tar|gz|zip)$ {
        deny all;
    }
    
    # файлы конфигурации
    location ~* /\.(git|env|htaccess) {
        deny all;
    }

    Третий блок особенно важен. Резервная копия базы, забытая в корне сайта, скачивается любым желающим — это самый простой способ получить все данные проекта.

    Статика

    location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|css|js|woff2?)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
        access_log off;
        try_files $uri @bitrix;
    }

    Обратите внимание на try_files $uri @bitrix в конце. Это нужно из-за особенности Битрикс: часть изображений генерируется на лету при первом обращении. Без этой строки запрос на ещё не созданное превью вернёт 404 вместо того, чтобы создать файл.

    Сжатие

    gzip on;
    gzip_comp_level 5;
    gzip_min_length 1000;
    gzip_proxied any;
    gzip_types
        text/plain
        text/css
        text/xml
        application/javascript
        application/json
        application/xml
        image/svg+xml;

    Изображения в список не включают: JPEG и PNG уже сжаты, и повторное сжатие только тратит процессорное время.

    Обмен с 1С

    Обработчику обмена нужны отдельные, более щедрые лимиты:

    location = /bitrix/admin/1c_exchange.php {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    
        fastcgi_read_timeout 1800;
        client_max_body_size 1024m;
    }

    Полтора мегабайта по умолчанию и тридцатисекундный таймаут гарантированно оборвут выгрузку большого каталога. Настройка самого обмена описана в статье Интеграция Битрикс с 1С.

    Проверка конфигурации

    # проверить синтаксис перед применением
    nginx -t
    
    # применить без разрыва соединений
    systemctl reload nginx

    Всегда используйте reload, а не restart: перезагрузка конфигурации не обрывает текущие запросы. И никогда не применяйте конфиг без предварительной проверки nginx -t — ошибка в синтаксисе положит сайт целиком.

    Что проверить после настройки

    1. Сайт открывается, редирект с HTTP работает.
    2. Административная часть доступна, файлы загружаются.
    3. Изображения товаров генерируются и отображаются.
    4. Композит отдаёт страницы из кеша неавторизованным.
    5. Авторизованный пользователь видит персональные данные, а не чужой кеш.
    6. Служебные пути отдают отказ в доступе.
    7. Обмен с 1С проходит целиком.
    8. Сжатие включено — проверяется в заголовках ответа.

    Пятый пункт критичен: неверное условие в правиле композита приводит к тому, что все посетители получают страницу первого зашедшего — вместе с его именем в шапке и содержимым его корзины.

    Частые ошибки

    • Нет try_files в блоке PHP. Потенциальная возможность выполнить загруженный файл.
    • Композит отдаётся авторизованным. Пользователи видят чужие персональные данные.
    • Маленький client_max_body_size. Не загружаются файлы, обрывается обмен.
    • Короткий fastcgi_read_timeout. Ошибка 504 на долгих операциях.
    • Нет try_files для статики. Превью изображений отдают 404.
    • Дампы базы доступны по прямой ссылке. Полная утечка данных.
    • Конфиг применили без проверки. Сайт лежит из-за опечатки.

    Итог

    Конфигурация Nginx для 1С-Битрикс состоит из семи блоков: обработка PHP с увеличенными таймаутами, правило композитного кеша, закрытие служебных путей, отдача статики с учётом генерации превью, сжатие, отдельные лимиты для обмена с 1С и редирект на HTTPS.

    Два места требуют особого внимания: try_files в блоке PHP — вопрос безопасности, и условие композитного кеша — вопрос того, не увидят ли посетители чужие данные. Остальное — вопрос удобства и скорости.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний