Есть связка nginx и apache. Всё вроде хорошо, пока дело не касается больших файлов (500мб+)
Гугление показало, что обычно это решается размещением файла локально на сервере с nginx, но как быть, если сервер с nginx и с apache — это разные сервера? Понятно, что nfs тут решает, но это как-то костыльно. Возможно ли заставить nginx выдавать поток напрямую из apache?
>криво выглядит… хочется единообразия, но похоже всё сведётся к варианту с nfs…
криво выглядит отдавать из аппача через nginx — отдавай напрямую
кривой вариант с nfs
> Что мешает там где стоит апач — поставить nginx и отдавать файл напрямую с него?
Это вообще ничего не решит. Энджиникс на фронтенде продолжит складывать ответ энджинкса с бекенда на диск и отдавать уже с него.
Что подразумевается под «поток из apache»?
В принципе, если отдача идёт не из пхп (а если да, то это, имхо, ошибка при проектировании), то либо переносить статику на сервер с nginx, либо тот самый NFS.
В сторону proxy_cache смотрите. Настройте его правильно.
Скорее всего, у вас большие файлы кэшируются. И так как на памяти у нас принято экономить — то кешируется она на диск. А вот тут вступает в действие самая плохая черта всех современных серверов — очень медленные диски.
Как раз ничего такого криминального тут нет, закешируется статика на диск на стороне фронтэнда, и будет замечательно отдаваться, не дёргая бекэнд. Ну и не забывайте про кеш FS. Не обязатльно при этом отдача будет с медленного диска.
У меня стоит nginx и apache на одном сервере.
Работает по достаточно стандартной схеме: все запросы принимает nginx, а потом динамический контент передаёт дальше на apache через proxy_pass, а статический обрабатывает сам nginx.
>Возможно ли заставить nginx выдавать поток напрямую из apache?
nginx это и делает
1) не отдавай большие файлы из аппача через nginx, отдавай напрямую
2) храни большие файлы там — откуда ты их собираешься отдавать
если nginx и apache на разных серверах, то подними еще один nginx на том сервере, где лежит контент
3) если тебе нужно защитить каким-то образом доступ к файлам через скрипт — используй соответствующие модули: ngx_http_accesskey_module
4) если нужно сделать загрузку файла, то используй соответствующие модули: ngx_http_upload_module
Nginx должен отдавать огромные фалы напрямую с диска (даже если это nfs), это не имеет смысла обсуждать. Любая попытка отдавать энджиниксу большой файл чем-то еще (без разницы, чем) приводит к складыванию этого файла на диск во временную папку и отдачи уже оттуда.
Наконец дошли руки — в общем сделал всё по nfs и всё теперь отлично работает. Поднимать ещё один nginx — делать ещё один домен на каждом сайте и очень можно заморачиваться с логикой.