limit_req в Nginx: позволяет ограничивать доступ к определенным файлам, скриптам или каталогам задавая возможную частоту обращений.
Также доступ можно полностью запретить для ресурсов, к которым не должны обращаться пользователи и индексирующие боты поисковых систем.
limit_req в Nginx
limit_req используется для ограничения доступа (скорости обработки запросов), но не их полного запрета. Директиву можно добавить в секции http и server и location nginx.conf
Чтобы директива работала Nginx должен быть собран с модулем gx_http_limit_req_module. Проверить это можно выполнив nginx -V. В выводе должно присутствовать имя модуля.
Для limit_req в nginx существует две важные опции: zone и rate, а также ряд дополнительных.
- zone — позволяет определить зону разделяемой памяти. Имя зоны может быть любым, после двоеточия в ее описании указывается объем, например 10m
- rate — задает максимальный размер всплеска запросов, обычно указывается в запросах в секунду
- burst — указывает максимальное количество запросов, при превышении burst запросы будут завершаться северной ошибкой
Если количество поступающих запросов превышает определяемые директивой пределы их обработка будет задерживаться до тех пор пока не достигнуто значение, указанное в директиве burst (при ее наличии).
nodelay может использоваться вместо rate и будет означать, что задерживать трафик не нужно.
Следующие правила ограничат количество возможных запросов с одного адреса до 30 в секунду.
limit_req_zone $binary_remote_addr zone=flood:10m rate=30r/s;
limit_req zone=flood nodelay
Подробно использование limit_req рассмотрено в документации
Запрет доступа в Nginx
Для одного файла это можно сделать просто указав его имя в директиве location конфигурационного файла Nginx
location /administrator.php {
deny all;
}
Также можно прописать расширения и возвращать при обращению к файлу с одним из расширений ошибку 404.
location ~ \.(js|css|png|psd| crt| key| swf|ico|pdf|mov|fla|zip|rar |sql)$ {
try_files $uri =404;
}
На практике важным является запрет на доступ к файлам с расширением .sql, обозначающему дамп базы данных.
Часто при переносе сайтов дампы оставляются в корневом каталоге сайта, откуда они могут быть скачаны роботами или вручную. Так добавление расширения в location с запретом позволит избежать кражи данных из базы даже если sql дамп был оставлен в корне сайта.
Директиву deny можно использовать задавая ip адреса, с которых нужно запретить обращения.
В качестве единственного параметра передается ip адрес.
Например:
deny 123.123.123.123;
Когда директива добавлена с веб-сервер перезапущен посетитель с указанным ip адресом обращаясь к сайту получит ошибку 403. Доступ таким образом можно закрыть для всего сайта задав директиву в блоке server. Можно закрыть доступ к определенному каталогу или скрипт выделив его при помощи location (как в примерах выше).
Также можно добавлять запрет по другим характеристикам запросе, не только по адресу.
На скриншоте ниже блокировка по user agent:
Подробнее про структуру конфигурационных файлов и контексты.