Re: error_page 404 и ngx_http_index_module
Maxim Dounin
mdounin at mdounin.ru
Mon Aug 25 12:47:25 UTC 2014
Hello!
On Fri, Aug 22, 2014 at 10:10:13PM +0300, Gena Makhomed wrote:
[...]
> location / {
> error_page 404 = @php;
> log_not_found off;
> }
>
> location @php {
> fastcgi_param SCRIPT_FILENAME /home/www/example.com/engine/index.php;
> include /etc/nginx/fastcgi_params;
> fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
> }
> }
>
> www.example.com - это динамика, и $uri для 99.999% запросов к этому
> домену оканчиваются символом '/', например: /support/ или /about/
>
> В каталоге static.www лежит всего несколько файлов, которые должны
> быть на домене www.example.com - favicon.ico, robots.txt, sitemap.xml,
> googlexxxxxxxxxxxxxxxxxx.html и yandex_xxxxxxxxxxxxxxxxxxxx.html,
> а вся остальная статика для сайта www.example.com раздается
> с отдельного домена example.com
>
> Модуль ngx_http_index_module в nginx - сейчас неотключаемый.
> В результате, в 100% случаев модуль ngx_http_index_module тратит
> ресурсы сервера впустую, пытясь открыть заведомо не существующие
> индексные файлы.
Just for record: приведённая конфигурация не будет работать, если
индексных файлов нет. Для URI, заканчивающихся на "/", выдаётся
403 в случае, если обработчик не найден (и логгируется сообщение
"directory index of ... is forbidden" в error_log), так что в
директиву error_page надо добавить 403.
Кроме того, в данном конкретном случае я бы не пытался делать
fallback, а вместо этого сделал location'ы под существующую
статику по списку. Чтобы не пытаться открывать "заведомо не
существующие файлы".
> Каким способом будет более правильно отключить модуль
> ngx_http_index_module ? сделать workaround
> через регулярное выражение:
>
> location / {
> location ~ /$ {
> return 404;
> }
> error_page 404 = @php;
> }
>
> Или путем патча, который добавляет возможность полного отключения
> этого модуля через указание в конфиге директивы "index off;" ?
>
> http {
> index off;
> ...
> server {
> ...
> location / {
> error_page 404 = @php;
> }
> }
> }
>
> - тогда сразу возвращается 404 для всех uri, оканчивающихся слэшом ('/')
> без попыток что-либо искать ни диске и без необходимости применять
> регулярные выражения для каждого клиентского запроса к сайту.
С точки зрения эффективности - самым правильным способом будет
убрать fallback из схемы вообще, см. выше. Отключения индексов
тем или иным способом - это в любом случае полумеры. Но если
делать именно для индексных файлов, то я бы сделал так:
location ~ /$ {
fastcgi_pass ...
}
Сделать возможность полного отключения индексов - можно, но
практика показывает, что обычно есть решение лучше.
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru