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