加载中…
个人资料
力想之地
力想之地
  • 博客等级:
  • 博客积分:0
  • 博客访问:36,468
  • 关注人气:1
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

Rails在nginx和passenger环境下的X-Accel-Redirect配置和使用

(2013-05-01 17:54:17)
标签:

nginx

passenger

x-accel-redirect

分类: RoR

1,rails应用中设置

config/environments/production.rb添加设置:

config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'

 

2,nginx站点配置中,添加如下设置:

server {

    ...

    proxy_set_header  X-Accel-Mapping   /your/uploads/path/=/download_files/;
    passenger_set_cgi_param HTTP_X_ACCEL_MAPPING /your/uploads/path/=/download_files/;
    passenger_pass_header X-Accel-Redirect;
    location /download_files/ {
        internal;
        alias   /your/uploads/path/;
    }

    ...

}

其中“/your/uploads/path/”是上传文件存储的根路径,“download_files”是映射的路径名,只要不和其他路由冲突就行,“internal”确保外部客户端不能直接请求此路径。

 

工作原理:

1,客户端(如浏览器)发出请求,下载一个文件

   /download/my/attachments/pics.zip

2,nginx接收请求,并在http头中加入头信息

 X-Accel-Mapping: /your/uploads/path/=/download_files/

3,nginx通过passenger传递请求到rails,调用相应的controller( action)

match '/download'=>'download#index'

4,在action中,使用send_file

send_file '/your/uploads/path/my/attachments/pics.zip'

5,Rack根据rails设置,config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect',不会将文件作为response body返回给请求,而是在response头中添加“X-Accel-Redirect”字段,使用nginx配置文件中设置的映射路径,代替实际路径

X-Accel-Redirect:  /download_files/my/attachments/pics.zip

6,nginx从rails接收到response头信息,根据设置,nginx转换为实际的文件路径

7,nginx响应文件下载(如果文件路径没有问题的话)


---2015-05-04-------------

最新版passenger(5.0.7)的配置有所不同,passenger_set_cgi_param指令已经被移除。正确的配置方式为:

    passenger_set_header  X-Accel-Mapping   /your/uploads/path/=/download_files/;
    passenger_pass_header X-Accel-Redirect;

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有