利用Nginx的X-Accel-Redirect头实现下载控制(附带php和rails实例)
2008-02-16 21:58
776 查看
有时你可能需要实现控制下载:即将下载文件的请求转发到某脚本, 然后由这脚本决定怎么做:发送这个文件给用户,出现决绝访问页,或着其他的事。在lighttpd服务器里可以通过从脚本传回X-Sendfile头实现;而Nginx是通过使用X-Accel-Redirect头实现的。在这篇文章里我会尽量简捷地描述在php和rails里如何使用这一特性。
假设你使用Apache运行PHP或Rails产生动态内容,而用Nginx作为前台反向代理(bianbian注:反向代理又称为服务器加速(Server accelerate),原理是将用户的请求转发到目标服务器,然后将结果转发给用户。好处有很多:保护目标服务器安全、负载均衡容易实现、有点类似防火墙;坏处我认为就是要传递用户的IP的时候多了些步骤)。你就达到了两个目标:
因为Nginx服务器会改善所有对动态内容的缓慢请求,能节省服务器的资源(细节正在
这里). (bianbian注:凭我对Nginx的理解,这个就是Nginx会缓存客户端的请求,等全部发送完毕了才一起转发给后台脚本,比如在上载文件的时候。好处是减少后台脚本等待的时间,确实对性能有一定改善;坏处就是在脚本里时时显示上载进度的功能是不可能实现了[当然,以后Nginx如果自己开放这个进度API也是可能的,不过也不是脚本级的,好在显示进度的功能不常用])
你能对静态文件的下载做出控制.(bianbian注:后面的一大段都是说这个啦!)
在这里,假设网站位于 /var/www 目录,而一些静态文件(类似电影、歌曲、或其他)位于 /var/www/files 目录。Apache监听8080端口。
首先,让我们看一看nginx配置:
http {
....
server {
listen 80;
server_name your-domain.com;
location / {
rewrite ^/download/(.*) /down.php?path=$1 last;
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
location /files {
root /var/www;
internal;
}
}
}
关键字“internal”指明了哪些目录需要通过X-Accel-Redirect头与后台脚本进行内部转向。我们的脚本只需要完成下载控制的部分,至于分段下载等其他特性跟一般的静态文件一样,都由Nginx服务器实现。
这里是 down.php 的内容:
<?php
// 得到要下载的文件名
$path = $_GET["path"];
//...
// 这里完成权限校验、下载统计等等
//...
// 重定向完成下载
header("X-Accel-Redirect: /files/" . $path);
?>
在 Rails 里可以在控制(controller)里写如下代码(bianbian注:Rails是约定好的MVC架构):
# 得到要下载的文件名
path = @params["path"]
# ...
# 这里完成权限校验、下载统计等等
# ...
# 重定向完成下载
@response.headers['X-Accel-Redirect'] = "/files/" + path
这样就完成了!用上述方法我们就能创建非常灵活又极度高效的文件分发系统。
原文链接:Using X-Accel-Redirect Header With Nginx to Implement Controlled Downloads (with rails and php examples)
遵守创作共用协议,转载请注明来自bianbian coding life。谢谢合作
Related Posts
[原]安装nginx作为web服务器及反向代理
Nginx [engine x] is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server written by I...
[原]用perl写了个自动配置脚本
经常要安装各种包,而且每个包的configure参数千差万别;而且以后升级版本殮.
[译]nginx的worker_processes设为多少才合适?
搜索到原作者的话:一般一个进程足够了,你可以把连接数设得很大。如枮..
[原] PHP bug or Slackware bug? –enable-fastcgi always failed.
[原]nginx+FastCGI调试成功
This entry was posted on Thursday, April 5th, 2007 at 04:40:16 and is filed under Linux, Technology. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
April 8th, 2007 at 04:48:39
使用注意,有时候需要加上:
proxy_hide_header Content-Type;
bianbian Says:
April 8th, 2007 at 05:09:43
测试成功!!!请大家注意:
internal 关键字必须要有!internal指明了必须通过内部才能下载(避免直接输链接)。
如果忘记了internal,即使后台fastcgi输出X-Accel-Redirect也没有用!
那么,如果有些文件又允许直接下载,又允许fastcgi来转向下载怎么办呢?
还好linux有link文件,用“ln -s”建立一个软指向目录就可以了!
两个小时的血泪经验阿,晕倒~
王猛 Says:
April 9th, 2007 at 06:55:59
谢谢,我一直找X-SENDFILE做什么用的,在这里终于找到了答案。
虽然这里说的是Nginx的X-Accel-Redirect但是Apache的X-SENDFILE同样可以支持!
方法也是类似的!
http://celebnamer.celebworld.ws/stuff/mod_xsendfile/
假设你使用Apache运行PHP或Rails产生动态内容,而用Nginx作为前台反向代理(bianbian注:反向代理又称为服务器加速(Server accelerate),原理是将用户的请求转发到目标服务器,然后将结果转发给用户。好处有很多:保护目标服务器安全、负载均衡容易实现、有点类似防火墙;坏处我认为就是要传递用户的IP的时候多了些步骤)。你就达到了两个目标:
因为Nginx服务器会改善所有对动态内容的缓慢请求,能节省服务器的资源(细节正在
这里). (bianbian注:凭我对Nginx的理解,这个就是Nginx会缓存客户端的请求,等全部发送完毕了才一起转发给后台脚本,比如在上载文件的时候。好处是减少后台脚本等待的时间,确实对性能有一定改善;坏处就是在脚本里时时显示上载进度的功能是不可能实现了[当然,以后Nginx如果自己开放这个进度API也是可能的,不过也不是脚本级的,好在显示进度的功能不常用])
你能对静态文件的下载做出控制.(bianbian注:后面的一大段都是说这个啦!)
在这里,假设网站位于 /var/www 目录,而一些静态文件(类似电影、歌曲、或其他)位于 /var/www/files 目录。Apache监听8080端口。
首先,让我们看一看nginx配置:
http {
....
server {
listen 80;
server_name your-domain.com;
location / {
rewrite ^/download/(.*) /down.php?path=$1 last;
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
location /files {
root /var/www;
internal;
}
}
}
关键字“internal”指明了哪些目录需要通过X-Accel-Redirect头与后台脚本进行内部转向。我们的脚本只需要完成下载控制的部分,至于分段下载等其他特性跟一般的静态文件一样,都由Nginx服务器实现。
这里是 down.php 的内容:
<?php
// 得到要下载的文件名
$path = $_GET["path"];
//...
// 这里完成权限校验、下载统计等等
//...
// 重定向完成下载
header("X-Accel-Redirect: /files/" . $path);
?>
在 Rails 里可以在控制(controller)里写如下代码(bianbian注:Rails是约定好的MVC架构):
# 得到要下载的文件名
path = @params["path"]
# ...
# 这里完成权限校验、下载统计等等
# ...
# 重定向完成下载
@response.headers['X-Accel-Redirect'] = "/files/" + path
这样就完成了!用上述方法我们就能创建非常灵活又极度高效的文件分发系统。
原文链接:Using X-Accel-Redirect Header With Nginx to Implement Controlled Downloads (with rails and php examples)
遵守创作共用协议,转载请注明来自bianbian coding life。谢谢合作
Related Posts
[原]安装nginx作为web服务器及反向代理
Nginx [engine x] is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server written by I...
[原]用perl写了个自动配置脚本
经常要安装各种包,而且每个包的configure参数千差万别;而且以后升级版本殮.
[译]nginx的worker_processes设为多少才合适?
搜索到原作者的话:一般一个进程足够了,你可以把连接数设得很大。如枮..
[原] PHP bug or Slackware bug? –enable-fastcgi always failed.
[原]nginx+FastCGI调试成功
This entry was posted on Thursday, April 5th, 2007 at 04:40:16 and is filed under Linux, Technology. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
3 Responses to “[译]利用Nginx的X-Accel-Redirect头实现下载控制(附带php和rails实例)”
bianbian Says:April 8th, 2007 at 04:48:39
使用注意,有时候需要加上:
proxy_hide_header Content-Type;
bianbian Says:
April 8th, 2007 at 05:09:43
测试成功!!!请大家注意:
internal 关键字必须要有!internal指明了必须通过内部才能下载(避免直接输链接)。
如果忘记了internal,即使后台fastcgi输出X-Accel-Redirect也没有用!
那么,如果有些文件又允许直接下载,又允许fastcgi来转向下载怎么办呢?
还好linux有link文件,用“ln -s”建立一个软指向目录就可以了!
两个小时的血泪经验阿,晕倒~
王猛 Says:
April 9th, 2007 at 06:55:59
谢谢,我一直找X-SENDFILE做什么用的,在这里终于找到了答案。
虽然这里说的是Nginx的X-Accel-Redirect但是Apache的X-SENDFILE同样可以支持!
方法也是类似的!
http://celebnamer.celebworld.ws/stuff/mod_xsendfile/
相关文章推荐
- 利用Nginx的X-Accel-Redirect头实现下载控制(附带php和rails实例)
- Nginx 利用 X-Accel-Redirect response.setHeader 控制文件下载
- Nginx 利用 X-Accel-Redirect response.setHeader 控制文件下载
- 使用Nginx的X-Accel-Redirect实现大文件下载
- Nginx多站点虚拟主机实现单独启动停止php-fpm、单独控制权限设置
- php download.php实现代码 跳转到下载文件(response.redirect)
- php nginx用x-sendfile控制文件下载权限
- 利用discuz实现PHP大文件上传应用实例代码
- php实现当前页面点击下载文件的实例代码
- PHP实现文件上传下载实例
- php通过会话控制实现身份验证实例
- php的IMAP的应用实例(实现收发邮件、删除邮件、附件下载等功能,解决中文乱码问题)
- Nginx多站点虚拟主机实现单独启动停止php-fpm、单独控制权限设置
- 一个使用微软Azure blob实现文件下载功能的实例-附带源文件
- PHP实现文件上传与下载实例与总结
- 利用PHP+JS实现搜索自动提示(实例)
- 利用discuz实现PHP大文件上传应用实例代码
- PHP持续保有长连接,利用flush持续更新浏览器UI,下载进度条实现
- php实现当前页面点击下载文件的实例代码
- php利用curl实现多进程下载文件类