Re: error_page 404 и ngx_http_index_module

Gena Makhomed gmm at csdoc.com
Tue Aug 26 19:22:45 UTC 2014


On 25.08.2014 15:47, Maxim Dounin 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.

Только я не весь конфиг процитировал, там есть еще и такой location:

     location = / {
         error_page 404 = @php;
         return 404;
     }

А для всех остальных URI, заканчивающихся на "/" - модуль index всегда
возвращает 404, потому что в каталоге /home/www/example.com/static.www/ 
нет соответствующих этим URI подкаталогов. Если бы каталог существовал,
но в нем не было бы индексного файла, тогда возвращался бы 403 статус.

> Кроме того, в данном конкретном случае я бы не пытался делать
> fallback, а вместо этого сделал location'ы под существующую
> статику по списку.  Чтобы не пытаться открывать "заведомо не
> существующие файлы".

Да, это лучший вариант. Только тогда придется делать генератор конфига,
и какой-то сервис, который будет по запросу перегенерировать конфиг
сайта и делать service nginx reload, потому что обновления сайта
выкладываются на сервер скриптом под пользователем www.

Пока что "location ~ /$ { return 404; }" - это вполне рабочий вариант,
который позволяет обойтись без генератора конфига nginx и без релоадов.

> С точки зрения эффективности - самым правильным способом будет
> убрать fallback из схемы вообще, см. выше.  Отключения индексов
> тем или иным способом - это в любом случае полумеры.

Да, при использовании Docker надо будет так и сделать, всеравно там
будет генерироваться новый контейнер для каждой новой версии сайта.

Благодарю за помощь!

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru