9

我正在使用 Nginx 1.0.0 和 Passenger 3.0.7 在 Ubuntu 8.04 上运行 Rails 3 站点。

在我的 Nginx error.log 中,我开始看到X-Accel-Mapping header missing很多消息。谷歌搜索将我带到Nginx docsRack::Sendfile的文档和文档。

现在,可以通过多个域访问我的应用程序,并且我send_file在我的应用程序中使用它来提供一些特定于请求它们的域的文件,例如,如果你来domain1.com/favicon.ico我在public/websites/domain1/favicon.ico. 这很好用,我认为我不需要/不想让 Nginx 参与并创建一些私有区域来存储这些文件,正如Rack::Sendfile文档中的示例所建议的那样。

我怎样才能摆脱错误信息?

4

3 回答 3

15

此消息意味着为您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

通过 Rails 2.3 使用 x-sendfile 通过 Nginx 提供大文件

我有控制器,它将/download/1请求映射到具有自己的目录结构的存储文件,例如:storage/00/00/1storage/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 倍,并且日志中没有显示错误。

希望这可以帮助。

于 2011-09-19T12:17:02.660 回答
1

我们使用了与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 处理的静态。

于 2012-11-14T11:01:21.810 回答
0

我按照本手册做了

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;
    }
于 2021-05-07T13:14:25.917 回答