Шаблон NGINX под UMI.CMS для хостинг-панели VestaCP
Ожидает приглашения



Добрый день!
Совсем вводная для быстрого понимания о чем статья.
- Медленная работа сайта на UMI.CMS
- Адаптация рекомендаций разработчиков движка под хостинг-панель VestaCP / Создание кастомных шаблонов виртуальных хостов NGINX
Вводная
Вообще мы пишем сайты и приложения на Yii Framework, но у одного из клиентов есть действующий сайт на UMI.CMS.
Клиент обратился к нам с проблемой крайне медленной работы сайта.
Получив доступы, мы узнали что:
- используется VPS от fastvps
- виртуализация OpenVZ
- 2 ядра
- 800 Mb Ram
- 8 Gb HDD
- Debian
Сервер настроен абы как, с использованием webmin.
Даже при включенном в UMI использовании APC (который был установлен, иначе его не выбрать) и статическом кешировании (файловая система) генерация главной страницы занимала 10-12 сек, самой большой страницы (>130 объектов с графикой) около 30 сек.
Что сделали
- зарегистрировали для клиента аккаунт на DigitialOcean
- создали дроплет, схожий по конфигурации (1Gb RAM, 1 CPU, 30 GB HDD) в ДЦ в Амстердаме
- поставили CentOS 6.5 x64 и VestaCP
Нам это дало:
- SSD диски
- меньше пинг до сервера (fastvps реселлер hetzner, серверы в Германии)
- Простое и понятное управление аккаунтами, доменами, сайтами и прочим, что могло бы понадобиться. При этом мы получили возможность кастомизации настроек под наши нужды
Далее создали аккаунт, отличный от админа. Перенесели туда сайт (шаблоны apache и nginx — default)
Запустили сайт
Примечание
Так как UMI.CMS привязывается к домену и использует активационный ключ, то, что бы не обращаться в саппорт и не иметь проблем с ключами, домен в VestaCP указали «боевой» и на локальном хосте админ в /etc/hosts прописал IP и «боевой» домен сайта
Далее стали гуглить на тему оптимизации работы UMI.CMS
Оказалось, что данный движок умеет из коробки хорошо интегрироваться с NGINX по части кеширования, но для этого надо по их рекомендациям настроить виртуальный хост.
тут статья из wiki на сайте движка.
Так как создавать хардкодом настройки не путь джедая, то решили сделать шаблон Vesta для данного движка с учетом рекомендаций.
Пошагово:
- Копируем дефолтные шаблоны nginx в отдельные файлы
cp /usr/local/vesta/data/templates/web/nginx/default.tpl /usr/local/vesta/data/templates/web/nginx/umi-cms.tpl cp /usr/local/vesta/data/templates/web/nginx/default.stpl /usr/local/vesta/data/templates/web/nginx/umi-cms.stpl
- Открываем данные файлы и заменяем их содержимое на
/usr/local/vesta/data/templates/web/nginx/umi-cms.tpl
server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; error_log /var/log/httpd/domains/%domain%.error.log error; access_log /var/log/httpd/domains/%domain%.log combined; access_log /var/log/httpd/domains/%domain%.bytes bytes; location / { error_page 412 = @fallback; if ($request_method = 'POST') { return 412; } if ($is_args = '?') { return 412; } if ($cookie_umicms_session) { return 412; } try_files $uri/index.html @fallback; root %docroot/cache/$host; # (3) Путь до каталога закэшированных файлов index index.php; } location /error/ { alias %home%/%user%/web/%domain%/document_errors/; } location @fallback { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://%ip%:%web_port%; } location ~* ^/admin { error_page 412 = @fallback; return 412; } location ~* \.php$ { error_page 412 = @fallback; return 412; } location ~* ^.+\.(%proxy_extentions%)$ { root %docroot%; expires max; access_log off; } location ~ /\.ht {return 404;} location ~ /\.svn/ {return 404;} location ~ /\.git/ {return 404;} location ~ /\.hg/ {return 404;} location ~ /\.bzr/ {return 404;} include %home%/%user%/conf/web/nginx.%domain%.conf*; }
/usr/local/vesta/data/templates/web/nginx/umi-cms.stpl
server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; ssl on; ssl_certificate %ssl_pem%; ssl_certificate_key %ssl_key%; error_log /var/log/httpd/domains/%domain%.error.log error; access_log /var/log/httpd/domains/%domain%.log combined; access_log /var/log/httpd/domains/%domain%.bytes bytes; location / { error_page 412 = @fallback; if ($request_method = 'POST') { return 412; } if ($is_args = '?') { return 412; } if ($cookie_umicms_session) { return 412; } try_files $uri/index.html @fallback; root %sdocroot%/cache/$host; # (3) Путь до каталога закэшированных файлов index index.php; } location /error/ { alias %home%/%user%/web/%domain%/document_errors/; } location @fallback { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://%ip%:%web_ssl_port%; } location ~* ^/admin { error_page 412 = @fallback; return 412; } location ~* \.php$ { error_page 412 = @fallback; return 412; } location ~* ^.+\.(%proxy_extentions%)$ { root %sdocroot%; expires max; access_log off; } location ~ /\.ht {return 404;} location ~ /\.svn/ {return 404;} location ~ /\.git/ {return 404;} location ~ /\.hg/ {return 404;} location ~ /\.bzr/ {return 404;} include %home%/%user%/conf/web/snginx.%domain%.conf*; }
Конфиги уже проверены в работе и являются готовыми к использованию. При необходимости вы свободны в адаптации под свои нужды. - в основном конфиг-файле движка config.ini меняем
[includes] system.static-cache = указать тот же путь, что и в пункте (3) конфигурационного файла nginx [cache] static.enabled = "1" static.mode = "nginx"
Обращаю внимание, что надо не забыть создать каталог для кеша, если его не было (у нас использовался иной каталог) или прописать в шаблоне тот же каталог, что и в config.ini (мы решили все таки вынести в отдельный). - все сохранить и перезапустить NGINX (предварительно проверить не сделали ли где опечатку или ошибку nginx -t)
- в ПУ VestaCP для хоста поменять шаблон NGINX на umi-cms
- из ПУ VestaCP для пользователя сделать «Пересоздать WEB»
Проверяем работу сайта
все ок — сайт открывается, админка тоже.
Замеряем скорость генерации страницы — около 0,3 сек после создания кеша (то есть после второго открытия страницы)
Дополнительно
Для общей оптимизации также поставили memcached (не забыть в /etc/sysconfig/memcached прописать OPTIONS="-l 127.0.0.1", если конечно не используется другими серверами).
Наш вариант:
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="256"
OPTIONS="-l 127.0.0.1"
В админке UMI.CMS поменяли APC на Memcached.
Ну и немного общего тюннинга по части MySQL, PHP. В код сайта не стали лезть, так как не спецы в этом движке — только lazy load добавили и все.
При посещаемости около 1000 уников в день, потребление RAM не превышает 500-550 Mb, swap не используется.
В итоге получен шаблон для данного движка, позволяющий использовать статическое кеширование на полную мощность и реально увеличивающее скорость сайта для конечного посетителя (UMI перегенерит кеш при изменении контента, поэтому тут нет смысла переживать, что добавление новых и редактирование старых материалов не будет во время отображаться на сайте)
Надеюсь, что материал окажется полезен для пользователей VestaCP и UMI.CMS
Спасибо!
P. S. Ссылки на использованные материалы и платформы
VestaCP — OpenSource хостинг-панель, простая и легкая.
Кеширование через NGINX в UMI.CMS.