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