Назад | Перейти на главную страницу

Как проверить наличие нечитаемых файлов перед их передачей на сервер fastcgi?

У меня есть несколько сайтов PHP, которые я хочу разделить с точки зрения разрешений. Поэтому я создал нового пользователя и настроил пул PHP для этих пользователей. Рассмотрим конфигурацию ниже:

Приведенный ниже nginx.conf содержит основы этой конфигурации, он помещен в server директива:

server_name example.com;
root /srv/http;

index index.php;
location ~ \.php$ {
    include fastcgi_stuff;
}

Если я прошу http://example.com/ с указанной выше конфигурацией страница загружается должным образом. Для http://example.com/does.not.exist, Я получаю 404, как и ожидалось.

Чтобы предотвратить передачу несуществующих файлов в PHP-FPM, я попытался добавить одну из следующих строк:

    try_files $uri =404;
    if ( !-e $request_filename ){ return 404; }

Оба не работают так, как рекламируется, он пытается открыто файлы вместо проверки существования, выполнив stat() вызов. Я подтвердил это, проверив исходный код и запустив strace на рабочем процессе.

Это один из основных случаев, с которыми у меня возникли проблемы, другой случай, когда я скрываю расширение и поэтому помещаю try_files $uri.php =404 в блоке локации. Какие-либо предложения?

Nginx пытается открыть файл, потому что у меня disable_symlinks on;. Соответствующий исходный код находится в core / ngx_open_file_cache.c, функция ngx_file_info_wrapper. (звонил из ngx_open_cached_file, из ngx_http_script_file_code).

Если disable_symlinks установлен на off, nginx выполняет простой вызов статистики (ngx_file_info typedef'd для stat на * nix). когда disable_symlinks установлено другое значение (например, on), он пытается открыть файл способом, безопасным для гонок символических ссылок, а затем выполняет fstat() вызвать дескриптор открытого файла. Поскольку nginx не может откройте файл для чтения, так как у него нет на это прав, он не работает.

Краткосрочное решение - включить символические ссылки снова используя disable_symlinks off, долгосрочным решением является изменение функций для перехода к содержащему каталогу, а затем fstatat() файл в этом каталоге. Не забудьте отключить символические ссылки для каталогов, которые не содержат сценариев PHP, но доступны для записи пользователем PHP.


Как упоминалось на http://forum.nginx.org/read.php?2,225152,234724#msg-234724, это поведение задокументированный:

В системах, которые не поддерживают открытие каталогов только для поиска, использование этих параметров требует, чтобы рабочие процессы имели разрешения на чтение для всех проверенных каталогов.

Я загрузил патч что позволяет ограничивать символические ссылки и при этом делать try_files или if работай. См. Также ссылку выше.