Rails send_file не работает с файлами размером более 400 МБ
Это мой первый раз, когда я устанавливаю приложение Rails на Windows Server. Я использовал Helicon Zoo, чтобы настроить приложение rails на компьютере с Windows Server 2008. Это заняло некоторое время, но я почти полностью запустил приложение.
Моя проблема заключается в загрузке файлов выше 400 МБ.
В моем приложении rails я использую следующее для отправки файлов клиенту:
приложение / контроллеры /hosted_files_controller.rb
class HostedFilesController < ApplicationController
before_filter :authenticate_user!
around_filter :catch_not_foun
def download
@footprint = UserAbility.new(current_user).footprints.find(params[:id])
send_file path
end
private
def path
if @footprint.subpath?
@path = "#{HOSTED_FILES_PATH}\\#{@footprint.subpath}\\#{@footprint.filename}"
else
@path = "#{HOSTED_FILES_PATH}\\#{@footprint.filename}"
end
end
def catch_not_found
yield
rescue ActiveRecord::RecordNotFound
recover_and_log "We couldn't find that record.", "No record found using the id (#{params[:id]})"
rescue ActionController::MissingFile
recover_and_log "We couldn't find the file on our server.", "The file was not found at the following path: #{@path}"
end
def recover_and_log (displayed, logged)
logger.info "!!! Error: #{logged}"
redirect_to root_url, alert: displayed
end
end
Я закомментировал config.action_dispatch.x_sendfile_header в файле production.rb, так как я не использую Apache или Nginx.
Это прекрасно работает для всех файлов на сервере, размер которых ниже ~400 МБ. После этого я получаю 500 внутренних ошибок сервера от зоопарка Helicon, который говорит следующее:
Helicon Zoo module has caught up an error. Please see the details below.
Worker Status
The process was created
Windows error
The pipe has been ended. (ERROR CODE: 109)
Internal module error
message: ZooApplication backend read Error.
type: ZooException
file: Jobs\JobBase.cpp
line: 566
version: 3.1.98.508
STDERR
Empty stderr
Кто-нибудь знает, что происходит? Я в недоумении.
Я пробовал:
- увеличение значения buffer_size для send_file (не работает)
- поиграть с настройками памяти в IIS для пула приложений (не работает)
- изменить x_sendfile_header на X-Sendfile и X-Accel-Redirect (не работает)
Я рассматриваю попытку установить Apache на Windows Server и использовать x_sendfile_header для разгрузки отправки файла в Apache, но я боюсь испортить уже (почти) работающее приложение.
У кого-нибудь есть идеи как это исправить?
1 ответ
По умолчанию в текущей версии Helicon Zoo Ruby приложения устанавливаются как соединитель FastCGI Ruby Rack. Поскольку протокол FastCGI является протоколом блокировки, он может иметь некоторые ограничения по времени ожидания или максимальному размеру запроса. Если вам нужно отправить большие файлы, я предлагаю вам вместо этого пойти по пути "Ruby 1.9 Rack over HTTP with Thin". Я полагаю, вы следовали инструкциям Ruby on Rails (2.3.x и 3.xx). Теперь просто следуйте дополнительным шагам из Ruby Rack по HTTP с инструкцией Thin, например, запустив команду "gem install thin" и отредактировав web.config следующим образом:
In the < handlers> section comment out two lines that follows
< !-- Ruby 1.9 over FastCGI -->
Uncomment two lines that follows
< !-- Ruby 1.9 over HTTP, using Thin as a back-end application server -->
In the <environmentVariables> section uncomment line
< !-- Use this APP_WORKER with HTTP Ruby engine and Thin. Thin need to be installed.
< add name="APP_WORKER" value="GEM_HOME\bin\thin start" />
Другим решением, поскольку вы уже используете продукты Helicon, будет установка Helicon Ape, которая обеспечивает поддержку заголовка HTTP-заголовка X-Sendfile (см. Документацию), как в Apache, и бесплатна для нескольких сайтов на сервер. Это решение было бы еще лучше, поскольку для отправки данных будет использоваться низкоуровневый код WinHTTP, что уменьшит нагрузку на сервер и повысит скорость отклика.