Использование 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, но я решил не спускать их маршруты.

важное замечание:

  1. смешивать директивы из echo модули (типа echo_sleep и echo_exec) с директивами запаса nginx, которые приводят к производству ответа. У меня изначально было echo_sleep вместе с proxy_pass и получил плохие результаты. Вот почему у нас есть location /proxy/ блок, который отделяет директивы запаса от echo вещи. (См. вопрос для подобного конфликта решается путем разделения блока.)

  2. два echo_exec директивы, внутри и снаружи if, необходимы из-за того, как if строительство.

  3. на 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;
            [...]
        }
    }
}

документация здесь. Я не считаю, что есть способ указать равномерную задержку с помощью этого метода.