LINUX.ORG.RU
ФорумAdmin

nginx как сделать лимит запросов на все сайты?

 


0

1

допустим 100 в минуту.
допустим у меня 40 сайтов и чтоб в каждый конфиг не вписывать это как то можно сделать?

в апаче это делается просто evasive и все работает. в nginx не гугл не gpt не смог помочь.

проверяю через из стороннего сервера.
ab -n1000 -c50 https://123.com/


кто будет давать ссылку https://blog.nginx.org/blog/rate-limiting-nginx это тоже не работает я хз почему.
И там вариан с конкретным сайтом что мне не надо

добавлял в nginx.conf

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

на сайте одном (а мне на все надо) 


в логах на порт веб сервера запросы валят и ип сервера отправлящего запросы отображается верно.
server {
    location / {
...
        limit_req zone=mylimit;
...
    }
}


так же пробовал через иптаблес
iptables -A INPUT -p tcp --dport 80 -m recent --set &&
iptables -A INPUT -p tcp --dport 80 -m recent --update --seconds 60 --hitcount 300 -j REJECT --reject-with tcp-reset &&
iptables -A INPUT -p tcp --dport 443 -m recent --set &&
iptables -A INPUT -p tcp --dport 443 -m recent --update --seconds 60 --hitcount 300 -j REJECT --reject-with tcp-reset


ОШИБКА: iptables v1.8.7 (nf_tables): RULE_APPEND failed (Invalid argument): rule in chain INPUT
какой инвалид аргрумент он утаивает

tcpdump запросы отображает все корректно


вобщем как я понял нет модуля with-http_limit_req_module
как его добавить? без компиляции? он у меня из apt



Последнее исправление: Regacar (всего исправлений: 5)

Если nginx -t не ругается на конфиг, значит все необходимые модули имеются.

Сравни вывод ab для двух вариантов конфига nginx

первый вариант с «limit_req zone=mylimit;»

второй вариант с «limit_req zone=mylimit nodelay;»

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s; ограничивает rps на 1 адрес (клиента). Если ты хочешь просто ограничить число запросов к cвоим сайтам, то ключ для limit_req_zone нужно заменить на что-то постоянное типа $server_addr.

У тебя nf_tables эмулирует iptables. Не факт, что recent там работает.

Через «update-alternatives --config iptables» выбери iptables-legacy

То, что ты написал про iptables - полная лажа т.к. ты ограничиваешь число пакетов, а не запросов. Как минимум, эти правила должны применяться к новым соединениям (-m conntrack --ctstate NEW).

vel ★★★★★
()
Ответ на: комментарий от vel

Добавлю, что лимиты на запросы через файрволл вообще не особо полезны т.к. в одном соединении может быть много запросов, а если http2 - то очень много и параллельных.

firkax ★★★★★
()

Чтобы работал сразу на все сайты, просто пропиши limit_req не в локацию а в корневой блок http { }. Но это после того как исправишь то что выше писали.

И лимит будет общим для всех. Сделать независимые 10 запросов к первому сайту и другие 10 ко второму - надо делать каждому сайту свою зону (limit_req_zone). Но скорее всего это тебе не важно.

firkax ★★★★★
()

вобщем как я понял нет модуля with-http_limit_req_module

Не угадал. Тогда бы nginx не взлетел с новым конфигом

допустим у меня 40 сайтов и чтоб в каждый конфиг не вписывать это как то можно сделать?

почитать документацию

https://nginx.org/en/docs/http/ngx_http_limit_req_module.html

Syntax: 	limit_req zone=name [burst=number] [nodelay | delay=number];
Default: 	—
Context: 	http, server, location

хочешь в location добавляй, хочешь - прямо в http

И про вывод ab был правильный вопрос. Лимиты в nginx работают просто и надежно, ты где-то что-то не так делаешь. Может конфиг не применил, может повесил лимит на один server, а запросы шлешь к другому. И один из вариантов - не так понять вывод ab

router ★★★★★
()
Ответ на: комментарий от vel

2024/08/06 20:06:49 [error] 4504#4504: *660 limiting requests, excess: 0.020 by zone «mylimit», client: 111.222.222.111, server: site.ru, request: «GET / HTTP/1.0», host: «site.ru»

вот таких куча сообщений *660 цифра растет но запросы идут все равно.

Regacar
() автор топика
Ответ на: комментарий от Regacar

цифра растет но запросы идут все равно.

rate=10r/s;

Конечно, идут :) секунда прошла, следующие 10 запросов nginx позволит. Кстати, тебя наверняка заинтересует параметр burst в limit_req

router ★★★★★
()