Rails 5.2.1 Загрузка файлов ActiveStorage с помощью nginx / puma обрезается - PullRequest
0 голосов
/ 19 ноября 2018

Мой первый ActiveStorage проект работал нормально на разработке (только для puma), но на производстве (nginx / puma), у меня возникла проблема с загрузкой больших файлов, которые отображаются как усеченные файлы .

Например, загруженный файл размером 24,1 МБ дает 5 МБ (усеченный) файл для загрузки.

В основном я загружаю файлы PDF, загруженные файлы завершены (проверено на сервере) и предварительный просмотр работаетштраф.

Во всех средах используется config.active_storage.service = :local

config / storage.yml

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

URL-адрес загрузки создается с использованием rails_blob_path(document.doc, disposition: :inline)

IПодозреваю, что параметр или параметр в puma или nginx не позволяют загрузить полные файлы.На данный момент я не вижу ошибок в логах.

/ etc / nginx / sites-available / default.conf

upstream app {
    # Path to Puma SOCK file, as defined previously
    server unix:/home/deploy/rails/shared/sockets/puma.sock fail_timeout=0;
}

server {
        listen 80;

        root /home/deploy/rails/public;

        try_files $uri/index.html $uri @app;

        # Make site accessible from http://localhost/
        server_name localhost;

        location @app {
            proxy_pass http://app;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
        }

        error_page 500 502 503 504 /500.html;
        keepalive_timeout 10;
        client_max_body_size 4G;
}

Rails config / puma.rb

# Default to production
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env
# Change to match your CPU core count
if rails_env == 'production'
  workers 2
else
  workers 1
end

# Min and Max threads per worker
threads 1, 6

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"

if rails_env == 'production'
  # Set up socket location
  bind "unix://#{shared_dir}/sockets/puma.sock"

  # Logging
  stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true

  # Set master PID and state locations
  pidfile "#{shared_dir}/pids/puma.pid"
  state_path "#{shared_dir}/pids/puma.state"
  activate_control_app

  on_worker_boot do
    require "active_record"
    ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
    ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
  end
end

1 Ответ

0 голосов
/ 21 ноября 2018

Использование proxy_http_version 1.1;

По умолчанию nginx использует HTTP 1.0 для проксирования, который не поддерживает кодирование передачи по частям.

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version

...