On Mon, Apr 16, 2012 at 7:00 PM, Anfernee Gui <anfer...@gmail.com> wrote:
> 最近开始接触nginx的源代码,因为我们想在nginx中添加对于websocket
> proxy的支持。我看到您在nginx上有许多非常出色的工作,而我所以给您写信向您请教。
>
或许可以参考姚伟斌同学的这个模块的实现?或者可以直接复用?
https://github.com/yaoweibin/nginx_tcp_proxy_module
> 似乎目前nginx的工作方式是,nginx先得到整个request (如果request太大就存在文件里),然后init upstream, send
> to upstream, 从upstream recv header,发回给client,如果response
> body是多个chunk,则分块发回给client (如果buffering =
> off,则读一块发一块)。对于websocket而言,可能request部分改动比较大,client在初始化socket之后,会往socket里面不停的发送数据。我的想法是可能需要改动 ngx_http_request,
> ngx_http_upstream 等文件,在某些情况下不要finalize request, 或者close
> connection,继续读client。当然还有很多细节没有考虑到。我想请教一下,第一,这个思路是不是正确,第二,怎么样能尽量少改动nginx的核心代码,最好是就加一个module就可以了,能尽量少一点影响nginx核心流程。谢谢您了。
>
当然,WebSocket 被设计成可以和 HTTP/HTTPS 协议保持兼容从而可以共享一个端口(比如 80 端口),所以直接修改
nginx http 基础设施还是有意义的。或许只需要很小的改动就可以让现有的 nginx http 支持 web socket.
我觉得只需要对 nginx 核心以及 ngx_lua 模块作很小的改动,就可以让 ngx_lua 模块支持
WebSocket,后面得空时我自己做一些小尝试 :)
> 还有就是看到您lua module的cosocket,是不是可以借助您的lua module,写一些lua code做到同样的事情。
>
是的。理论上是可能的。目前 ngx_lua 对下游 TCP 连接也封装了一个 cosocket 对象,不过目前是只读的,仅作为 HTTP
请求体的读取界面。或许我们可以扩展一下这个对象,让它直接支持无限制的读写,这样就变身为 websocket
对象了,嘿嘿。当然,我可能低估了其中涉及的一些细节的难度,可以实际尝试一下 :)
ngx_lua 的 cosocket,无论是上游还是下游实现,都是不走 ngx_http_upstream 的,它们二者之间是平行关系,见下图:
http://agentzh.org/misc/slides/libdrizzle-lua-nginx/#57
Best regards,
-agentzh
P.S. 我同时抄送给了 openresty 邮件组:https://groups.google.com/group/openresty
(欢迎加入,从国内访问可能需要翻墙)