Сообщение X-Accel-Mapping отсутствует в журнале ошибок Nginx

Я запускаю сайт Rails 3 на Ubuntu 8.04 с Nginx 1.0.0 и Passenger 3.0.7.

В моем журнале ошибок Nginx я начал часто видеть сообщение X-Accel-Mapping header missing. Поиск в Google привел меня к документам Rack::Sendfile и к документы Nginx.

Теперь к моему приложению можно получить доступ через несколько доменов, и я использую send_file в своем приложении для доставки некоторых файлов, специфичных для домена, из которого они запрашиваются, например, если вы заходите на domain1.com/favicon.ico, я ищу значок в public/websites/domain1/favicon.ico. Это отлично работает, и я не думаю, что мне нужно/хочется привлекать Nginx и создавать какую-то частную область, где я храню эти файлы, как примеры в Rack::Sendfile docs предлагает.

Как я могу избавиться от сообщения об ошибке?


person Manuel Meurer    schedule 04.06.2011    source источник
comment
Привет @zoopzoop - ты когда-нибудь это понимал? У меня такая же проблема с моим приложением rails 3, размещенным на heroku (которое использует ngnix).   -  person Max Williams    schedule 30.06.2011
comment
Та же проблема и здесь. Пассажир 3.0.7, nginx 1.0.0, Ubuntu.   -  person randomguy    schedule 12.07.2011
comment
Нет, я еще не нашел решения.   -  person Manuel Meurer    schedule 20.09.2011


Ответы (3)


это сообщение означает, что Rack::Sendfile отключил X-Accel-Redirect для вас, потому что у вас отсутствует конфигурация для него в nginx.conf...

Я использую Nginx + Passenger 3 + Rails 3.1.

Собрав информацию с этих страниц, я понял это:

http://wiki.nginx.org/X-accel

http://greenlegos.wordpress.com/2011/09/12/sending-files-with-nginx-x-accel-redirect

http://code.google.com/p/substruct/source/browse/trunk/gems/rack-1.1.0/lib/rack/sendfile.rb?r=355

Обслуживание больших файлов через Nginx через Rails 2.3 Использование x-sendfile

У меня есть контроллер, который сопоставляет запросы /download/1 с файлами хранилища, которые имеют собственную структуру каталогов, например: storage/00/00/1, storage/01/0f/15 и т. д. Поэтому мне нужно передать это через Rails, но затем мне нужно использовать метод send_file, который будет использовать X-Accel-Redirect для отправки окончательного файл в браузер напрямую через nginx.

В коде у меня есть это:

send_file(
  '/var/www/shared/storage/00/00/01', 
  :disposition => :inline, 
  :filename => @file.name # an absolute path to the file which you want to send
)

Я заменил имя файла для этого примера

Теперь мне нужно было добавить эти строки в мой nginx.conf:

server {
    # ... 

    passenger_set_cgi_param HTTP_X_ACCEL_MAPPING /var/www/shared/storage/=/storage/; 
    passenger_pass_header X-Accel-Redirect;

    location /storage {
      root /var/www/shared;
      internal;
    }

    # ...
}

Путь /storage не виден извне, он только внутренний.

Rack::Sendfile получает заголовок X-Accel-Mapping, извлекает из него путь и заменяет /var/www/shared/storage на /storage.... Затем он выдает измененный заголовок:

X-Accel-Redirect: /storage/00/00/01

который затем обрабатывается nginx.

Я вижу, что это работает правильно, так как файл загружается в 100 раз быстрее, чем раньше, и в журналах не отображается никаких ошибок.

Надеюсь это поможет.

person Community    schedule 19.09.2011
comment
Это звучит здорово, но на самом деле мне это не помогает, поскольку, как я уже упоминал в своем вопросе, у меня нет и не хочу иметь одну папку со всеми файлами... некоторые из них хранятся в каталоге в моем приложении Rails, который используется совместно между развертываниями. , некоторые загружаются на лету откуда-то еще и сохраняются в папке tmp и т. д. Я просто хочу использовать send_file без необходимости создавать отдельную папку, содержащую все файлы. Возможный? - person Manuel Meurer; 20.09.2011
comment
Да, в этом случае вам нужно создать одно внутреннее местоположение для каждого из них... но я не знаю, каков формат X-Accel-Mapping для него... Или вы можете добавить это внутреннее местоположение, например знак равно - person Dalibor Filus; 20.09.2011

Мы использовали метод, аналогичный описанному NoICE, но я заменил «жестко закодированный» каталог, содержащий все файлы, регулярным выражением, описывающим папку, содержащую папки, содержащие файлы. .

Звучит тяжело, да? Просто взгляните на эти (/etc/nginx/sites-available/my.web.site):

location /assets/(.+-[a-z0-9]+\.\w+) {
    root /home/user/my.web.site/public/assets/$1;
    internal;
}

location /images/(.+)(\?.*)? {
    root /home/user/my.web.site/public/images/$1;
    internal;
}

Это следует использовать с этой проверкой:

location / {
    # ...

    if (-f $request_filename) {
        expires max;
        break;
    }

    # ...
}

чтобы предотвратить статику от обработки Rails.

person shybovycha    schedule 14.11.2012

делал по этому мануалу

https://mattbrictson.com/accelerated-rails-downloads

мой сервер отправляет путь к файлу /private_upload/file/123/myfile.txt, файл находится в /data/myapp-data/private_upload/file/123/myfile.txt

    # Allow NGINX to serve any file in /data/myapp-data/private_upload
    # via a special internal-only location.
    location /private_upload {
      internal;
      alias /data/myapp-data/private_upload;
    }

    # ---------- BACKEND ----------
    location @backend
    {
        limit_req zone=backend_req_limit_per_ip burst=20 nodelay;
        proxy_pass http://backend;
        proxy_set_header X-Sendfile-Type X-Accel-Redirect;
        proxy_set_header X-Accel-Mapping /=/; # this header is required, it does nothing
        include    /etc/nginx/templates/myapp_proxy.conf;
    }
person srghma    schedule 07.05.2021