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 mailing list
[email protected]
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить