1 of 37

HIGHLOAD NGINX.

Практические примеры настройки и нагрузочное тестирование с Яндекс Танк.

Семинар, в котором мы рассмотрим,

как Nginx помогает backend приложению справляться с высокой нагрузкой.

20.06.23 г.

2 of 37

Здравствуйте!

Меня зовут Леонид Марков

Информация об авторе:

  • опыт администрирования Linux 2 года;
  • работаю Linux-администратором в платежной системе;
  • работал с различными системами автоматизации, мониторинга, логирования;
  • небольшой опыт менторства;
  • около 3-х лет занимался созданием и продвижением сайтов на CMS Битрикс;

Контакты:

Lmarkov.webmaster@gmail.com

2

3 of 37

Дорожная карта семинара

Цели семинара

  1. Познакомить слушателей с базовыми принципами оптимизации производительности Nginx для высоконагруженных приложений;
  2. Предоставить практические примеры настройки проксирования запросов, балансировки нагрузки, кэширование.

Целевая аудитория

  • начинающие системные администраторы, DevOps-инженеры;
  • разработчики веб-приложений;
  • тестировщики

- все, кто работают с веб-сервером Nginx или просто хотят узнать подробности о настройке Nginx под большие нагрузки.

  1. Введение

  • Обзор стенда

  • Нагрузка на Python App

  • Нагрузка на Nginx (базовый конфиг)

  • Тюнинг Nginx

  • Итоги

  • Материалы

  • Вопросы

~ 5 мин.

~ 15 мин.

~ 10 мин.

~ 10 мин.

~ 50 мин.

~ 10 мин.

~ 10 мин.

3

4 of 37

Раздел №1: Обзор стенда

5 of 37

Оборудование

Презентация

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

6 of 37

GitHub

Программный код стенда доступен на GitHub

https://github.com/LMarkovWeb/highload-nginx

6

7 of 37

Docker compose

Контейнеры:

  • Яндекс Танк. Нагрузочное тестирование.

tty: true # docker run -t

stdin_open: true # docker run -i

  • Nginx. Веб-сервер

  • GoAccess. Анализатор логов

  • App. Приложение на Python

7

8 of 37

Яндекс Танк

Подготовка

Зарегистрироватьсян на сайте 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

9 of 37

Приложение на Python

app.py

flask

(flask-restful, Blueprint, jsonify)

routes.py

маршрут на /fac/

utils.py

расчет факториала

9

10 of 37

Nginx

upstream app

server app1:5000;

server

proxy_pass http://app

10

11 of 37

GoAccess

https://goaccess.io/

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

12 of 37

Условия теста

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

13 of 37

Демонстрация проекта в VSCode

13

14 of 37

Запуск стенда

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

15 of 37

Постскри́птум

№1. Почему настраиваем Nginx, а не backend приложение?*

  1. тема семинара - Nginx

  • legacy приложение (нет ресурсов на рефакторинг)
  • Nginx специально создавался, чтобы быть быстрым
  • в Nginx многое уже есть из коробки + модули (https://www.nginx.com/resources/wiki/modules/index.html)
  • много справочных материалов по Nginx
  • балансировка**
  • ...

* Нужно запустить несколько инстансов приложения

** (k8s ingress controller - тоже Nginx)

№2. В нашем приложении реализован только один вид функционала

Получение ответа от бэкенда.

Есть еще важный аспект - отдача статического контента.

15

16 of 37

Рейтинг

16

17 of 37

Раздел №2: Нагружаем Python App

18 of 37

Запуск Яндекс Танка

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 of 37

График в консоле

19

20 of 37

Графики в веб-интерфейсе

20

21 of 37

Переходим к практике…

Фиксируем наши результаты, чтобы потом сравнить.

21

22 of 37

Раздел №3: Нагружаем Nginx

(basic config)

23 of 37

Практика

Нагрузка и просмотр отчетов:

Яндекс Танк

  • Консоль
  • Веб-интерфейс

Танк Nginx App

GoAccess

Просмотр логов в браузере

23

24 of 37

Процессы и соединения

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

25 of 37

Раздел №4: Тюнинг Nginx

26 of 37

Работа с файлом конфигурации

Главный конфигурационный файл - 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

27 of 37

Логирование

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

28 of 37

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

29 of 37

Кеширование

Модуль 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

30 of 37

Несколько экземпляров

Модуль 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

31 of 37

Раздел №5: Подводим итоги

32 of 37

Итоги тестирования

Логи выключены

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

33 of 37

Что можно дополнить?

  • Другой софт для тестирования

Попробовать использовать для тестов locust

  • Сделать все на виртуальных машинах
      • Снимать метрики с VM (CPU, RAM, процессы, сеть)
      • Снимать метрики с Nginx
      • Использовать Prometheus, Grafana, Zabbix
  • Работа с SSL

  • Реализовать работу со статическим контентом
  • Посмотреть директивы для работы со статикой (картинки и html/js/css/ файлы)
  • Работа с HTTP заголовками
  • Документация по HTTP (https://developer.mozilla.org/en-US/docs/Web/HTTP)
  • Анализ сетевого трафика между контейнерами Docker

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

34 of 37

Раздел №6: Материалы по Nginx

35 of 37

Ссылки

  1. Видео-курс (перевод на русский) по основам Nginx: https://youtu.be/dHsv8EnhSgQ

35

36 of 37

Полезные команды Nginx

Версия

nginx -v

Подробная информация о сборке

nginx -V

Информация об установленных модулях

nginx -V 2>&1|xargs -n1|grep module

Вывод всего конфигурационного файла на экран

nginx -T

Проверка конфигурационного файла

nginx -t

Перезагрузка конфигурационных файлов Nginx без остановки процесса

nginx -s reload

36

37 of 37

СПАСИБО ЗА ВНИМАНИЕ!�ОСТАЛИСЬ ВОПРОСЫ?

ibs-training.ru

vk.com/ibs_training_center