Оптимизация Bitrix под OS Debian на облачном сервере Clodo
Требуемое ПО
Для работы CMS Bitrix под OS Linux необходимо следующее ПО:
- Веб-сервер (apache/nginx/lighttpd);
- Интерпретатор Php >= 5.2 (mod_php/php-cgi/php-fpm)
- Сервер баз данных MySQL (mariadb,mysql,percona) с поддержкой InnoDB
Для работы CMS Bitrix под OS Linux желательно следующее ПО:
- Акселератор Php (zendoptimizer/zendoptimizer+/apc/eaccelerator/xcache), возможно использование memcache
Лирическое отступление про различные связки ПО и скорость работы
В ходе тестов на наших облачных серверах было выявленно, что максимальная производительность достигается в связке lighttpd+mysql+php-fcgi(zend server ce)+zendoptimizer+ либо nginx+apache+mysql+mod_php(zend server ce)+zendoptimizer+. Для хранения сессий используется файловая система tmpfs. Касаемо различных акселераторов Php и различных вариантов увеличения скорости работы было выявлено следующее:
- Использование в качестве ускорения работы CMS Bitrix memcache не давало прироста в скорости, а зачастую только снижало быстродействие
- Apc и Xcache дают примерно одинаковую скорость работы
- Разница в скорости работы apache(prefork) и php-fpm минимальна. Поэтому если на сервере установлена только CMS Bitrix, то Php-fpm стоит ставить только, если требуется разграничение прав доступа для скриптов разных сайтов.
- Минимальный размер оперативной памяти 512M (запустить CMS Bitrix можно и на 256, но производительность под нагрузкой оставляют желать лучшего)
- Размер памяти, требуемый для Apc/Xcache для демо сайта не менее 32M
- ZendOptimizer+ падает при попытке использования его с любым Php, отличным от Zend Server.
- Шейпер дисковых операций отключен (при наличии достаточного объема оперативной памяти не оказывает никакого влияния)
- Для MySQL и Php используется tcmalloc
Установка и настройка необходимого ПО
Добавляем необходимые gpg ключи:
wget http://repos.zend.com/zend.key -O - | apt-key add -
Добавляем требуемые репозитории:
echo "deb http://repos.zend.com/zend-server/deb server non-free" >> /etc/apt/sources.list.d/zend.list
Обновляем списки пакетов:
apt-get update
Устанавливаем необходимое ПО:
for i in zip zem xsl sockets optimizer-plus mysql mcrypt mbstring json gd ftp fileinfo exif curl ctype bz2 bin bcmath;
do
apt-get -y install "php-5.3-${i}-zend-server"
done
Создаем файл с переменными окружения, которые использует Zend Server CE:
cat >> /etc/profile.d/zend.sh <<EOF
export PATH=$PATH:/usr/local/zend/bin
EOF
Подгружаем новые переменные окружения в текущий shell:
source /etc/profile
Продолжаем установку ПО:
apt-get -y install exim4-daemon-light nginx-full mysql-server
Перенастраиваем отправку почты:
dpkg-reconfigure exim4-config
В файле /etc/default/exim4 нужно поменять значение QUEUERUNNER с combined на queueonly если данный сервер не должен принимать входящую почту.
Также стоит скорректировать время обхода очереди поменяв параметр QUEUEINTERVAL с 30m на 1m (обход очереди раз в минуту)
/etc/init.d/exim4 restart
Создаем директорию для будущего сайта:
mkdir -p /var/www/htdocs
Создаем виртуальный сервер для nginx:
cat >> /etc/nginx/sites-available/bitrix <<EOF
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
directio 4m;
max_ranges 4;
open_file_cache max=60000 inactive=60s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
postpone_output 512;
reset_timedout_connection on;
sendfile_max_chunk 2M;
underscores_in_headers on;
upstream apache {
server 127.0.0.1:8080;
keepalive 32;
}
server {
listen 80 default_server backlog=1024 deferred ;
root /var/www/htdocs;
index index.php;
server_name localhost _ "";
server_name_in_redirect off;
proxy_redirect http://apache:8080 http://$host:80;
client_max_body_size 120m;
client_body_buffer_size 4M;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
try_files $uri @backend;
expires max;
}
location / {
try_files $uri $uri/ @backend;
}
location ~ \.php$ {
try_files $uri @backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://apache;
}
location @backend {
rewrite ^(.*)$ /bitrix/urlrewrite.php last;
}
location ^~ /bitrix/admin/ {
try_files $uri @backend_admin;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://apache;
}
location @backend_admin {
rewrite ^(.*)$ /bitrix/admin/404.php last;
}
location = /favicon.ico {
log_not_found off;
}
location = /robots.txt {
log_not_found off;
}
location ~ (/\.|/bitrix/modules|/upload/support/not_image|/bitrix/php_interface) {
deny all;
}
}
EOF
ln -s /etc/nginx/sites-available/bitrix /etc/nginx/sites-enabled/bitrix
Выключаем ненужные модули apache
a2dismod autoindex cgi deflate env negotiation reqtimeout setenvif
Создаем виртуальный сервер для apache
<VirtualHost 127.0.0.1:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/htdocs
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/htdocs>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Редактируем /etc/apache2/ports.conf меняя строки
NameVirtualHost *:80
Listen 80
на
NameVirtualHost 127.0.0.1:8080
Listen 127.0.0.1:8080
Редактируем /etc/apache2/apache2.conf меняя блок
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
на
<IfModule mpm_prefork_module>
StartServers 34
MinSpareServers 34
MaxSpareServers 34
MaxClients 34
MaxRequestsPerChild 0
</IfModule>
Редактируем параметры Php:
sed -i 's|zend_extension_manager.recheck_license_interval=5|zend_extension_manager.recheck_license_interval=0|g' /usr/local/zend/etc/ext.d/extension_manager.ini
echo "mbstring.func_overload=2" >> /usr/local/zend/etc/ext.d/mbstring.ini
echo "mbstring.internal_encoding=UTF-8" >> /usr/local/zend/etc/ext.d/mbstring.ini
cat >> /usr/local/zend/etc/ext.d/bitrix.ini <<EOF
display_errors = on
log_errors = STDERR
memory_limit = 128M
realpath_cache_size = 4096k
allow_call_time_pass_reference = on
upload_max_filesize = 32M
post_max_size = 32M
precision = 10
y2k_compliance = off
session.entropy_file = /dev/urandom
session.entropy_length = 512
session.save_path = /tmp
date.timezone = Europe/Moscow
EOF
sed -i 's|zend_optimizerplus.revalidate_path=0|zend_optimizerplus.revalidate_path=1|g' /usr/local/zend/etc/ext.d/optimizerplus.ini
sed -i 's|zend_optimizerplus.dups_fix=0|zend_optimizerplus.dups_fix=1|g' /usr/local/zend/etc/ext.d/optimizerplus.ini
sed -i 's|zend_optimizerplus.memory_consumption=(.*)|zend_optimizerplus.memory_consumption=32|g' /usr/local/zend/etc/ext.d/optimizerplus.ini
sed -i 's|zend_optimizerplus.max_accelerated_files=(.*)|zend_optimizerplus.max_accelerated_files=60000|g' /usr/local/zend/etc/ext.d/optimizerplus.ini
cat >> /usr/local/zend/etc/ext.d/optimizerplus.ini <<EOF
zend_optimizerplus.save_comments=0
EOF
cwd=`pwd` ; cd /usr/local/zend/etc/conf.d && ln -s ../ext.d/bitrix.ini bitrix.ini; cd $pwd
После этого перезапускаем apache и nginx:
/etc/init.d/apache2 restart && /etc/init.d/nginx restart
Настройка базы данных:
cat >> /etc/mysql/conf.d/bitrix.cnf <<EOF
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = -5
[mysqld]
skip-external-locking
bind-address = 127.0.0.1
max_connections = 34
max_user_connections = 32
connect_timeout = 20
wait_timeout = 60
max_allowed_packet = 4M
thread_cache_size = 128
sort_buffer_size = 4M
bulk_insert_buffer_size = 6M
tmp_table_size = 6M
max_heap_table_size = 6M
table_cache = 1000
myisam_recover = BACKUP
key_buffer_size = 2M
myisam_sort_buffer_size = 1M
concurrent_insert = 2
read_buffer_size = 4M
read_rnd_buffer_size = 2M
query_cache_limit = 4M
query_cache_size = 24M
query_cache_type = 1
default_storage_engine = InnoDB
innodb_log_buffer_size = 80M
innodb_file_per_table = 1
innodb_open_files = 1000
innodb_buffer_pool_size=24M
thread_concurrency=6
thread_cache = 16
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
join_buffer_size=2M
transaction-isolation=READ-COMMITTED
skip_name_resolve
skip_networking
EOF
Скачиваем установщик CMS Bitrix
wget http://www.1c-bitrix.ru/download/scripts/bitrixsetup.php -O /var/www/htdocs/bitrixsetup.php
chown -R www-data /var/www/
После установки необходимо включить кеширование в Apc:
cat >> /var/www/htdocs/bitrix/php_interface/dbconn.php <<EOF
<?php
define("BX_CACHE_TYPE", "apc");
define("BX_CACHE_SID", $_SERVER["DOCUMENT_ROOT"]."#01");
?>
EOF
Также стоит указать сравнение:
cat >> /var/www/htdocs/bitrix/php_interface/after_connect.php <<EOF
$DB->Query('SET collation_connection = "utf8_unicode_ci"');
EOF
Настройки модулей:
- Проактивная защита - удален
- Компрессия - удален
- Реклама/баннеры - удален
- Автокеширование - HTML кеш - включен
Настройки сети:
cat >> /etc/sysctl.d/bitrix.conf <<EOF
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_recycle = 1
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.all.forwarding=0
net.ipv4.conf.all.mc_forwarding=0
net.ipv4.tcp_tw_reuse=1
EOF
Результаты тестов производительности
nginx+apache2+mysql+mod_php(zend server ce)+zendoptimizer+
Условия использования документа
Материал представленный на данной странице может быть использован Вами по своему усмотрению. Разрешается копирование и распространение предоставленного материала без изменения содержания и без предварительного уведомления администрации Clodo.ru.
Мы будем признательны Вам за сообщения об ошибках в представленной документации и за предложения об улучшении документации. По этим вопросам необходимо обращаться по адресу mail@clodo.ru. При обращении не забывайте указывать URL-адрес публикации.