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 — ошибка в синтаксисе
положит сайт целиком.
Что проверить после настройки
- Сайт открывается, редирект с HTTP работает.
- Административная часть доступна, файлы загружаются.
- Изображения товаров генерируются и отображаются.
- Композит отдаёт страницы из кеша неавторизованным.
- Авторизованный пользователь видит персональные данные, а не чужой кеш.
- Служебные пути отдают отказ в доступе.
- Обмен с 1С проходит целиком.
- Сжатие включено — проверяется в заголовках ответа.
Пятый пункт критичен: неверное условие в правиле композита приводит к тому, что все посетители получают страницу первого зашедшего — вместе с его именем в шапке и содержимым его корзины.
Частые ошибки
-
Нет
try_filesв блоке PHP. Потенциальная возможность выполнить загруженный файл. - Композит отдаётся авторизованным. Пользователи видят чужие персональные данные.
-
Маленький
client_max_body_size. Не загружаются файлы, обрывается обмен. -
Короткий
fastcgi_read_timeout. Ошибка 504 на долгих операциях. -
Нет
try_filesдля статики. Превью изображений отдают 404. - Дампы базы доступны по прямой ссылке. Полная утечка данных.
- Конфиг применили без проверки. Сайт лежит из-за опечатки.
Итог
Конфигурация Nginx для 1С-Битрикс состоит из семи блоков: обработка PHP с увеличенными таймаутами, правило композитного кеша, закрытие служебных путей, отдача статики с учётом генерации превью, сжатие, отдельные лимиты для обмена с 1С и редирект на HTTPS.
Два места требуют особого внимания: try_files в блоке PHP —
вопрос безопасности, и условие композитного кеша — вопрос того, не увидят ли
посетители чужие данные. Остальное — вопрос удобства и скорости.
