Как ограничить доступ к несуществующим файлам в nginx

В 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 с запретом позволит избежать кражи данных из базы даже если дамп был оставлен в корне сайта.

 

 

Директива limit_req в Nginx

limit_req используется для ограничения доступа (скорости обработки запросов), но не их полного запрета. Директиву можно добавить в секции http и server и location nginx.conf

Чтобы директива работала Nginx должен быть собран с модулем gx_http_limit_req_module

 

Для limit_req существует две важные опции: 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 рассмотрено в документации