У меня есть несколько сайтов PHP, которые я хочу разделить с точки зрения разрешений. Поэтому я создал нового пользователя и настроил пул PHP для этих пользователей. Рассмотрим конфигурацию ниже:
php
nginx
/srv/http
, доступный как для php, так и для nginx./srv/http/index.php
читается php, но не читается nginx.fastcgi_stuff
содержит основные параметры fastcgi для установки заголовков, настройки серверной части и т. д. Предположим, что корневой веб-каталог для статических файлов и файлов 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
работай. См. Также ссылку выше.