Партнерская конференция «1С-Битрикс» «Не забивайте гвозди микроскопом!» Делаем скоростной frontend на nginx+Lua Александр Демидов «1С-Битрикс» Партнерская конференция 2015 #bitrixconf2015 Классика #bitrixconf2015 Партнерская конференция 2015 Волшебный proxy_pass Например: proxy_pass http://sqs.eu-west-1.amazonaws.com/...; #bitrixconf2015 Партнерская конференция 2015 Проверка доступности #bitrixconf2015 Партнерская конференция 2015 На «чистом» nginx – не получилось… • Нельзя использовать вместе proxy_pass и return • Не получалось переписать ответ на проксируемый запрос • Добавили PHP-FPM как бэкенд • И написали простой скрипт в несколько строк на PHP Итог: • Расход памяти • Блокирующие запросы #bitrixconf2015 Партнерская конференция 2015 Партнерская конференция 2015 Скорость сайтов • Какой сайт считается быстрым? • Быстро генерируется, минимальное число запросов к базе, быстро скачивается страница… • Есть только один критерий с точки зрения клиента - насколько быстро отображается сайт. #bitrixconf2015 Что считать? Navigation Timing API #bitrixconf2015 Партнерская конференция 2015 Сколько? • Собираем метрики в Javascript • Потенциально – десятки тысяч сайтов • 500-1500-… запросов на вставку в секунду • Десятки миллионов хитов в день • Последние N-хитов • Гистограмма распределения, онлайн #bitrixconf2015 Партнерская конференция 2015 Сколько? • Собираем метрики в Javascript • Потенциально – десятки тысяч сайтов • 500-1500-… запросов на вставку в секунду • Десятки миллионов хитов в день • Последние N-хитов • Гистограмма распределения, онлайн #bitrixconf2015 Партнерская конференция 2015 Куда писать? #bitrixconf2015 Партнерская конференция 2015 Требования • Напоминаем - 500-1500-… запросов на вставку в секунду, должны быть неблокирующими • Сложная логика проверки и выставления кук • Принимать и POST, и GET – передавать только POST • Авторизация в Amazon Web Services, v. 4 • В ответ клиенту – валидный Javascript #bitrixconf2015 Партнерская конференция 2015 Nginx? Nginx! Партнерская конференция 2015 Варианты: • «Чистый» nginx – невозможно реализовать всю логику • Nginx + бэкенд (PHP) – низкая производительность, расход ресурсов • Nginx + свой модуль (С/C++) – сложно, долго разрабатывать и тестировать • Nginx + ngx_http_perl_module – блокирующий, «модуль экспериментальный, поэтому возможно всё» • Nginx + ngx_lua - … #bitrixconf2015 Почему Lua? • Что-то новое и простое #bitrixconf2015 Партнерская конференция 2015 Почему Lua? • Очень легкий • Очень быстрый (LuaJIT) • Очень гибкий: • доступ к HTTP запросу и ответу • синхронные неблокирующие подзапросы (ngx.location.capture, connect) • дополнительные модули • разные фазы (rewrite, content, log и т.д.) #bitrixconf2015 Партнерская конференция 2015 Прокси в Kinesis Партнерская конференция 2015 http { lua_package_cpath "/usr/lib64/crypto.so;;"; server { location /bx_stat { lua_need_request_body on; rewrite_by_lua ‘ local data = "" if ngx.var.request_method == "POST" then data = ngx.req.get_body_data() else data = ngx.var.query_string; ngx.req.set_uri_args(""); end ... local crypto = require "crypto" local kDate = crypto.hmac.digest("sha256", date_short, "AWS4" .. secret_key, true) ... ngx.req.set_header("x-amz-date", date_long) ngx.req.set_header("Authorization", "AWS4-HMAC-SHA256 Credential= ... ‘; proxy_set_header Host kinesis.eu-west-1.amazonaws.com; proxy_pass https://kinesis.eu-west-1.amazonaws.com/; #bitrixconf2015 Нюансы настройки nginx worker_processes 4; events { worker_connections } 10240; worker_rlimit_nofile 100000; proxy_hide_header proxy_hide_header proxy_hide_header proxy_hide_header Access-Control-Expose-Headers; x-amz-id-2; x-amzn-RequestId; Content-Type; proxy_method POST; #bitrixconf2015 Партнерская конференция 2015 Сеть /etc/sysctl.conf (man sysctl) # диапазон портов исходящих коннектов net.ipv4.ip_local_port_range=1024 65535 # повторное использование TIME_WAIT сокетов net.ipv4.tcp_tw_reuse=1 # быстрая утилизация TIME_WAIT сокетов net.ipv4.tcp_tw_recycle=1 # время пребывания сокета в FIN_WAIT_2 net.ipv4.tcp_fin_timeout=15 # размер таблиц файрволла net.netfilter.nf_conntrack_max=1048576 # длина очереди входящих пакетов на интерфейсе net.core.netdev_max_backlog=50000 # количество возможных подключений к сокету net.core.somaxconn=81920 # не посылать syncookies на SYN запросы net.ipv4.tcp_syncookies=0 #bitrixconf2015 Партнерская конференция 2015 Что получилось? #bitrixconf2015 Партнерская конференция 2015 Характеристики системы #bitrixconf2015 Партнерская конференция 2015 Летим и… спотыкаемся • Ошибки "connect() to [...] failed (99: Cannot assign requested address) while connecting to upstream« • Огромное количество TIME_WAIT #bitrixconf2015 Партнерская конференция 2015 «Волшебная пилюля» Партнерская конференция 2015 upstream kinesis { server kinesis.eu-west-1.amazonaws.com:443 max_fails=0 fail_timeout=10s; keepalive 1024; } proxy_pass https://kinesis/; proxy_http_version 1.1; proxy_set_header Connection ""; #bitrixconf2015 Новая задача – ускорение «Битрикс24» #bitrixconf2015 Партнерская конференция 2015 «Веб-акселератор» Партнерская конференция 2015 • Поддержка SPDY для клиентов • SSL keep alive на бэкенды • Раздельный кэш для общей статики /bitrix/.*.(css|js|png|…), пользовательской статики, композитных хитов • Вся логика исключений для композита • Через header_filter_by_lua – удаление кэша (высчитываем путь к файлам, удаляем через Lua os.remove) #bitrixconf2015 Новая задача – ускорение «Битрикс24» #bitrixconf2015 Партнерская конференция 2015 Резюме Партнерская конференция 2015 «Скорость сайтов» - 1 виртуальный сервер (2 ядра, 4 Гб RAM) • 55+ млн. хитов в сутки «Веб-акселератор» «Битрикс24» - физический сервер (быстрые SSD диски для большого объема кэша) • 55+ млн. хитов в сутки Сложная логика бэкенда (обработка запросов, коннекты к внешним сервисам, работа с кэшем) – прямо на фронтенде http://nginx.org/ru/docs/ http://wiki.nginx.org/HttpLuaModule http://www.lua.ru/doc/ #bitrixconf2015 Спасибо за внимание! Вопросы? Александр Демидов [email protected] +7-926-521-3700 @demidov http://www.1c-bitrix.ru