Оживлю немного канал заметкой о том, как можно сымитировать подачу нагрузки с разных IP-адресов для JMeter и не только. Тут речь про HTTP
Далее копия сообщения https://hottg.com/qa_load/96296/125780
А есть ли в системе балансировщик нагрузки или proxy, который и принимает подключения от клиентов? Nginx, haproxy, ...
Если балансировщик/прокси есть, то за ним один backend-сервер или несколько?
Если несколько серверов на стороне сервера приложений, то балансировщик как выполняет балансировку - по ip-address (реальному адресу или заголовку X-Forwarded-For и/или X-Real-IP), по sticky session (cookie), просто рандомом (round robin)
Если выполняет по ip-address (или по X-Forwarded-For заголовку от клиента с адресом), то есть ли ограничения на подключения от балансировщика до одного сервера приложений? Они меньше чем 5000 подключений?
Если ограничения меньше 5000 подключений, то будет возможность просто их увеличить, не навредив серверу?
Было 50 подключений к серверу, а все остальные ждали в очереди в течение 60 секунд, а теперь будет 5000.Или увеличить таймаут, что может навредить самому тесту (тест будет не тестировать, а ждать)
Было 50 подключений к серверу, а все остальные ждали в очереди в течение 60 секунд, а теперь будут ждать 600 секунд.
Если простые правки настроек не подходят, то будет ли возможность добавить в конфигурацию балансировщика адреса нагрузочной станции (одной), как proxy-сервер верхнего уровня, чтобы эта нагрузочная станция (Apache.JMeter) сама присылала в заголовках запроса заголовки X-Forwarded-For и X-Real-IP с разными ip-адресами (один адрес на каждый сценарий, не на каждый отдельный запрос), а балансировщик доверял этим заголовкам?
Вот так выполняется настройка для nginx
http://nginx.org/en/docs/http/ngx_http_realip_module.html
https://www.nginx.com/resources/wiki/start/topics/examples/forwarded/
в настройку
set_real_ip_fromсервера nginx добавляется ip-адрес нагрузочной станции с Apache.JMeter и nginx начинает думать, что Apache.JMeter это не клиент, а тоже балансировщик, вышестоящий балансировщик, через который приходят запросы реальных клиентов
set_real_ip_from 192.168.0.100;
set_real_ip_from 192.168.0.0/24;
set_real_ip_from ::1;
set_real_ip_from 127.0.0.1;
Для haProxy
https://www.haproxy.com/documentation/haproxy-configuration-tutorials/client-ip-preservation/add-x-forward-for-header/
option forwardfor
Также настройки для работы с внешними прокси есть и в самих серверах приложений. Но такие настройки нужны для других security-фильтров. Если бы такие настройки срабатывали, то был бы ответ не Connection Timeout, а HTTP Code 429. Добавлю их, так как немного связано с этой же темой
Для Python и Symfony
https://symfony.com/doc/2.2/components/http_foundation/trusting_proxies.html
Request::setTrustedProxies(array('192.168.0.100', '192.168.0.0/24', '::1', '127.0.0.1'));
В Scala/Java и Play Framework
https://www.playframework.com/documentation/2.7.x/HTTPServer
play.http.forwarded.trustedProxies=["192.168.0.100", "192.168.0.0/24", "::1", "127.0.0.1"]
В Java Spring Boot + Tomcat
https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/html/howto-security.html#howto-enable-https
https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/valves/RemoteIpValve.html
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto
server.tomcat.internalProxies="192\.168\.0\.100"
By default, 10/8, 192.168/16, 169.254/16, 127/8, 100.64/10, 172.16/12, and ::1 are allowed.У параметра internalProxies приоритет выше, чем у trustedProxies:
https://github.com/apache/tomcat/blob/10.0.x/java/org/apache/catalina/filters/RemoteIpFilter.java#L800-L832
Надо разбираться, как работает только internalProxies, без trustedProxies и их комбинация
А заголовки
X-Forwarded-For
X-Real-IP
можно добавить через HTTP Header Manager в JMeter
значения можно делать, например, такие
44.77.111.${__jexl3( ${__threadNum} % 200 )}
>>Click here to continue<<
