ab -k -c 1000 -n 10000 site.com/
выполняет 1000 запросов параллельно, пока не будет выполнено в общей сложности 10 000 запросов.
Это слишком жестоко. Вполне вероятно, что ни клиент, ни сервер не настроены на обработку тысяч подключений за несколько секунд.
Настройте конфигурацию nginx и проведите осторожный тест ab -k -c 5 -n 500 site.com/
limit_req_zone $http_cf_connecting_ip zone=ip:10m rate=3r/s;
limit_req zone=ip;
limit_conn_status 429;
limit_req_status 429;
429 Too Many Requests
Это настраивает nginx для возврата стандартного кода состояния 429 Too Many Requests , когда запросы отклоняются из-за ограничения скорости.
nginx возвращает ошибка 503
по умолчанию (плохое значение по умолчанию) означает, что приложение не работает, но оно не дает сбоев, оно ограничено по скорости. Важно правильно настроить код состояния, чтобы различать guish между ошибками сервера и ограничением скорости.
Cloudflare и IP-адрес клиента
Если за облачным флэш-памятью, nginx не увидит IP клиента, но IP-адрес сервера Cloudflare. Можно подумать, что он нарушает ограничение скорости по IP, но это не совсем так.
При локальном тестировании с ab ваш тестовый компьютер разрешает только несколько серверов cloudflare. , и ab
вероятно использует только первый IP. Так что нет большого количества IP-адресов клиентов, ограничение скорости должно работать нормально.
В рабочем состоянии разные клиенты будут получать доступ через разные серверы Cloudflare. Тем не менее, не так много серверов и клиентов Cloudflare в географической c области, скорее всего, будут обращаться к одним и тем же серверам Cloudflare. Таким образом, будет множество разных IP-адресов, которые несколько побеждают ограничение скорости, но, вероятно, не так много.
> nslookup mycloudflaresite.com
Name: mycloudflaresite.com
Addresses: 104.28.14.125
104.28.15.125
2606:4700:3037::681c:e7d
2606:4700:3036::681c:f7d
Cloudflare помещает исходный IP-адрес клиента в заголовок CF-Connecting-IP
. Это также может быть в заголовке X-Forwarded-For
или X-Real-Ip
или True-Client-IP
в зависимости от настроек и запросов. См. https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-
Следовательно, приведенная выше конфигурация ограничивает скорость по клиентскому IP с помощью заголовка CF-Connecting-IP
. Переменная nginx $binary_remote_addr
будет IP-адресом сервера cloudflare.
Не используйте X-Forwarded-For
для ограничения скорости
Заголовок X-Forwarded-For
может управляться клиентом. Его не следует использовать для ограничения скорости, поскольку его легко обойти.
Пример с клиентом, имеющим IP-адрес 100.11.22.33
:
- По запросу без
X-Forwarded-For
header => Cloudflare устанавливает X-Forwarded-For: 100.11.22.33
и CF-Connecting-IP: 100.11.22.33
по запросу. - По запросу с уже установленным заголовком
X-Forwarded-For: dummyvalue
=> CloudFlare устанавливает X-Forwarded-For: dummyvalue,100.11.22.33
и CF-Connecting-IP: 100.11.22.33
по запросу.
Как видите, для клиента тривиально указать случайное значение для каждого запроса и полностью обойти любое ограничение скорости, основанное на заголовке X-Forwaded-For
.