Назад | Перейти на главную страницу

Проблема с безопасным обслуживанием статического содержимого через nginx X-Accel и rails send_file

Я пытаюсь обслуживать статическое содержимое через nginx и рельсы, используя X-Accel-Redirect. Мой фактический директорт статического контента расположен в корневой папке rails, например rails_root\books. Это мой файл конфигурации nginx, отображающий URL-адрес с фактическим расположением файла

server {
        listen       3000;
        server_name  127.0.0.1;
        passenger_enabled on;
        root    /home/voodoo/work/reader/public;

        location ~ /read/*./.* {
          internal;
          alias /home/voodoo/work/reader/books/sources/$1/$2;
        }

        location / {
          proxy_redirect    off;

          proxy_set_header  Host              $http_host;
          proxy_set_header  X-Real-IP         $remote_addr;
          proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;

          passenger_pass_header X-Accel-Redirect;
          passenger_set_cgi_param  HTTP_X_ACCEL_MAPPING   /read/=/home/voodoo/work/reader/books/sources/;

          proxy_pass http://127.0.0.1:3001/;
        }

    }

И соответствующий контроллер рельсов

 class ReaderController < ApplicationController
        def resource
           send_file "#{Rails.root}/books/sources/"+ params[:id] + "/" + params[:resource] + "." + params[:format]
        end
 end

Контроллер успешно запущен с X-Accel-redirect от nginx, а контроллер возвращает данные. Это журнал

Started GET "/reader/229/OPS/cover.xml" for 127.0.0.1 at 2013-01-13 00:17:10 +0530
Processing by ReaderController#resource as XML
  Parameters: {"id"=>"229", "resource"=>"OPS/cover"}
Client Ip Address 127.0.0.1
Sent file /home/voodoo/work/reader/books/sources/229/OPS/cover.xml (0.2ms)
Completed 200 OK in 7ms (ActiveRecord: 0.5ms)
cache: [GET /read/229/OPS/cover.xml] miss

Но следующий журнал совсем другой, и здесь запрос останавливается.

Started GET "/home/voodoo/work/reader/books/sources/229/OPS/cover.xml" for 127.0.0.1 at 2013-01-13 00:17:10 +0530

ActionController::RoutingError (No route matches [GET] "/home/voodoo/work/reader/books/sources/229/OPS/cover.xml"):
  actionpack (3.2.2) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (3.2.2) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.2) lib/rails/rack/logger.rb:26:in `call_app'
  railties (3.2.2) lib/rails/rack/logger.rb:16:in `call'
  actionpack (3.2.2) lib/action_dispatch/middleware/request_id.rb:22:in `call'

Выдает ошибку RoutingError (Нет маршрута, соответствующего [GET] (фактический путь к файлу). После некоторого рытья я обнаружил, что эта ошибка может произойти из-за config.serve_static_assets = false в production.rb. Но на самом деле это правда в моей конфигурации.

Я тестировал смену пассажира в автономном режиме и с nginx. Я всегда получаю одну и ту же ошибку. Я полностью поражен здесь. Кто-нибудь может мне помочь?