Upload
-
View
217
Download
4
Embed Size (px)
DESCRIPTION
Автор: Максим Овсянников, веб-разработчик компании "Центр Высоких Технологий". Советы по оптимизации и разработке высоконагруженных веб-проектов
Citation preview
Разработка и оптимизация
выcоконагруженного проекта
Максим Овсянников
Популярная Механика
• www.popmech.ru• Новостной сайт• До 450 тысяч просмотров в сутки• До 1000 просмотров в минуту
Перед началом разработки
• Собрать все требования и информацию• Сформировать видение системы
Подготовка окружения
• dev и demo сервера• Везде одинаковое окружение• Выкладка кода только через VCS• Обязательно использовать IDE
Выбор архитектуры
• Apache• nginx + php-fpm• memcached• сессии перенести в memcached или redis
Кеширование
• Не всегда можно использовать стандартный механизм автокеширования
• Нужно кешировать не только HTML вывод• Кешировать вспомогательные данные
Кеширование
Кеширование на nginx
fastcgi_temp_path /tmp/nginx/fastcgi_cache 1 2;
fastcgi_cache one;
fastcgi_cache_valid 200 301 302 304 5m;
fastcgi_cache_key "$request_method|$host|$request_uri";
fastcgi_ignore_headers "Cache-Control" "Expires";
fastcgi_no_cache $cookie_USER_AUTHORIZED;
fastcgi_cache_bypass $cookie_USER_AUTHORIZED;
Cтатика
• Кеширование статики на клиенте• Отдельная страница 404• Отключить логи
location ~* ^.+\.(ico|gif|jpeg|png...)$ { root /var/www/public_html; access_log off; expires max; error_page 404 = /404.html;}
Перед выкладкой
• Проверить конфигурацию инструментами Битрикса• Отключить модуль веб-аналитики
Поиск узких мест
• лог 50x ошибокerror_page 500 502 503 504 /50x.html;location = /50x.html { access_log /var/log/nginx/50x.error.log error50x; root /var/www/public_html;}
• логи медленных запросов PHP и mysqlslowlog = /var/log/nginx/fpm-slow.logrequest_slowlog_timeout = 10s
• логи ошибок PHPdisplay_errors = Off; log_errors = On; error_log
Профилирование c XHProf
• Почти не создает нагрузки в продакшене• Можно быстро найти корень проблемы• Подключениеauto_prepend_file = "/var/www/auto_prepend.php"auto_append_file = "/var/www/auto_append.php"
• либо через dbconn.php и событие OnAfterEpilog
В начале выполнения страницы
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
$GLOBALS["time_start"] = microtime(true);
В конце выполнения страницы
$time = microtime(true) - $GLOBALS["time_start"];$xhprof_data = xhprof_disable();$xhprofRootDirUtils = "/var/www/xhprof-0.9.4/xhprof_lib/utils/";include_once $xhprofRootDirUtils . "xhprof_lib.php";include_once $xhprofRootDirUtils . "xhprof_runs.php";
if ($time > 10) { $xhprof_runs = new XHProfRuns_Default(); $prof_file_name = "time_" . intval($time) . "s_" . preg_replace('/[^A-Za-z0-9_\-]/', '_', $_SERVER["REQUEST_URI"]);
$xhprof_runs->save_run($xhprof_data, $prof_file_name);}
Что еще оптимизировать?
• Подобрать время запуска фоновых задач• Тяжелые задания запускать когда посещаемость минимальная
New Relic (newrelic.com)
Выводы
• Все отслеживаем и записываем• Постоянный мониторинг состояния системы• Кеширование на нескольких уровнях• Связь сисадмин - разработчик
Спасибо за вниманиеВопросы?