现在的位置: 首页nginx>正文
rss
用ngx_lua实现简单的网页编码转换网关
2011年12月31日 nginx 评论数 1 ⁄ 被围观 12,893 次+

借助 nginx proxy 模块我们可以给 ngx_lua 很方便地实现非阻塞 http 客户端功能,即使用一个被 proxy 模块处理的内部 location 作为 http client stub,然后通过 ngx_lua 中的 location.capture 接口调用它访问外部 url。当然为了能解析外部域名,还需要指定 nginx 的 resolver 地址以开启 proxy 模块的域名解析功能。

下面就是一个简单的网页编码转换网关的 nginx 配置(需要事先安装 lua-iconv模块):

nginx 配置代码

  1. http
  2. {
  3. ...
  4. #指定域名解析服务器地址
  5. resolver127.0.0.1;
  6. ...
  7. server
  8. {
  9. ...
  10. #httpclientstub
  11. location/http_client
  12. {
  13. internal;
  14. proxy_pass$arg_url;
  15. }
  16. location/web_iconv
  17. {
  18. content_by_lua'
  19. localfrom,to,url=ngx.var.arg_f,ngx.var.arg_t,ngx.var.arg_u
  20. localcapture=ngx.location.capture
  21. localprint=ngx.print
  22. localiconv=require("iconv")
  23. localcd=iconv.new(toor"utf8",fromor"gbk")
  24. localres=capture("/http_client?url="..url)
  25. localostr,err=cd:iconv(res.body)
  26. print(ostr)
  27. ';
  28. }
  29. ...
  30. }
  31. ...
  32. }

测试一下吧:

  1. $curl'http://localhost/web_iconv?f=gbk&t=utf8&u=http://www.baidu.com/'

当然,由于 nginx proxy 模块仅支持 http/1.0 协议,因此在负载很高的情况下(例如访问 rest api)效率并不高。后续我们将开发支持 http/1.1 协议的代理模块,实现 keep-alive 和 pipelining 等 http/1.1 高级特性,以便在 ngx_lua 中方便地进行高效率的外部 http 协议访问。

update: nginx proxy 模块在目标 url 不含路径时会默认使用父请求的路径,故在之前的例子里,如果 参数 u 是 http://www.baidu.com 而不是 http://www.baidu.com/,则 proxy 模块实际去请求的 url 将是 http://www.baidu.com/web_iconv?f=gbk&t=utf8&u=http://www.baidu.com ,显然这并非我们期望的结果。因此目前如果要借用 proxy 模块作为 http client,就必须显式指明目标 url 的路径。切记!

本文地址:/56/1002.html
如非注明则为本站原创文章,欢迎转载。转载请注明转载自:moon's blog
 

目前有 1 条留言 其中:访客:1 条, 博主:0 条

  1. 成都seo : 2012年04月25日11:20:14  1楼

    看不懂 :eek: