Оптимизация производительности 1С-Битрикс, настраиваем сервер чтобы сайт работал быстрее

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

От скорости сайта зависит многое: количество отказов, брошенных корзин. Согласно исследованию Google, большинство посетителей не ждёт загрузки больше 3 секунд и уходит к конкурентам. Бывает, что сайт тормозит только в момент пиковых нагрузок (часы наибольшей посещаемости, периоды акций) и вы теряете всех, кого так тщательно привлекали. 

От чего зависит скорость сайта на Битриксе?

  • оптимизация компонентов сайта 
  • набор модулей
  • оптимизация серверного ПО
  • достаточное количество ресурсов сервера

С оптимизацией компонентов сайта вам поможет разработчик. Но если есть навыки администрирования, можно перейти на nginx+php-fpm и оптимизировать настройки.

В большинстве случаев, чтобы повысить производительность, нужен анализ текущей нагрузки на сервер. Такое умеют наши администраторы. Но есть и базовые настройки, которых достаточно, чтобы улучшить производительность Битрикс на большинстве серверов. Америку не открываем, если вы хорошо знакомы с *nix, едва ли вы обнаружите что-то новое.

В качестве ОС будем использовать минимальную версию Debian 9. В конце сравним показатели получившейся конфигурации с BitrixVM.

Веб-сервер — Nginx

Лучшим решением будет использование в качестве веб-сервера Nginx. Он шустро работает со статичным контентом и не плодит форков, как это делает apache2. Форки apache2 часто оказываются причиной перерасхода сервером оперативной памяти, потому выбор Nginx снижает требования к объему RAM.

Ставим и конфигурируем Nginx:

apt install nginx
upstream php {
    server 127.0.0.1:9000;
}
server {
    root /var/www/html/;
    server_name _;
    listen 80 default_server;
    index index.php;
    location / {
        try_files \$uri \$uri/ /bitrix/urlrewrite.php?\$args;
    }
    location ~ \.php$ {
        include        fastcgi_params;
        fastcgi_pass   php;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME \$document_root/\$fastcgi_script_name;
    }
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)\$ {
        expires max;
        log_not_found off;
    }
}

Важно! Это только базовая конфигурация, для специфичных функций могут понадобится дополнительные настройки. Наиболее совместимую конфигурацию можно взять из битрикс-окружения. Это учитывается в нашем GT-рецепте.

Сервер БД

В качестве сервера БД используем MariaDB 10.1 из репозитория ОС. Практика показывает, что для нашей задачи гнаться за последними версиями MySQL/MariaDB совершенно не обязательно — значительной разницы в производительности нет. 

Важно! После развертывания сайта нужно выполнить «Проверку системы» с исправлением ошибок структуры БД, а также «Оптимизацию БД», оба действия выполняются в админке Битрикс. Эти операции создадут индексы и устранят фрагментацию, что благотворно скажется на производительности.

Ставим и конфигурируем MariaDB:

apt install mariadb-server
cat <<-\EOF >/etc/mysql/mysql.conf.d/server.conf
    [mysqld]
    innodb_buffer_pool_size=384M #это значение нужно подбирать исходя из размера innodb таблиц
    innodb_buffer_pool_instances=1 # По одному пункту на каждый Гб innodb_buffer_pool_size
    innodb_flush_log_at_trx_commit=2
    innodb_flush_method=O_DIRECT
    query_cache_type=1
    query_cache_size=16M
    query_cache_limit=4M
    key_buffer_size=256M
    join_buffer_size=2M
    sort_buffer_size=4M
    tmp_table_size=128M
    max_heap_table_size=128M
    thread_cache_size=4
    table_open_cache=2048
    max_allowed_packet=128M
    transaction-isolation=READ-COMMITTED
    performance_schema=OFF
    sql_mode=""
EOF

PHP-FPM

