nginx rate limit для целой страницы?

12
L
На сайте с 13.03.2010
Offline
93
1361

Приветствую. Интересует, можно ли сделать, чтобы кол-во запросов при использовании rate limit per ip в nginx считалось только для всей страницы, а не с учетом каждого подгружаемого ресурса в странице?

Например, есть страница site.ru/index.php, при загрузке данной страницы начинают грузится:

site.ru/style.css

site.ru/img1.jpg

site.ru/img2.jpg

и тд. В итоге каждый подгружаемый элемент нужно учитывать при задании значения rate limit, а т.к. у разных страниц чаще всего разное кол-во подгружаемых элементов, данный модуль становится довольно бесполезным, т.к. приходится задавать большие значения с запасом.

Или, можно ли задавать rate limit для всех ресурсов на странице сразу? Например, чтобы любые ресурсы на странице, включая саму страницу, можно было бы загружать не более 3 раз в секунду? Тогда было бы плевать на их число.

Оптимизайка
На сайте с 11.03.2012
Offline
396
#1

limit_req задается на уровне URL ("location")

просто правильно пропишите соотв. location'ы, в некоторых задавайте параметр, а в некоторых нет

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

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
L
На сайте с 13.03.2010
Offline
93
#2
Оптимизайка:
limit_req задается на уровне URL ("location")

просто правильно пропишите соотв. location'ы, в некоторых задавайте параметр, а в некоторых нет

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

Можно более подробнее или примеры? Я задал rate limit 3 для статик файлов, в итоге этот лимит действует для каждого расширения, и если на странице более 3 картинок, 4ая не грузится. Т.е. это также бесполезно. А rate limit для .php вообще не работает. У меня тысячи директорий, я не могу задавать каждой свой лимит.

Оптимизайка
На сайте с 11.03.2012
Offline
396
#3

Вообще location поддерживает регулярные выражения, не нужно перечислять "тысячи директорий". Все работает и для .php и для чего угодно, т.к. nginx без разницы что там стоит за location'ом.

Приведите свой конфиг nginx, посмотрим.

L
На сайте с 13.03.2010
Offline
93
#4
Оптимизайка:
Вообще location поддерживает регулярные выражения, не нужно перечислять "тысячи директорий". Все работает и для .php и для чего угодно, т.к. nginx без разницы что там стоит за location'ом.

Приведите свой конфиг nginx, посмотрим.

Мне нужно ограничить число запросов до каждого подгружающегося ресурса на странице, но чтобы для каждого ресурса был свой счетчик запросов, а не общий на все ресурсы страницы. Как я понял, на nginx даже такого примитива сделать нельзя? Что толку ограничить запросы к .php/.html, если ддосер может найти какую нибудь картинку весом 2 метра и начать запрашивать ее по 50 раз в сек - nginx в случае ограничения 50 r/s ничего не увидит, потому что он как раз уложится в эти 50 запросов, ведь грузить он будет 1 файл всего.

Пока что я вижу полезность этого модуля только если у вас сайт-одностраничник, где всегда одно и тоже число подгружаемых ресурсов.

A
На сайте с 19.07.2010
Offline
130
#5

l1mon, а посидеть немного и разобраться, вместо того чтобы возмущаться?..

статику отдаем без лимитов, т.к. нагрузка при отдаче статики минимальна (или поставьте на статику отдельные более высокие лимиты).

все остальное с лимитами, кусок рабочего конфига:


location / {
limit_req zone=zreq burst=15;
access_log /var/log/nginx/mysite.log main;
proxy_pass http://$ssl_backend;
proxy_redirect ~^(https?://[^:]+):\d+(/.+)$ $1$2;
}
location ~* ^.+\.(jpg|jpeg|gif|ico|png|swf|css|js)$ { # добавьте сюда, что еще не хотите считать
access_log off; error_log /dev/null;
expires 20d;
proxy_pass http://$ssl_backend; # если статика на том же сервере, отдавайте ее сразу, т.е. без бекенда и без кеширования
proxy_cache c4;
}
.............
L
На сайте с 13.03.2010
Offline
93
#6
admak:
l1mon, а посидеть немного и разобраться, вместо того чтобы возмущаться?..

статику отдаем без лимитов, т.к. нагрузка при отдаче статики минимальна (или поставьте на статику отдельные более высокие лимиты).
все остальное с лимитами, кусок рабочего конфига:

Спасибо, что отозвались. А что может относится к остальному? Просто не совсем понимаю как будут учитываться обращения к php. Что, если на странице инклюдится несколько php файлов, 2 например? Получается при обращении к странице будет выполняться 3 запроса к .php файлам, а не 1? Не понимаю какие значения ставить даже примерно.

L
На сайте с 13.03.2010
Offline
93
#7

И можно ли сделать наоборот, указать location - html|htm|php и задать им, например, 3 запроса в секунду, а для всего остального / - уже 50? Это будет работать? Есть ли еще какие НЕстатические файлы? Или только html и php?

A
На сайте с 19.07.2010
Offline
130
#8
l1mon:
Что, если на странице инклюдится несколько php файлов, 2 например? Получается при обращении к странице будет выполняться 3 запроса к .php файлам, а не 1? Не понимаю какие значения ставить даже примерно.

инклуды - это файловые операции, php напрямую открывает файлы, без участия веб сервера, т.е. к вебсереру будет 1 запрос.

сразу ставьте большие лимиты, сами открывайте разными браузера свой сайт и смотрите логи, если знаете, что файл статический, то добавляйте его в "статический" локейшен. (еще svg, woff. но лучше сами смотрите логи и настраивайте под конкретный сайт/сайты).

когда настроите - уменьшайте лимиты и смотрите логи.

l1mon:
И можно ли сделать наоборот, указать location - html|htm|php и задать им, например, 3 запроса в секунду, а для всего остального / - уже 50? Это будет работать? Есть ли еще какие НЕстатические файлы? Или только html и php?

работать то будет..., но как Вы отследите обращения к корню сайта, к его директориям (т.е. без расширения).

"Есть ли еще какие НЕстатические файлы?" - зависит от сайта, например на одном проекте у меня .jpg не статический, т.е. формируется на лету. :)

L
На сайте с 13.03.2010
Offline
93
#9
admak:
инклуды - это файловые операции, php напрямую открывает файлы, без участия веб сервера, т.е. к вебсереру будет 1 запрос.
сразу ставьте большие лимиты, сами открывайте разными браузера свой сайт и смотрите логи, если знаете, что файл статический, то добавляйте его в "статический" локейшен. (еще svg, woff. но лучше сами смотрите логи и настраивайте под конкретный сайт/сайты).
когда настроите - уменьшайте лимиты и смотрите логи.



работать то будет..., но как Вы отследите обращения к корню сайта, к его директориям (т.е. без расширения).

"Есть ли еще какие НЕстатические файлы?" - зависит от сайта, например на одном проекте у меня .jpg не статический, т.е. формируется на лету. :)

Спасибо. Могу ли я сделать отдельный список статик расширений для кеша (expires 7d), а второй для rate limit? Не будет ли конфликта?

Например:

location jpg|png|css|js|

expires 7d

location jpg|png|css|js|ico|txt|pdf...

limit_req ...

A
На сайте с 19.07.2010
Offline
130
#10

будет конфликт, используйте внутри локейшена "if"

location ~* ^.+\.(jpg|jpeg|gif|ico|png|swf|css|js)$ {

if ($uri ~ ^.+\.(jpg|png|css|js)$) {
expires 7d;
}
...
}
12

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