Конфигурация Capistrano и XSendFile

Я пытаюсь настроить рабочий сервер Rails с Apache 2.2, Passenger 4.0.59 и XSendFile 0.12. Приложение развернуто через Capistrano.

Развернутое приложение создает (возможно, большой) PDF-файл в #{Rails.root}/tmp и обслуживает этот файл, используя send_file.

Проблема в том, что Capistrano использует символические ссылки для указания на текущую развернутую версию приложения. XSendFile, с другой стороны, разыменовывает символические ссылки и отказывается обслуживать файл, если его реальное местоположение находится вне корня документа, даже если это разрешено XSendFilePath. В журнале error.log Apache указано:

(20023)The given path was above the root path: xsendfile: unable to find file: /resolved/path/to/file.pdf

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

Как мне настроить параметры развертывания Capistrano и XSendFile, чтобы они работали вместе?

Я попробовал решения с ln -nFs, описанные в Capistrano & X-Sendfile и в mod_xsendfile с символическими ссылками, но ни один из них не работает.


person wrzasa    schedule 04.03.2015    source источник


Ответы (1)


Наконец-то мне удалось заставить его работать. Несколько советов тем, у кого возникнут проблемы с XSendFile

  1. Я установил XSendFilePath для пользователя $HOME, на пути к $HOME нет симлинков, так что это работает. Я могу принять это с точки зрения функциональности и безопасности, но это, очевидно, обходной путь.
  2. Имейте в виду, что XSendFilePath чувствителен к путям, содержащим несколько косых черт /like//this. Я использую макросы Apache, и при объединении параметраXSendFilePath из нескольких параметров макроса я добавляю несколько устаревших косых черт. Это заставило XSendFile отказаться от отправки файлов.

Удачи!

person wrzasa    schedule 04.03.2015