Rails3 + Nginx: обслуживание файлов с помощью send_file (m4v) - PullRequest
1 голос
/ 14 марта 2012

Я использую Rails3 с Nginx.

Я обслуживаю файлы через контроллер: загружает действие.

class BannersController < ApplicationController
  ... # authentication
  def uploads
    send_file '{localFilePath}', :disposition => 'inline'
  end
end

Я раскомментирую эту строку

config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx

в средах / production.rb.

Я также определил mime-тип 'm4v' внутри моих инициализаторов / mime_types.rb

Mime::Type.register "video/mp4", :m4v
MIME::Types.add(MIME::Type.from_array("video/mp4", %(m4v)))

Моя конфигурация nginx выглядит следующим образом

http {
  ... # ruby-1.9.3-p0
  include mime.types;
  default_type application/octet-stream;
  sendfile on;
  keepalive_timeout  65;
  gzip on;
  server {
    client_max_body_size 30M;
    listen 80;
    server_name ...
    root ...
    passenger_enabled on;
    rails_env production;
    location ~ ^/(assets)/ {
      root ...
      gzip_static on;
      expires max;
      add_header Cache-Control public;
    }
  }
}

Когда я запрашиваю видеофайл http://{ip}/components/{id}/content/host_bg.m4v, я вижу ошибки в моей консоли chrome (один запрос выдает 4 строки) enter image description here

Как я могу это исправить? Я думаю, что моя конфигурация nginx не завершена. Обратите внимание, что я могу воспроизводить видео, но оно не обрабатывается должным образом (например, javascript HTML5 jPlayer может воспроизводить видео только один раз, после чего оно останавливается, повтор работает из других мест http). Спасибо!

1 Ответ

0 голосов
/ 14 марта 2012

Я добавил

passenger_set_cgi_param HTTP_X_ACCEL_MAPPING /var/www/=/files/;
location /files/ {
  internal;
  alias /var/www/;
}

в мой файл конфигурации nginx, и он работает.

...