Оптимизация UMI.CMS под OS Debian на облачном сервере Clodo (требует доработки)
Требуемое ПО
Для работы CMS UMI под 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 и различных вариантов увеличения скорости работы было выявлено следующее:
- Apc и Xcache дают примерно одинаковую скорость работы
- Разница в скорости работы apache(prefork) и php-fpm минимальна. Поэтому если на сервере установлена только CMS Bitrix, то Php-fpm стоит ставить только, если требуется разграничение прав доступа для скриптов разных сайтов.
- Минимальный размер оперативной памяти 512M (запустить CMS UMI можно и на 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 unzip
Перенастраиваем отправку почты:
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/umi <<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 ~~* /(\.|install\.ini|install\.log|umi\.nginx\.conf|dbview\.php|config\.ini|classes|errors/logs|tpls|libs|sys-temp|umaps|usels|xsltTpls)$ {
deny all;
}
location /sitemap.xml {
rewrite ^ /sitemap.php last;
}
location /robots.txt {
rewrite ^ /sbots.php last;
}
location ~* ^\/?(udata|upage|uobject|ufs|usel|ulang|utype|umess|uhttp):?(\/\/)?(.*)$ {
rewrite ^ /releaseStreams.php?scheme=$1&path=$3?$args last;
}
location ~* ^(.*)\.xml$ {
rewrite ^ /index.php?xmlMode=force&path=$1&$args last;
}
location ~* ^(.*)\.json$ {
rewrite ^ /index.php?jsonMode=force&viewMode=full&path=$1&$args;
}
location / {
if ($is_args = '?') {
return 400;
}
if ($request_method = 'POST') {
return 400;
}
if ($cookie_umicms_session) {
return 400;
}
try_files $uri/index.html @backend;
root /var/www/htdocs/sys-temp/static-cache/$host;
}
location @backend {
rewrite ^ /index.php?path=$uri&$args;
}
location ~ \.php$ {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://apache;
}
}
EOF
ln -s /etc/nginx/sites-available/umi /etc/nginx/sites-enabled/umi
Выключаем ненужные модули 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/umi.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/umi.ini umi.ini; cd $pwd
После этого перезапускаем apache и nginx:
/etc/init.d/apache2 restart && /etc/init.d/nginx restart
Настройка базы данных:
cat >> /etc/mysql/conf.d/umi.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.umi-cms.ru/filemanager/download/83405/ -O /var/www/htdocs/umi.zip
unzip /var/www/htdocs/umi.zip -d /var/www/htdocs/
rm -f /var/www/htdocs/umi.zip
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-адрес публикации.