HIGHLOAD NGINX.
Практические примеры настройки и нагрузочное тестирование с Яндекс Танк.
Семинар, в котором мы рассмотрим,
как Nginx помогает backend приложению справляться с высокой нагрузкой.
20.06.23 г.
Здравствуйте!
Меня зовут Леонид Марков
Информация об авторе:
Контакты:
Lmarkov.webmaster@gmail.com
2
Дорожная карта семинара
Цели семинара
Целевая аудитория
- все, кто работают с веб-сервером Nginx или просто хотят узнать подробности о настройке Nginx под большие нагрузки.
| ~ 5 мин. ~ 15 мин. ~ 10 мин. ~ 10 мин. ~ 50 мин. ~ 10 мин. ~ 10 мин. |
Запись вебинара: https://www.youtube.com/@IBSTrainingCenter/videos
3
Раздел №1: Обзор стенда
Оборудование
Презентация
Macbook Air M1
iterm. ssh
Microsoft Remote Desktop / SSH-FS
Visual Studio Code (ssh)
Стенд
Lenovo ThinkPad L15 Gen 1
AMD Ryzen 7 PRO 4750U
CPU(s): 16
Core(s) per socket: 8
Thread(s) per core: 2
RAM 16 Gb
OS Ubuntu 20
5
GitHub
6
Docker compose
Контейнеры:
tty: true # docker run -t
stdin_open: true # docker run -i
7
Яндекс Танк
Подготовка
Зарегистрироватьсян на сайте https://overload.yandex.net/.
Получить api token.
Настройка
load_app.yaml
load_nginx.yaml
Запуск
docker exec -ti tank yandex-tank -c load_*.yaml
Просмотр отчета
Веб версия отчета доступна в личном кабинете https://overload.yandex.net/
8
Приложение на Python
app.py
flask
(flask-restful, Blueprint, jsonify)
routes.py
маршрут на /fac/
utils.py
расчет факториала
9
Nginx
upstream app
server app1:5000;
server
proxy_pass http://app
10
GoAccess
What is it?
GoAccess is an open source real-time web log analyzer and interactive viewer that runs in a terminal in *nix systems or through your browser.
Как он может пригодиться?
11
Условия теста
App schedule: step(100, 1000, 100, 5)
Nginx schedule: step(400, 4000, 100, 5)
autostop:
- net(110,10,5)
- net(99,10,5)
- net(104,10,5)
- http(5xx,10,5)
12
Демонстрация проекта в VSCode
13
Запуск стенда
Makefile
start
stop
re
logs
tank-nginx
tank-app
docker compose
docker compose up -d
docker exec -ti tank yandex-tank -c load_nginx.yaml
docker exec -ti tank yandex-tank -c load_app.yaml
...
14
Постскри́птум
№1. Почему настраиваем Nginx, а не backend приложение?*
* Нужно запустить несколько инстансов приложения
** (k8s ingress controller - тоже Nginx)
№2. В нашем приложении реализован только один вид функционала
Получение ответа от бэкенда.
Есть еще важный аспект - отдача статического контента.
15
Рейтинг
16
Раздел №2: Нагружаем Python App
Запуск Яндекс Танка
make tank-app
docker exec -ti tank yandex-tank -c load_app.yaml
Нам доступно два графика
На что обратить внимание:
1. Net коды
110 (Connection timed out)
99 (Cannot assign requested address)
104 (Connection reset by peer)
2. Actual responses
3. Autostop
18
График в консоле
19
Графики в веб-интерфейсе
20
Переходим к практике…
Фиксируем наши результаты, чтобы потом сравнить.
21
Раздел №3: Нагружаем Nginx
(basic config)
Практика
Нагрузка и просмотр отчетов:
Яндекс Танк
Танк Nginx App
GoAccess
Просмотр логов в браузере
23
Процессы и соединения
worker_processes auto;
default - 1
auto - определяет само.
Команда Linux: nproc
worker_connections 1024;
default - 512
Число соединений на один процесс.
Команда Linux: ulimit -n
(hard limit и soft limit. Разные значение на Host OS и Docker container. Подробнее: stackoverflow)
http://nginx.org/ru/docs/ngx_core_module.html#worker_processes
http://nginx.org/ru/docs/ngx_core_module.html#worker_connections
24
Раздел №4: Тюнинг Nginx
Работа с файлом конфигурации
Главный конфигурационный файл - nginx.conf
Находит в папке /etc/nginx
Операционная система nginx контейнера - Debian
docker-exec -ti nginx /bin/bash
apt update && apt install vim -y
cd /etc/nginx
vim nginx.conf
nginx -s reload
Дополнительные конфиг. файлы в папке
/etc/nginx/conf.d
26
Логирование
access_log off;
error_log /var/log/nginx/error.log crit;
Выключение лога ошибок:
error_log /dev/null emerg;
Подробнее: https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#error_log-off
Выключать логи не рекомендуется.
http://nginx.org/ru/docs/http/ngx_http_log_module.html
27
upstream keepalive
upstream app {
…
keepalive 16;
}
location /fac {
…
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
Linux command: ss
https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives
28
Кеширование
Модуль proxy_cache
http://nginx.org/ru/docs/http/ngx_http_proxy_module.html
proxy_cache my_cache;
proxy_cache_valid 200 2s;
В файл:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:5m max_size=20m inactive=10m;
# keys_zone=my_cache:5m - название зоны в RAM для хранения ключей и ее размер
# max_size=20m - максимальный размер кеша
# inactive=10m; - время неактивности, после которого кеш будет удален
В оперативную память: tmps / memcache
context: http, server, location
context: http
29
Несколько экземпляров
Модуль ngx_http_upstream_module
upstream app {
server app1:5000;
server app2:5000;
server app3:5000;
}
Контекст: http
http://nginx.org/ru/docs/http/ngx_http_upstream_module.html
30
Раздел №5: Подводим итоги
Итоги тестирования
Логи выключены
Upstream keepalive
Default Nginx Conf.
Python App
Cache
Upstream (app1, app2, app3)
1 | Planned request: 900 Actual responses: 705 |
2 | Planned request: 900 Actual responses: 633 |
3 | Planned request: 1000 Actual responses: 677 |
1 | Planned request: 1000 Actual responses: 668 |
2 | Planned request: 900 Actual responses: 663 |
3 | Planned request: 900 Actual responses: 636 |
1 | Planned request: 1000 Actual responses: 629 |
2 | Planned requests: 1000 Actual responses: 660 |
3 | Planned requests: 1000 Actual responses: 649 |
1 | Planned request: 1000 Actual responses: 614 |
2 | Planned requests: 1000 Actual responses: 664 |
3 | Planned requests: 900 Actual responses: 649 |
1 | Planned request: 4000 Actual responses: 2217 |
1 | Planned request: 4000 Actual responses: 1066 |
2 | Planned request: 4000 Actual responses: 1042 |
3 | Planned request: 3200 Actual responses: 1161 |
32
Что можно дополнить?
Попробовать использовать для тестов locust
Netshoot https://github.com/nicolaka/netshoot.
VirtualBox + vagrant
sendfile on; gzip on; open_file_cache_*
keepalive_timeout
http3 (QUIC - Quick UDP Internet Connections)
Попрактиковаться с cURL
tcpdump (файл pcap) + wireshark
33
Раздел №6: Материалы по Nginx
Ссылки
35
Полезные команды Nginx
Версия
nginx -v
Подробная информация о сборке
nginx -V
Информация об установленных модулях
nginx -V 2>&1|xargs -n1|grep module
Вывод всего конфигурационного файла на экран
nginx -T
Проверка конфигурационного файла
nginx -t
Перезагрузка конфигурационных файлов Nginx без остановки процесса
nginx -s reload
36
СПАСИБО ЗА ВНИМАНИЕ!�ОСТАЛИСЬ ВОПРОСЫ?
ibs-training.ru
vk.com/ibs_training_center