Nginx + Rails + sendfile: файл не найден - PullRequest
0 голосов
/ 20 ноября 2018

В последнее время возникли проблемы с настройкой sendfile для nginx + rails.У нас есть один тип загрузки файлов, который уже обрабатывается nginx, и мы хотели добавить второе правило для работы с файлами другого типа в другом месте, но пока мы не добились успеха.

Контроллер Ruby:

def download_file
  send_file("/srv/www/myapp/shared/tmp/directory/file.zip")
end

Файл конфигурации среды:

Rails.application.configure do
  # ..  
  config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
  # ..
end

Конфигурация Nginx:

upstream myapp {
  server 127.0.0.1:9292;
}

server {
  listen 80;    
  server_name myapp.tld;

  client_max_body_size 10M;

  root /srv/www/myapp/current/public; 

  # This first block works perfectly
  location /__working_file {
    internal;
    alias /var/lib/myapp;
  }    

  # This second block does not work at all
  location /__new_files {
    internal;
    alias /srv/www/myapp/shared/tmp/directory;
  }

  location / {
    root /srv/www/myapp/current/public;
    try_files $uri @app;
  }

  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;

    proxy_set_header X-Sendfile-Type X-Accel-Redirect;
    # This first rule works perfectly
    proxy_set_header X-Accel-Mapping /var/lib/myapp/=/__working_file/;
    # This second rule doesn't
    proxy_set_header X-Accel-Mapping /srv/www/myapp/shared/tmp/directory/=/__new_files/;

    proxy_pass_header Server;
    proxy_read_timeout 300;

    proxy_pass http://myapp;
  }
}

Результат

При доступе к действию контроллера, send_fileкоманда запускается, тогда мы получаем «Файл не найден» в браузере, ничего не загружается, и журнал рельсов показывает это:

Sent file /srv/www/myapp/shared/tmp/directory/file.zip (0.4ms)
Completed 200 OK in 169ms (ActiveRecord: 37.5ms)
Started GET "/srv/www/myapp/shared/tmp/directory/file.zip" for 109.190.197.126 at 2018-11-20 11:34:44 +0100

ActionController::RoutingError (No route matches [GET] "/srv/www/myapp/shared/tmp/directory/file.zip"):

Файл существует и доступен для чтения, но nginx не может показатьсячтобы получить к нему доступ.Есть идеи?

Ответы [ 2 ]

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

Проблема заключается в том, как установлены два X-Accel-Mapping.Rack действительно может работать с несколькими отображениями с момента слияния этого PR # 1187 .

Однако, на сегодняшний день этот PR был объединен с основным, но еще не выпущен (2.0.6 в настоящее время является последней версией) .

Единственное, чтоправильный способ установки нескольких сопоставлений - использование одного правила proxy_set_header и разделение каждого сопоставления запятой, например:

proxy_set_header X-Accel-Mapping, /var/lib/myapp/=/__working_file/,/srv/www/myapp/shared/tmp/directory/=/__new_files/
0 голосов
/ 20 ноября 2018

при маршрутизации не получается.Вы должны предоставить правильный маршрут для работы.

...