limit_conn в Nginx

12
F
На сайте с 01.07.2009
Offline
79
2543

Добрый день! Кто-нибудь может подсказать как сделать рабочей вот такую конструкцию.В документации написано, что внутри IF limit_conn не работает.Есть какие-нибудь другие варианты?

if ($http_user_agent !~* (YandexBot|Google|Rambler|Aport|Mail) ) {

#limit_conn one 2;

}

V
На сайте с 25.07.2006
Offline
128
#1

Очевидное, что приходит в голову - это сделать внутренний рерайт на специальную localtion с прописанным limit_conn.

Впрочем, лучше таки оптимизировать сайт, чтобы боты его не валили... Ведь в этом проблема?

Приватный linux-администратор
F
На сайте с 01.07.2009
Offline
79
#2

Я хочу ограничить пользователя в скачивание более одного файла одновременно, так же как и открытие нескольких страниц сайта одновременно. А вот поисковым ботом наоборот не создавать каких-либо ограничений. Ведь бот может бегать сразу по нескольким страницам, а nginx ему отдаст 503 ошибку, это не есть гуд.Проблема в том, что юзеры скачивают файлы пачками, надо разрешить им только одно одновременно,а так же запретить открытие больше 3 страниц с одного IP.

Himiko
На сайте с 28.08.2008
Offline
560
#3

Используйте limit_req и нормальное значение burst.

Тогда никаких 503 не будет, будет только замедление открытия страниц до нужного вам количества в секунду.

Профессиональное администрирование серверов (https://systemintegra.ru). Круглосуточно. Отзывы (/ru/forum/834230) Лицензии (http://clck.ru/Qhf5) ISPManager,VDSManager,Billmanager e.t.c. по низким ценам.
F
На сайте с 01.07.2009
Offline
79
#4

Google сильно реагирует на скорость открытия страницы, поэтому данный способ не подходит.Я так понимаю ограничить соединение по IP, не трогая поисковых ботов не возможно?

Himiko
На сайте с 28.08.2008
Offline
560
#5

Попробуйте так:

server {

error_page 418 = @nolimit;

if ($http_user_agent !~* (YandexBot|Google|Rambler|Aport|Mail) ) {

return 418;

}

location / {

limit_conn one 2;

...

}

location @nolimit {

...

}

}

F
На сайте с 01.07.2009
Offline
79
#6

Я не разбираюсь в nginx.Что нужно прописать в location @nolimit? Если оставить пустым, сайты висят и не загружаются.

Himiko
На сайте с 28.08.2008
Offline
560
#7

Тоже самое, что и в location /

Только без строки limit_conn

Кстати, замените if ($http_user_agent !~* (YandexBot|Google|Rambler|Aport|Mail) ) на if ($http_user_agent ~* (YandexBot|Google|Rambler|Aport|Mail) )

zexis
На сайте с 09.08.2005
Offline
388
#8

Предпалагаю что сделать ограничение на количество коннектов по значению юзерагента – не возможно в принципе.

Так как сначала клиент подключается к серверу, а уже после подключения передает заголовки HTTP запроса со значением юзерагента.

F
На сайте с 01.07.2009
Offline
79
#9

Проверил на своём ip адресе if ( $remote_addr ~* 'IP' ) конструкция работает.Большое спасибо.

Возник ещё один вопрос, пока что пользователи выкачивают файлы,сайт тоже не работает. Можно ли сделать ограничение не на весь сервер а например на определённые файлы (flv|mp4) и т.д? И есть ли возможно вместо 503 ошибки, показывать определённую страницу, чтобы пользователь знал по какой причине он не может продолжить просмотр?

fiper добавил 01.11.2011 в 11:36

Предполагаю что сделать ограничение на количество коннектов по значению юзерагента – не возможно в принципе.

Не зря же на хакере выложили подобную конструкцию.

# Блокируем менеджеры загрузки

if ($http_user_agent ~* LWP::Simple|BBBike|wget) {

return 403;

}

# Блокируем некоторые типы ботов

if ($http_user_agent ~* msnbot|scrapbot) {

return 403;

}

Himiko
На сайте с 28.08.2008
Offline
560
#10
fiper:

Возник ещё один вопрос, пока что пользователи выкачивают файлы,сайт тоже не работает. Можно ли сделать ограничение не на весь сервер а например на определённые файлы (flv|mp4) и т.д? И есть ли возможно вместо 503 ошибки, показывать определённую страницу, чтобы пользователь знал по какой причине он не может продолжить просмотр?

server {

error_page 418 = @nolimit;

error_page 503 /503.html;

location ~* ^.+\.(flv|mp4)${

if ($http_user_agent !~* (YandexBot|Google|Rambler|Aport|Mail) ) {

return 418;

}

limit_conn one 2;

root /бла-бла-бла;

}

location @nolimit {

root /бла-бла-бла;

}

}

И создать нужный файл 503.html

Можно даже подменить ответ сервера, чтобы не было ошибки 503, а она заменялась на стандартный ответ сервера 200.

error_page 503= 200 /503.html

Himiko добавил 01.11.2011 в 11:50

fiper:
Не зря же на хакере выложили подобную конструкцию.

# Блокируем менеджеры загрузки
if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
return 403;
}
# Блокируем некоторые типы ботов
if ($http_user_agent ~* msnbot|scrapbot) {
return 403;
}

Речь была именно про лимит коннектов, а не блокировка по юзерагенту.

12

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