nginx и limit_req

[Удален]
1364

Как прописать конфиг nginx чтобы следующее правило не работало для определенных ip:

limit_req zone=lphp burst=150 nodelay;

M
На сайте с 16.09.2009
Offline
278
#1

Все просто.

Для этого можно, например, в качестве сессионной переменной (для limit_req_zone) - использовать не $binary_remote_addr, а какую-то свою ($my).

По-умолчанию - устанавливаете ее во что-то уникальное, например в удаленный хост и порт. Потом в блоке if - проверяете не принадлежит ли IP хоста к диапазонам, которые надо ограничить (тут можно модуль geo использовать). Если принадлежит - выставляете $my в значение $binary_remote_addr.

Ну а все остальное - как прежде.

Абонементное сопровождение серверов (Debian) Отправить личное сообщение (), написать письмо ().
[Удален]
#2
myhand:
устанавливаете ее во что-то уникальное, например в удаленный хост и порт.

Здесь нужно чтобы тогда $my была разной для каждого запроса (для списка белых айпи). Иначе что будет $my = $binary_remote_addr а что $my = 123.123.123.123:456 ограничение будет срабатывать, так как ограничение идет на сессию.

M
На сайте с 16.09.2009
Offline
278
#3
EvroHoster:
Здесь нужно чтобы тогда $my была разной для каждого запроса (для списка белых айпи). Иначе что будет $my = $binary_remote_addr а что $my = 123.123.123.123:456 ограничение будет срабатывать, так как ограничение идет на сессию.

Вы идею поняли? Нужно сделать $my уникальным выражением для белых айпи.

Но почему Вы считаете, что удаленный хост:порт - будет неуникальным выражением для активных сессий?

[Удален]
#4

limit_req_zone $my zone=newzone:10m rate=5r/s;

geo $white {

...

}

server {

set $my "123.123.123.123:456";

if ($white) {

set $my "$binary_remote_addr";

}

location / {

limit_req zone=newzone burst=150 nodelay;

}

}

Или я что-то всетаки неверно понял?

M
На сайте с 16.09.2009
Offline
278
#5
EvroHoster:
Или я что-то всетаки неверно понял?

Да все, наверно. Вы читать не научились пока, к сожалению.

Ну смотрите:

EvroHoster:

set $my "123.123.123.123:456";

А Вам пишут:

myhand:
По-умолчанию - устанавливаете ее во что-то уникальное, например в удаленный хост и порт.
Вы же - взяли и вбили совершенный бред (одинаковое значение для всех запросов).
iHead
На сайте с 25.04.2008
Offline
137
#6

http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html

$remote_addr, эта переменная равна адресу клиента;

$remote_port, эта переменная равна порту клиента;

при keepalive между запросами $remote_port внутри одного соединения будет неуникальным (т.е. постоянным).

думаю, надо еще чего-нибудь подмешать :)

Рекомендуемый хостинг партнер 1С-Битрикс (https://www.ihead.ru/bitrix/), PHP-хостинг (https://www.ihead.ru/php/), доверенный партнер RU-CENTER (https://www.ihead.ru/news/573.html), официальный представитель REG.RU в Кирове (https://www.ihead.ru/news/851.html)
M
На сайте с 16.09.2009
Offline
278
#7
iHead:
http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html
$remote_addr, эта переменная равна адресу клиента;
$remote_port, эта переменная равна порту клиента;

Ну да, только не эти переменные надо использовать. Одну я даже назвал. Вы - вторую ;)

iHead:

при keepalive между запросами $remote_port внутри одного соединения будет неуникальным (т.е. постоянным).
думаю, надо еще чего-нибудь подмешать :)

Да. "Подмешать" - надо знания о том, как работает HTTP вообще и nginx в частности. Вы через одно keepalive соединение можете одновременно передать два запроса?

[Удален]
#8

myhand, благодарю за помощь

iHead
На сайте с 25.04.2008
Offline
137
#9
myhand:
Ну да, только не эти переменные надо использовать. Одну я даже назвал. Вы - вторую ;)
Да. "Подмешать" - надо знания о том, как работает HTTP вообще и nginx в частности. Вы через одно keepalive соединение можете одновременно передать два запроса?

ну понятно, что binary_ памяти меньше требует.

одновременно не передать, а вот один за другим - да.

пишут, что одновременно можно передать несколько запросов при использовании keepalive, не дожидаясь ответа по каждому

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий