Я создал простой скрипт загрузки на php, который берет файл, отправленный из формы, и помещает его в желаемый каталог. Проблема в том, что по какой-то причине, когда вы пытаетесь показать этот файл в браузере, сервер отвечает сообщением 403 - Forbidden. Фактически, я изменил сценарий, поэтому он сначала делает копию файла из папки tmp, а затем перемещает его с другим именем:
copy($_FILES['photo']['tmp_name'],$new_file_name);
move_uploaded_file($_FILES['photo']['tmp_name'], 'm_'.$new_file_name);
Таким образом, если я загружаю file.jpg, он создает file.jpg (скопировано) и m_file.jpg (перемещено). На сервере оба файла находятся в одной папке и выглядят одинаково, с одинаковыми разрешениями, пользователем и группой, за исключением того, что domain.com/file.jpg показывает изображение, а domain.com/m_file. jpg возвращает ошибку 403.
Если я отключу nginx и заставлю его работать с apache, все будет нормально. Я пересмотрел файлы конфигурации nginx, но в них нет ничего странного (на самом деле используется конфигурация по умолчанию)
Обновление: странным образом кажется, что проблема проявляется только в конфигурациях, где версия PHP выше 5.3 и выполняется как «приложение fpm, обслуживаемое nginx». Таким образом, он отлично работает с 5.3.3, но не работает с php 5.5 или 7, если вы не запустите его как «приложение fastCGI, обслуживаемое Apache».