O Nginx tenta abrir o arquivo porque eu tinha disable_symlinks on;
. O código-fonte relevante está no core / ngx_open_file_cache.c, function ngx_file_info_wrapper
. (chamado de ngx_open_cached_file
, de ngx_http_script_file_code
).
Se disable_symlinks
estiver definido como off
, nginx fará uma chamada de estatística simples ( ngx_file_info
é digitado para stat
em * nix). Quando disable_symlinks
é definido como algo diferente (por exemplo, on
), ele tenta abrir o arquivo de forma segura contra as corridas de links simbólicos e, em seguida, executa uma chamada fstat()
no descritor de arquivo aberto. Como o nginx não pode abrir o arquivo para leitura, pois não tem permissões para isso, ele falha.
A solução de curto prazo é habilitar links simbólicos novamente usando disable_symlinks off
, uma solução de longo prazo é modificar as funções para atravessar o diretório contido e, em seguida, fstatat()
o arquivo nesse diretório . Lembre-se de desativar links simbólicos para diretórios que não contêm scripts PHP, mas que podem ser gravados pelo usuário PHP.
Como mencionado no link , esse comportamento é documentado :
On systems that do not support opening directories for search only, the use of these parameters requires that worker processes have read permissions for all checked directories.
Eu carreguei um patch que permite você para restringir links simbólicos e ainda fazer try_files
ou if
funcionar. Veja também o tópico vinculado acima.