Сообщение «Отсутствует заголовок X-Accel-Mapping» в журнале ошибок Nginx - PullRequest
9 голосов
/ 04 июня 2011

Я работаю на сайте Rails 3 в Ubuntu 8.04 с Nginx 1.0.0 и Passenger 3.0.7.

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

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

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

Ответы [ 2 ]

15 голосов
/ 19 сентября 2011

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

Я использую Nginx + Пассажир 3 + Рельсы 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, но затем мне нужно использовать 1031 * метод, который будет использовать 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 раз быстрее, чем раньше, и в журналах не отображается никаких ошибок.

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

1 голос
/ 14 ноября 2012

Мы использовали метод, аналогичный описанному 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.

...