5.6 subrequest使用的例子

下面以一个简单的例子说明subrequest的用法。场景很简单,当使用浏览器访问/query?s_sh000001时(s_sh000001是新浪服务器上的A股上证指数),Nginx由mytest模块处理,它会生成一个子请求,由反向代理模块处理这个子请求,访问新浪的http://hq.sinajs.cn服务器,这时子请求得到的响应包是上证指数的当天价格交易量等信息,而mytest模块会解析这个响应,重新构造发往客户端浏览器的HTTP响应。浏览器得到的返回值格式为:stock[上证指数],Today current price:2373.436,volumn:770。当然,如果传入的参数不仅是s_sh000001,也可以是任意新浪服务器识别的股票代码,如s_sh000009代表上证380。

这个例子说明如何生成子请求,以及子请求如何通过配置文件配置为反向代理服务器以访问新浪,并试图将新浪的返回内容全部保存在一块内存缓冲区中,最后解析缓冲区中的内容生成HTTP响应返回给浏览器等过程。这里的限制条件是内存缓冲区的大小要可以容纳完整的新浪服务器的响应,它实际上是由ngx_http_upstream_conf_t结构体内的buffer_size参数决定的(见5.3.1节),而对于反向代理模块来说,就是由nginx.conf文件中的proxy_buffer_size配置项决定的。如果新浪这样的上游服务器返回的HTTP响应大于缓冲区大小,请求将会出错,这时要么增大proxy_buffer_size配置的值,要么不能再选择反向代理模块访问上游服务器,而要自己使用upstream机制编写相应的HTTP模块解析上游服务器的响应包体。

5.6.1 配置文件中子请求的设置

若访问新浪服务器的URL为/list=s_sh000001,则可以这样配置:


location/list{

//决定访问的上游服务器地址是hq.sinajs.cn

proxy_pass http://hq.sinajs.cn;

//不希望第三方服务发来的HTTP包体进行过gzip压缩

proxy_set_header Accept-Encoding"";

}


当然,处理以/query开头的URI用户请求还需选用mytest模块,例如:


location/query{

mytest;

}