nginx X-Accel介绍
May 1, 2018
背景
项目需要,提供一个对外的文件下载服务,详细需求点如下:
- 需要对接多个客户
- 各个客户要求的数据格式不同,内容不同
- 客户间权限隔离
- 文件可能较大
方案
文件下载的第一方案自然想到了nginx,ip、流量控制等nginx都只要配置就可以实现,但似乎无法做好各个客户间的权限隔离(当然localtion隔离也可以,但维护成本比较大)。搜索之后了解到了nginx的X-Accel
X-accel allows for internal redirection to a location determined by a header returned from a backend.
X-Accel比较特殊的地方是利用upstream返回的头部信息进行对应处理。常见的配置方式如下:
[text]
http {
server {
listen 80;
server_name [your-domain.com](http://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;
}
}
}
注意interval保证了文件不能直接被外部访问,只能用于内部跳转,upstream的返回中通过X-Accel-Redirect指定真实的跳转文件名。
在cgi中我们可以根据实际情况做一些安全检查、验证、统计等。如针对我们的实际场景,校验请求方ip、签名是否有效,可以对每家客户做到权限的隔离。
See all postsSee all posts