Использование nginx для имитации медленного времени отклика для целей тестирования
Я разрабатываю приложение Facebook canvas, и я хочу загрузить его. Я знаю об ограничении facebook на автоматическое тестирование, поэтому я смоделировал вызовы API graph, создав поддельное веб-приложение, обслуживаемое под nginx и изменив мои/etc / hosts, чтобы указать graph.facebook.com до 127.0.0.1.
Я использую jmeter для нагрузочного тестирования приложения, и моделирование работает нормально. Теперь я хочу смоделировать медленные ответы api graph и посмотреть, как они влияют на мое приложение. Как я могу настройте nginx так, чтобы он вставлял задержку в каждый запрос, отправленный моделируемому graph.facebook.com заявление?
3 ответов
вы можете замедлить скорость localhost (сети), добавив задержку.
Использовать ifconfig
команда для просмотра сетевого устройства: на localhost это может быть lo
и на LAN его eth0
.
-
чтобы добавить задержку, используйте эту команду (добавление задержки 1000 мс на
lo
сетевые устройства)tc qdisc add dev lo root netem delay 1000ms
-
для изменения задержки используйте этот
tc qdisc change dev lo root netem delay 1ms
-
и удалить задержку
tc qdisc del dev lo root netem delay 1000ms
мой предыдущий ответ работает, но он более адаптирован к случаю, когда все запросы должны быть замедлены. С тех пор мне пришлось придумать решение, которое позволило бы мне включить ограничение скорости только в каждом конкретном случае, и придумать следующую конфигурацию. Обязательно прочитайте весь ответ, прежде чем использовать это, потому что есть важные нюансы, которые нужно знать.
location / {
if (-f somewhere/sensible/LIMIT) {
echo_sleep 1;
# Yes, we need this here too.
echo_exec /proxy$request_uri;
}
echo_exec /proxy$request_uri;
}
location /proxy/ {
internal;
# Ultimately, all this goes to a Django server.
proxy_pass http://django/;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}
важное примечание: наличие или отсутствие косых черт в различных путях изменить ситуацию. например, proxy_pass http://django
, без косой черты, делает не сделайте то же самое, что и строка в коде выше.
принцип работы прост. Если файл somewhere/sensible/LIMIT
существует, затем запрашивает совпадение location /
приостановлены на одну секунду, прежде чем двигаться дальше. Поэтому в моем тестовом наборе, когда я хочу замедление сети, я создаю файл, а когда я хочу удалить замедление, я удаляю его. (И у меня есть код очистки, который удаляет его между тест.) Теоретически я бы предпочел использовать переменные для этого, чем файл, но проблема в том, что переменные повторно инициализируются с каждым запросом. Поэтому мы не можем иметь location
блок, который установил бы переменную для поворота предела, а другой-для его выключения. (Это первое, что я попытался, и это не удалось из-за времени жизни переменных). Вероятно, можно было бы использовать модуль Perl или Lua для сохранения переменных или возиться с cookies, но я решил не спускать их маршруты.
важное замечание:
смешивать директивы из
echo
модули (типаecho_sleep
иecho_exec
) с директивами запаса nginx, которые приводят к производству ответа. У меня изначально былоecho_sleep
вместе сproxy_pass
и получил плохие результаты. Вот почему у нас естьlocation /proxy/
блок, который отделяет директивы запаса отecho
вещи. (См. вопрос для подобного конфликта решается путем разделения блока.)два
echo_exec
директивы, внутри и снаружиif
, необходимы из-за того, какif
строительство.на
internal
директива запрещает клиентам напрямую запрашивать/proxy/...
URL-адреса.
Я изменил конфигурацию nginx для использования limit_req_zone
и limit_req
ввести задержки. Следующее снижает скорость обслуживания до 20 запросов в секунду (rate=20r/s
). Я установил burst=1000
чтобы мое приложение не получало 503 ответа.
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;
[...]
server {
[...]
location / {
limit_req zone=one burst=1000;
[...]
}
}
}
документация здесь. Я не считаю, что есть способ указать равномерную задержку с помощью этого метода.