В статье посвящённой обратному проксированию в Nginx
мы с вами не коснулись одной важной темы — кэширования отдаваемого
upstream-серверами контента. Когда клиент выполняет запрос, например, к
PHP-сценарию, его обработкой занимается upstream-сервер. Работа сценария
часто связана с вызовом других сценариев, запросам к базам данных,
выполнении довольно тяжёлых в плане потребления ресурсов сервера
операций. И очень часто вся эта «каша» заваривается для того, чтобы
просто отдать клиенту сформированную страницу; т. е. следующий запрос к
этому же сценарию с теми же параметрами запустит ещё один процесс
обработки с точно такими же условиями и результатами. А что будет с
сервером, когда таких запросов будет несколько десятков в секунду?
Несколько сотен? На эти вопросы и на то, как с этим жить, имея в
распоряжении Nginx, попытаемся ответить в этой статье.

Следуя уже сложившейся в последнее время
в этом блоге традиции, я постараюсь построить заметку в виде небольшого
эксперимента, в ходе которого мы с вами будем наблюдать за
происходящим. Итак, поехали.
Исходные данные
В качестве PHP-сценария для проведения
тестов использовался небольшой скрипт, выбирающий все строки из таблицы
БД MySQL и выводящий результаты при помощи var_dump ():
Структура таблицы test1 БД следующая:
Таблица содержит 10000 записей, где в каждом поле name записан MD5-хеш случайного числа в диапазоне от 0 до time (). URL сценария, работающего под Apache — http://test.ashep:80/test.php. Давайте посмотрим при помощи siege как сервер будет обрабатывать запросы к этому сценарию.
Прямые запросы к Apache
Эмулируем 10 серий по 10 одновременных запросов:
Сервер успешно обработал все запросы, однако время на обработку каждого составило в среднем 10,3 секунд.
Проксирование через Nginx
Теперь создадим реверс-прокси сервер в Nginx так, как мы это делали в предыдущей статье, в качестве upstream-сервера будем использовать наш Apache по http://test.ashep:80.
Повторим тест, на этот раз уже через Nginx:
Результаты примерно те же. Логично,
поскольку Nginx всего лишь транслирует запросы к upstream-серверу,
ничего при этом не кэшируя.
Кэширующее проксирование через Nginx
И теперь самое интересное. Прежде, чем
можно будет оперировать кэшированием в настройках серверов Nginx, сперва
нужно определить место для хранения и параметры кэша Nginx. Кэшей в
Nginx можно определить больше одного, каждый с нужными вам параметрами и
затем использовать их в зависимости от ситуации в том или ином месте
конфигурации сервера.
Определять кэш можно лишь в контексте секции http, которая, например, в моём Debian описана в /etc/nginx/nginx.conf. Для определения кэша используется опция proxy_cache_path, которая имеет следующий формат:
В квадратных скобках приведены необязательные параметры. Теперь обо всём по порядку:
- path определяет место в файловой системе, где будет храниться кэш. Кэш в Nginx хранится в виде обычных файлов, каждый из которых хранит содержимое ответа на какой-то запрос. URL запроса хешируется в MD5 и полученная строка используется в качестве имени файла кэша, а также ключа, по которому Nginx будет отыскивать нужный фрагмент кэша;
- при помощи levels можно определить количество уровней вложенности каталогов с файлами кэша. Формат описания уровней может быть одним из: 'X', 'X:X' или 'X:X:X', что соответственно определяет один, два или три уровня вложенности каталогов. Каждая 'X' является единицей или двойкой и определяет количество символов в имени каталога соответствующего уровня;
- значением параметра keys_zone определяется имя кэша (zone_name), на которое можно ссылаться из других участков конфигурации сервера, а также её размер (zone_size);
- при помощи необязательного параметра inactive определяется время жизни объектов кэша, если к ним не было запросов. Т. е. если в течение указанного периода времени объект кэша ни разу не запрашивался — он подлежит удалению. Значение параметра inactive по умолчанию равно 10 минутам (10m);
- значение необязательного параметра max_size определяет размер кэша, больше которого ему не будет позволено «раздуваться».
В ходе моих экспериментов, рассматриваемых в этой заметке, я использовал следующее значение опции proxy_cache:
Приведённой выше строкой создаётся
двухуровневый кэш в каталоге /var/cache/nginx с именем 'default' и
размером 100 мегабайт. Теперь определённый кэш default можно
использовать в конфигурации серверов Nginx. Слегка дополненная
конфигурация сервера, приводившаяся выше:
Обратите внимание на две новых опции. При помощи параметра proxy_cache мы указываем Nginx какой кэш необходимо использовать при кэшировании данных от upstream-сервера, в данном случае — это 'default', определённый ранее в /etc/nginx/nginx.conf. Опция proxy_cache_valid
определяет время в течение которого не устаревшими будут считаться
объекты кэша, полученные полученные в результате ответов
upstream-сервера. Формат опции следующий:
1
|
proxy_cache_valid код_ответа [код_ответа код_ответа ...] время
|
Сохранив конфиг-файлы и перезапустив Nginx, попробуем провести нагрузочное тестирование с включённым кэшированием:
- adc-lj • 5 дней назад
- Alexander Shepetko • 5 дней назад
- adc-lj • 2 дня назад
- adc-lj • 2 дня назад
- Alexander Shepetko • день назад
- adc-lj • 2 дня назад
- Alexander Shepetko • день назад
- adc-lj • 2 дня назад
- Alexander Shepetko • день назад
- adc-lj • 4 дня назад
- Роман Жуков • 3 месяца назад
- Alexander Shepetko • 3 месяца назад
- Роман Жуков • 3 месяца назад
- Alexander Shepetko • 3 месяца назад
- BuxarNET • 7 месяцев назад
- Kor-Elf • 12 месяцев назад
- Константин • год назад
- /bin/user • год назад
- Qaz • год назад
- ashep • год назад
- /bin/user • год назад
- ashep • год назад
- Dmitry Paskal • год назад
- ashep • год назад
- Aleksdem • год назад
- Сергей. • год назад
- ashep • год назад
- Aleksdem • год назад
Комментариев нет:
Отправить комментарий