Ещё одна причина отказа от apache2 — использование php-fpm, наиболее быстрого режима работы php-интерпретатора. Наиболее производительной на текущей момент является php7.3, однако в официальном репозитории Debian 9 мы имеем php7. Из соображений связности с предыдущей статьей про производительность Битрикс тут мы тоже будем использовать php7 из репозитория Debian.

Ставим и конфигурируем php-fpm:

apt install php-fpm php-opcache php-mysqli php-gd php-curl php-xml php-mbstring php-json
cat <<-\EOF >/etc/mysql/mysql.conf.d/server.conf
    ;###Bitrix optimize
    date.timezone=Europe/Moscow
    short_open_tag=1
    max_input_vars=10000
    mbstring.func_overload=2 ;Этот пункт нужен если используется utf8
    mbstring.internal_encoding=utf-8 ;Этот пункт нужен если используется utf8
    upload_max_filesize=64M
    post_max_size=64M
    opcache.max_accelerated_files=100000
    realpath_cache_size=4096k
    memory_limit=512M
    pcre.jit=0
    opcache.revalidate_freq=0
EOF
cat <<-\EOF >/etc/php/7.0/fpm/php.ini
    [www]
    user = www-data
    group = www-data
    listen = 127.0.0.1:9000
    listen.allowed_clients = 127.0.0.1
    listen.owner = www-data
    listen.group = www-data
    pm = dynamic
    pm.max_children = 10
    pm.start_servers = 2
    pm.min_spare_servers = 2
    pm.max_spare_servers = 5
EOF

Governor

Этот пункт актуален только для выделенных серверов. Планировщик частоты процессора нужен для работы функций энергосбережения. Более низкие частоты процессора требуют меньше напряжения. В нашем случае потребности экономить электричество нет, потому нужно переключить планировщик в режим performance.

Настраиваем и применяем:

apt install cpufrequtils
echo 'GOVERNOR="performance"' > /etc/default/cpufrequtils
cpupower frequency-set --governor performance

Сравниваем производительность

Производительность получившейся конфигурации:

Производительность оптимизированной конфигурации

Производительность в окружении BitrixVM:

Производительность в окружении BitrixVM
Сравнение производительности Битрикс

Если вы оптимизировали сервер по инструкции, но производительность всё равно не устраивает — нужно провести диагностику нагрузки и решить, что вам требуется: 

1. Обратиться к разработчику для оптимизации кода

2. Найти дополнительные варианты оптимизации

Например, перенести сессии в оперативную память, настроить Nginx кеширование, заблокировать нежелательных ботов.

3. Добавить ресурсов сервера

Даже в случае с идеально написанным сайтом и не менее идеально оптимизированным сервером в какой то момент узким местом окажутся ресурсы.

Недостаток оперативной памяти не позволит полностью задействовать процессор, а избыток памяти при полностью загруженном работой процессоре не принесёт никакой пользы. Если узким местом оказывается пропускная способность сети — пришло время задуматься о переходе на выделенные серверы с гигабитным каналом.

Интересные статьи

Интересные статьи

Когда в Linux сервер базы данных непредвиденно завершает работу, нужно найти причину. Причин может быть несколько. Например, SIGSEGV — сбой из-за бага в бэкенд-сервере. Но это редкость. Чаще вс...
Лето, безусловно, классное время: жара, солнце, лёгкая одежда и обувь, фрукты и приятные вечера. Для большинства сфер бизнеса лето тоже имеет прикольное преимущество: на фоне спада делового сезон...
Вы никогда не думали о звуках, которые издает ваш компьютер, когда приходит сообщение, садится батарея или появляется напоминание о встрече? А вот Мэттью Беннетт думал. Много думал. Беннетт со...
Не так давно на Хабре появилась прекрасная статья Оптимизация сборки мусора в высоконагруженном .NET сервисе. Эта статья очень интересна тем, что авторы, вооружившись теорией сделали ранее невозм...
Основанная в 1998 году компания «Битрикс» заявила о себе в 2001 году, запустив первый в России интернет-магазин программного обеспечения Softkey.ru.