在MogileFS中使用nginx代替perlbal实现internal redirect
成浩漫
2023-12-01
从文档 http://www.danga.com/words/2007_06_usenix/usenix.pdf , 47页, 我们可以看到客户端浏览器最终是通过perlbal这个proxy server直接访问mogilefs storage server上的文件的(想法非常的妙!)。
我不熟悉perlbal, 想使用nginx等高性能的服务器该怎么办?当然,perlbal的性能也是很好的。
perlbal使用了internal redirect的方式来reproxy, 这种方式在apache, lighttpd, nginx中都有实现。由于nginx的proxy性能很突出,所以这里只研究了一下nginx的运作方式。
nginx相关文档: http://wiki.codemongers.com/NginxXSendfile
实验:
1. 192.168.0.1 部署tomcat, 监听8080端口 在webapps/ROOT/目录下创建文件test.jsp, 内容为
<%
String filename = request.getParameter("filename");
response.addHeader("X-Accel-Redirect","/download/" + filename);
%>
2. 192.168.0.2 部署nginx, 监听80端口, 配置文件中加入
location / {
proxy_pass http://192.168.0.1:8080;
}
location /download {
internal;
rewrite ^/download/(.*) /$1 break;
proxy_pass http://192.168.0.3;
}
3. 192.168.0.3 部署任意一种web server
现在, 我访问: http://192.168.0.2/test.jsp?filename=test.rar ,系统会产生如下效果:
1. 192.168.0.2 把 这个request proxy到192.168.0.1
2. 192.168.0.1 做了个简单的处理 在response header中加入名字为: X-Accel-Redirect, 内容为: /download/test.rar的header
3. 192.168.0.2收到192.168.0.1的response后,再把request reproxy到 192.168.0.3, 并且url rewrite 为 http://192.168.0.3/test.rar
4. 192.168.0.3 把 test.rar response 给 192.168.0.2
5. 192.168.0.2 把 得到的response返回给客户端浏览器。
因此,对于47页这个图,我们可以把图中的mod_perl改为tomcat, 使用 mogilefs java client得到文件在storage server上的url.
比如: 有两个storage server, 192.168.0.11(dev1) 192.168.0.12(dev2), 注意不同的storage server有不同的存储目录。通过java client我们可以得到url为: http://192.168.0.11/dev1/00/00/00000000, 但只把uri部分/dev1/00/00/00000000放入header中。
nginx proxy中可以配置:
location /dev1 {
internal;
proxy_pass http://192.168.0.11;
}
location /dev2 {
internal;
proxy_pass http://192.168.0.12;
}
在storage server上,也可以部署lighttpd等高性能web server, 只要把端口错开。
这样配置有个缺点, 如果有100个storage server, 只能在nginx中配置100个location. 除了自己写一个模块外(不好写啊),我想不出有什么办法可以添加storage server而不修改nginx配置文件。